- // FIXME: I don't know why does this happen but sometimes SetFocus() simply
- // refuses to work under MSW - no error happens but the focus is not
- // given to the window, i.e. the assert below is triggered
- //
- // Try work around this as we can...
-#if 0
- wxASSERT_MSG( FindFocus() == m_focus, _T("setting focus failed") );
+#ifdef __WXX11__
+ if (!show)
+ {
+ XUngrabPointer( wxGlobalDisplay(), CurrentTime );
+ }
+#endif
+
+#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));