From: Václav Slavík Date: Mon, 24 Sep 2001 18:02:11 +0000 (+0000) Subject: implemented captured windows stack X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/cc1e14d62594e4d16ae9e5fa2dc5b46c2ac362ad implemented captured windows stack git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11690 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 1c2d765a7e..254545aa5b 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -208,6 +208,7 @@ extern wxCursor g_globalCursor; // inside it static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL; static bool g_captureWindowHasMouse = FALSE; +static wxWindowList g_capturedWindows; /* extern */ wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL; @@ -2474,6 +2475,8 @@ bool wxWindowGTK::Create( wxWindow *parent, wxWindowGTK::~wxWindowGTK() { + wxASSERT_MSG( g_capturedWindows.IndexOf(this) == wxNOT_FOUND, wxT("trying to destroy window that didn't release focus") ); + if (g_focusWindow == this) g_focusWindow = NULL; @@ -3751,19 +3754,17 @@ bool wxWindowGTK::SetFont( const wxFont &font ) return TRUE; } -void wxWindowGTK::CaptureMouse() +static void wxDoCaptureMouse(wxWindowGTK *wnd) { - wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); - GdkWindow *window = (GdkWindow*) NULL; - if (m_wxwindow) - window = GTK_PIZZA(m_wxwindow)->bin_window; + if (wnd->m_wxwindow) + window = GTK_PIZZA(wnd->m_wxwindow)->bin_window; else - window = GetConnectWidget()->window; + window = wnd->GetConnectWidget()->window; wxCHECK_RET( window, _T("CaptureMouse() failed") ); - wxCursor* cursor = & m_cursor; + wxCursor* cursor = &wnd->GetCursor(); if (!cursor->Ok()) cursor = wxSTANDARD_CURSOR; @@ -3776,27 +3777,54 @@ void wxWindowGTK::CaptureMouse() (GdkWindow *) NULL, cursor->GetCursor(), (guint32)GDK_CURRENT_TIME ); - g_captureWindow = this; + g_captureWindow = wnd; 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") ); GdkWindow *window = (GdkWindow*) NULL; - if (m_wxwindow) - window = GTK_PIZZA(m_wxwindow)->bin_window; + if (wnd->m_wxwindow) + window = GTK_PIZZA(wnd->m_wxwindow)->bin_window; else - window = GetConnectWidget()->window; + window = wnd->GetConnectWidget()->window; if (!window) return; gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME ); 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 */ diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 1c2d765a7e..254545aa5b 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -208,6 +208,7 @@ extern wxCursor g_globalCursor; // inside it static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL; static bool g_captureWindowHasMouse = FALSE; +static wxWindowList g_capturedWindows; /* extern */ wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL; @@ -2474,6 +2475,8 @@ bool wxWindowGTK::Create( wxWindow *parent, wxWindowGTK::~wxWindowGTK() { + wxASSERT_MSG( g_capturedWindows.IndexOf(this) == wxNOT_FOUND, wxT("trying to destroy window that didn't release focus") ); + if (g_focusWindow == this) g_focusWindow = NULL; @@ -3751,19 +3754,17 @@ bool wxWindowGTK::SetFont( const wxFont &font ) return TRUE; } -void wxWindowGTK::CaptureMouse() +static void wxDoCaptureMouse(wxWindowGTK *wnd) { - wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); - GdkWindow *window = (GdkWindow*) NULL; - if (m_wxwindow) - window = GTK_PIZZA(m_wxwindow)->bin_window; + if (wnd->m_wxwindow) + window = GTK_PIZZA(wnd->m_wxwindow)->bin_window; else - window = GetConnectWidget()->window; + window = wnd->GetConnectWidget()->window; wxCHECK_RET( window, _T("CaptureMouse() failed") ); - wxCursor* cursor = & m_cursor; + wxCursor* cursor = &wnd->GetCursor(); if (!cursor->Ok()) cursor = wxSTANDARD_CURSOR; @@ -3776,27 +3777,54 @@ void wxWindowGTK::CaptureMouse() (GdkWindow *) NULL, cursor->GetCursor(), (guint32)GDK_CURRENT_TIME ); - g_captureWindow = this; + g_captureWindow = wnd; 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") ); GdkWindow *window = (GdkWindow*) NULL; - if (m_wxwindow) - window = GTK_PIZZA(m_wxwindow)->bin_window; + if (wnd->m_wxwindow) + window = GTK_PIZZA(wnd->m_wxwindow)->bin_window; else - window = GetConnectWidget()->window; + window = wnd->GetConnectWidget()->window; if (!window) return; gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME ); 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 */