From 346d4fcde74860121bc7bae2cfc6a9b5c163464d Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 14 Feb 2002 00:45:13 +0000 Subject: [PATCH] wxX11: Don't add popup windows to wxTopLevelWindows, espially not if you don't delete them later. Corrected ReleaseMouse(). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14195 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/x11/popupwin.cpp | 2 -- src/x11/window.cpp | 56 +++++++++++++++++++++----------------------- 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/x11/popupwin.cpp b/src/x11/popupwin.cpp index debfbf577b..c159e89b41 100644 --- a/src/x11/popupwin.cpp +++ b/src/x11/popupwin.cpp @@ -49,8 +49,6 @@ bool wxPopupWindow::Create( wxWindow *parent, int style ) m_parent = parent; if (m_parent) m_parent->AddChild( this ); - wxTopLevelWindows.Append(this); - Display *xdisplay = wxGlobalDisplay(); int xscreen = DefaultScreen( xdisplay ); Visual *xvisual = DefaultVisual( xdisplay, xscreen ); diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 89ba9d056a..7a5ce9f198 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -293,43 +293,46 @@ void wxWindowX11::DoCaptureMouse() { if ((g_captureWindow != NULL) && (g_captureWindow != this)) { - wxASSERT_MSG(FALSE, "Trying to capture before mouse released."); + wxASSERT_MSG(FALSE, "Trying to capture before mouse released."); - // Core dump now - int *tmp = NULL; - (*tmp) = 1; - return; + // Core dump now + int *tmp = NULL; + (*tmp) = 1; + return; } - if ( m_winCaptured ) + if (m_winCaptured) return; + Window xwindow = (Window) GetMainWindow(); + g_captureWindow = (wxWindow*) this; - if (GetMainWindow()) + if (xwindow) { - int res = XGrabPointer(wxGlobalDisplay(), (Window) GetMainWindow(), + int res = XGrabPointer(wxGlobalDisplay(), xwindow, FALSE, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, /* cursor */ // TODO: This may need to be set to the cursor of this window - CurrentTime); + CurrentTime ); if (res != GrabSuccess) { - wxString msg; - msg.Printf("Failed to grab pointer for window %s", this->GetClassInfo()->GetClassName()); - wxLogDebug(msg); - if (res == GrabNotViewable) - { - wxLogDebug("This is not a viewable window - perhaps not shown yet?"); - } - g_captureWindow = NULL; + wxString msg; + msg.Printf("Failed to grab pointer for window %s", this->GetClassInfo()->GetClassName()); + wxLogDebug(msg); + if (res == GrabNotViewable) + { + wxLogDebug("This is not a viewable window - perhaps not shown yet?"); + } + g_captureWindow = NULL; return; } - wxLogDebug("Grabbed pointer"); + + wxLogDebug("Grabbed pointer"); #if 0 res = XGrabButton(wxGlobalDisplay(), AnyButton, AnyModifier, @@ -351,11 +354,8 @@ void wxWindowX11::DoCaptureMouse() #if 0 res = XGrabKeyboard(wxGlobalDisplay(), (Window) GetMainWindow(), -#if 0 ShiftMask | LockMask | ControlMask | Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask, -#else FALSE, -#endif GrabModeAsync, GrabModeAsync, CurrentTime); @@ -364,10 +364,8 @@ void wxWindowX11::DoCaptureMouse() { wxLogDebug("Failed to grab keyboard."); XUngrabPointer(wxGlobalDisplay(), CurrentTime); -#if 0 XUngrabButton(wxGlobalDisplay(), AnyButton, AnyModifier, (Window) GetMainWindow()); -#endif return; } #endif @@ -379,18 +377,18 @@ void wxWindowX11::DoCaptureMouse() void wxWindowX11::DoReleaseMouse() { g_captureWindow = NULL; + if ( !m_winCaptured ) return; - Window wMain = (Window)GetMainWindow(); + Window xwindow = (Window) GetMainWindow(); - if ( wMain ) + if (xwindow) { - XUngrabPointer(wxGlobalDisplay(), wMain); + XUngrabPointer( wxGlobalDisplay(), CurrentTime ); #if 0 - XUngrabButton(wxGlobalDisplay(), AnyButton, AnyModifier, - wMain); - XUngrabKeyboard(wxGlobalDisplay(), CurrentTime); + XUngrabButton( wxGlobalDisplay(), AnyButton, AnyModifier, xwindow); + XUngrabKeyboard( wxGlobalDisplay(), CurrentTime ); #endif } wxLogDebug("Ungrabbed pointer"); -- 2.45.2