+#if defined( __WXMSW__ ) || defined( __WXMAC__)
+ if (!show && m_child && m_child->HasCapture())
+ {
+ m_child->ReleaseMouse();
+ }
+#endif
+
+ bool ret = wxPopupWindow::Show( show );
+
+#ifdef __WXGTK__
+ if (show)
+ {
+ gtk_grab_add( m_widget );
+
+ const GdkEventMask mask = GdkEventMask(
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_POINTER_MOTION_HINT_MASK |
+ GDK_POINTER_MOTION_MASK);
+ GdkWindow* window = gtk_widget_get_window(m_widget);
+#ifdef __WXGTK3__
+ GdkDisplay* display = gdk_window_get_display(window);
+ GdkDeviceManager* manager = gdk_display_get_device_manager(display);
+ GdkDevice* device = gdk_device_manager_get_client_pointer(manager);
+ gdk_device_grab(device, window,
+ GDK_OWNERSHIP_NONE, false, mask, NULL, unsigned(GDK_CURRENT_TIME));
+#else
+ gdk_pointer_grab( window, true,
+ mask,
+ NULL,
+ NULL,
+ (guint32)GDK_CURRENT_TIME );
+#endif
+ }
+#endif
+
+#ifdef __WXX11__
+ if (show)
+ {
+ Window xwindow = (Window) m_clientWindow;
+
+ /* int res =*/ XGrabPointer(wxGlobalDisplay(), xwindow,
+ True,
+ ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask,
+ GrabModeAsync,
+ GrabModeAsync,
+ None,
+ None,
+ CurrentTime );
+ }
+#endif
+
+#if defined( __WXMSW__ ) || defined( __WXMAC__)
+ if (show && m_child)
+ {
+ // Assume that the mouse is outside the popup to begin with
+ m_child->CaptureMouse();
+ }
+#endif
+
+ return ret;