implemented captured windows stack
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11690 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -208,6 +208,7 @@ extern wxCursor g_globalCursor;
|
|||||||
// inside it
|
// inside it
|
||||||
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
|
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
|
||||||
static bool g_captureWindowHasMouse = FALSE;
|
static bool g_captureWindowHasMouse = FALSE;
|
||||||
|
static wxWindowList g_capturedWindows;
|
||||||
|
|
||||||
/* extern */ wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL;
|
/* extern */ wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL;
|
||||||
|
|
||||||
@@ -2474,6 +2475,8 @@ bool wxWindowGTK::Create( wxWindow *parent,
|
|||||||
|
|
||||||
wxWindowGTK::~wxWindowGTK()
|
wxWindowGTK::~wxWindowGTK()
|
||||||
{
|
{
|
||||||
|
wxASSERT_MSG( g_capturedWindows.IndexOf(this) == wxNOT_FOUND, wxT("trying to destroy window that didn't release focus") );
|
||||||
|
|
||||||
if (g_focusWindow == this)
|
if (g_focusWindow == this)
|
||||||
g_focusWindow = NULL;
|
g_focusWindow = NULL;
|
||||||
|
|
||||||
@@ -3751,19 +3754,17 @@ bool wxWindowGTK::SetFont( const wxFont &font )
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowGTK::CaptureMouse()
|
static void wxDoCaptureMouse(wxWindowGTK *wnd)
|
||||||
{
|
{
|
||||||
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
|
||||||
|
|
||||||
GdkWindow *window = (GdkWindow*) NULL;
|
GdkWindow *window = (GdkWindow*) NULL;
|
||||||
if (m_wxwindow)
|
if (wnd->m_wxwindow)
|
||||||
window = GTK_PIZZA(m_wxwindow)->bin_window;
|
window = GTK_PIZZA(wnd->m_wxwindow)->bin_window;
|
||||||
else
|
else
|
||||||
window = GetConnectWidget()->window;
|
window = wnd->GetConnectWidget()->window;
|
||||||
|
|
||||||
wxCHECK_RET( window, _T("CaptureMouse() failed") );
|
wxCHECK_RET( window, _T("CaptureMouse() failed") );
|
||||||
|
|
||||||
wxCursor* cursor = & m_cursor;
|
wxCursor* cursor = &wnd->GetCursor();
|
||||||
if (!cursor->Ok())
|
if (!cursor->Ok())
|
||||||
cursor = wxSTANDARD_CURSOR;
|
cursor = wxSTANDARD_CURSOR;
|
||||||
|
|
||||||
@@ -3776,27 +3777,54 @@ void wxWindowGTK::CaptureMouse()
|
|||||||
(GdkWindow *) NULL,
|
(GdkWindow *) NULL,
|
||||||
cursor->GetCursor(),
|
cursor->GetCursor(),
|
||||||
(guint32)GDK_CURRENT_TIME );
|
(guint32)GDK_CURRENT_TIME );
|
||||||
g_captureWindow = this;
|
g_captureWindow = wnd;
|
||||||
g_captureWindowHasMouse = TRUE;
|
g_captureWindowHasMouse = TRUE;
|
||||||
|
wxLogDebug("captured %p", wnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowGTK::ReleaseMouse()
|
static void wxDoReleaseMouse(wxWindowGTK *wnd)
|
||||||
{
|
{
|
||||||
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
wxLogDebug("trying to release %p", wnd);
|
||||||
|
|
||||||
wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") );
|
wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") );
|
||||||
|
|
||||||
GdkWindow *window = (GdkWindow*) NULL;
|
GdkWindow *window = (GdkWindow*) NULL;
|
||||||
if (m_wxwindow)
|
if (wnd->m_wxwindow)
|
||||||
window = GTK_PIZZA(m_wxwindow)->bin_window;
|
window = GTK_PIZZA(wnd->m_wxwindow)->bin_window;
|
||||||
else
|
else
|
||||||
window = GetConnectWidget()->window;
|
window = wnd->GetConnectWidget()->window;
|
||||||
|
|
||||||
if (!window)
|
if (!window)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME );
|
gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME );
|
||||||
g_captureWindow = (wxWindowGTK*) NULL;
|
g_captureWindow = (wxWindowGTK*) NULL;
|
||||||
|
wxLogDebug("released %p", wnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWindowGTK::CaptureMouse()
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
||||||
|
|
||||||
|
wxLogDebug("CAPTURE %p", this);
|
||||||
|
wxWindowList::Node *last = g_capturedWindows.GetLast();
|
||||||
|
if (last)
|
||||||
|
wxDoReleaseMouse(last->GetData());
|
||||||
|
|
||||||
|
g_capturedWindows.Append(this);
|
||||||
|
wxDoCaptureMouse(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWindowGTK::ReleaseMouse()
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
||||||
|
|
||||||
|
wxLogDebug("RELEASE %p", this);
|
||||||
|
wxDoReleaseMouse(this);
|
||||||
|
g_capturedWindows.DeleteObject(this);
|
||||||
|
|
||||||
|
wxWindowList::Node *last = g_capturedWindows.GetLast();
|
||||||
|
if (last)
|
||||||
|
wxDoCaptureMouse(last->GetData());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */
|
/* static */
|
||||||
|
@@ -208,6 +208,7 @@ extern wxCursor g_globalCursor;
|
|||||||
// inside it
|
// inside it
|
||||||
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
|
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
|
||||||
static bool g_captureWindowHasMouse = FALSE;
|
static bool g_captureWindowHasMouse = FALSE;
|
||||||
|
static wxWindowList g_capturedWindows;
|
||||||
|
|
||||||
/* extern */ wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL;
|
/* extern */ wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL;
|
||||||
|
|
||||||
@@ -2474,6 +2475,8 @@ bool wxWindowGTK::Create( wxWindow *parent,
|
|||||||
|
|
||||||
wxWindowGTK::~wxWindowGTK()
|
wxWindowGTK::~wxWindowGTK()
|
||||||
{
|
{
|
||||||
|
wxASSERT_MSG( g_capturedWindows.IndexOf(this) == wxNOT_FOUND, wxT("trying to destroy window that didn't release focus") );
|
||||||
|
|
||||||
if (g_focusWindow == this)
|
if (g_focusWindow == this)
|
||||||
g_focusWindow = NULL;
|
g_focusWindow = NULL;
|
||||||
|
|
||||||
@@ -3751,19 +3754,17 @@ bool wxWindowGTK::SetFont( const wxFont &font )
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowGTK::CaptureMouse()
|
static void wxDoCaptureMouse(wxWindowGTK *wnd)
|
||||||
{
|
{
|
||||||
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
|
||||||
|
|
||||||
GdkWindow *window = (GdkWindow*) NULL;
|
GdkWindow *window = (GdkWindow*) NULL;
|
||||||
if (m_wxwindow)
|
if (wnd->m_wxwindow)
|
||||||
window = GTK_PIZZA(m_wxwindow)->bin_window;
|
window = GTK_PIZZA(wnd->m_wxwindow)->bin_window;
|
||||||
else
|
else
|
||||||
window = GetConnectWidget()->window;
|
window = wnd->GetConnectWidget()->window;
|
||||||
|
|
||||||
wxCHECK_RET( window, _T("CaptureMouse() failed") );
|
wxCHECK_RET( window, _T("CaptureMouse() failed") );
|
||||||
|
|
||||||
wxCursor* cursor = & m_cursor;
|
wxCursor* cursor = &wnd->GetCursor();
|
||||||
if (!cursor->Ok())
|
if (!cursor->Ok())
|
||||||
cursor = wxSTANDARD_CURSOR;
|
cursor = wxSTANDARD_CURSOR;
|
||||||
|
|
||||||
@@ -3776,27 +3777,54 @@ void wxWindowGTK::CaptureMouse()
|
|||||||
(GdkWindow *) NULL,
|
(GdkWindow *) NULL,
|
||||||
cursor->GetCursor(),
|
cursor->GetCursor(),
|
||||||
(guint32)GDK_CURRENT_TIME );
|
(guint32)GDK_CURRENT_TIME );
|
||||||
g_captureWindow = this;
|
g_captureWindow = wnd;
|
||||||
g_captureWindowHasMouse = TRUE;
|
g_captureWindowHasMouse = TRUE;
|
||||||
|
wxLogDebug("captured %p", wnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowGTK::ReleaseMouse()
|
static void wxDoReleaseMouse(wxWindowGTK *wnd)
|
||||||
{
|
{
|
||||||
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
wxLogDebug("trying to release %p", wnd);
|
||||||
|
|
||||||
wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") );
|
wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") );
|
||||||
|
|
||||||
GdkWindow *window = (GdkWindow*) NULL;
|
GdkWindow *window = (GdkWindow*) NULL;
|
||||||
if (m_wxwindow)
|
if (wnd->m_wxwindow)
|
||||||
window = GTK_PIZZA(m_wxwindow)->bin_window;
|
window = GTK_PIZZA(wnd->m_wxwindow)->bin_window;
|
||||||
else
|
else
|
||||||
window = GetConnectWidget()->window;
|
window = wnd->GetConnectWidget()->window;
|
||||||
|
|
||||||
if (!window)
|
if (!window)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME );
|
gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME );
|
||||||
g_captureWindow = (wxWindowGTK*) NULL;
|
g_captureWindow = (wxWindowGTK*) NULL;
|
||||||
|
wxLogDebug("released %p", wnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWindowGTK::CaptureMouse()
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
||||||
|
|
||||||
|
wxLogDebug("CAPTURE %p", this);
|
||||||
|
wxWindowList::Node *last = g_capturedWindows.GetLast();
|
||||||
|
if (last)
|
||||||
|
wxDoReleaseMouse(last->GetData());
|
||||||
|
|
||||||
|
g_capturedWindows.Append(this);
|
||||||
|
wxDoCaptureMouse(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWindowGTK::ReleaseMouse()
|
||||||
|
{
|
||||||
|
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
||||||
|
|
||||||
|
wxLogDebug("RELEASE %p", this);
|
||||||
|
wxDoReleaseMouse(this);
|
||||||
|
g_capturedWindows.DeleteObject(this);
|
||||||
|
|
||||||
|
wxWindowList::Node *last = g_capturedWindows.GetLast();
|
||||||
|
if (last)
|
||||||
|
wxDoCaptureMouse(last->GetData());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */
|
/* static */
|
||||||
|
Reference in New Issue
Block a user