diff --git a/src/gtk/dialog.cpp b/src/gtk/dialog.cpp index c30d349e3f..b57b9b4992 100644 --- a/src/gtk/dialog.cpp +++ b/src/gtk/dialog.cpp @@ -136,9 +136,7 @@ int wxDialog::ShowModal() // release the mouse if it's currently captured as the window having it // will be disabled when this dialog is shown -- but will still keep the // capture making it impossible to do anything in the modal dialog itself - wxWindow * const win = wxWindow::GetCapture(); - if ( win ) - win->GTKReleaseMouseAndNotify(); + GTKReleaseMouseAndNotify(); wxWindow * const parent = GetParentForModalDialog(); if ( parent ) diff --git a/src/gtk/msgdlg.cpp b/src/gtk/msgdlg.cpp index 86a7b786cc..9ff33058f7 100644 --- a/src/gtk/msgdlg.cpp +++ b/src/gtk/msgdlg.cpp @@ -277,12 +277,6 @@ int wxMessageDialog::ShowModal() { WX_HOOK_MODAL_DIALOG(); - // break the mouse capture as it would interfere with modal dialog (see - // wxDialog::ShowModal) - wxWindow * const win = wxWindow::GetCapture(); - if ( win ) - win->GTKReleaseMouseAndNotify(); - if ( !m_widget ) { GTKCreateMsgDialog(); @@ -290,6 +284,10 @@ int wxMessageDialog::ShowModal() wxT("failed to create GtkMessageDialog") ); } + // break the mouse capture as it would interfere with modal dialog (see + // wxDialog::ShowModal) + GTKReleaseMouseAndNotify(); + // This should be necessary, but otherwise the // parent TLW will disappear.. if (m_parent) diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index 87db2b1598..e299cdc58a 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -295,6 +295,15 @@ bool wxGUIAppTraits::ShowAssertDialog(const wxString& msg) GtkWidget *dialog = gtk_assert_dialog_new(); gtk_assert_dialog_set_message(GTK_ASSERT_DIALOG(dialog), msg.mb_str()); + GdkDisplay* display = gtk_widget_get_display(dialog); +#ifdef __WXGTK3__ + GdkDeviceManager* manager = gdk_display_get_device_manager(display); + GdkDevice* device = gdk_device_manager_get_client_pointer(manager); + gdk_device_ungrab(device, unsigned(GDK_CURRENT_TIME)); +#else + gdk_display_pointer_ungrab(display, unsigned(GDK_CURRENT_TIME)); +#endif + #if wxUSE_STACKWALKER // save the current stack ow... StackDump dump(GTK_ASSERT_DIALOG(dialog)); diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 69d2ded460..7f6584af6a 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -4840,10 +4840,16 @@ void wxWindowGTK::DoReleaseMouse() void wxWindowGTK::GTKReleaseMouseAndNotify() { - ReleaseMouse(); - wxMouseCaptureLostEvent evt(GetId()); - evt.SetEventObject( this ); - HandleWindowEvent( evt ); + GdkDisplay* display = gtk_widget_get_display(m_widget); +#ifdef __WXGTK3__ + GdkDeviceManager* manager = gdk_display_get_device_manager(display); + GdkDevice* device = gdk_device_manager_get_client_pointer(manager); + gdk_device_ungrab(device, unsigned(GDK_CURRENT_TIME)); +#else + gdk_display_pointer_ungrab(display, unsigned(GDK_CURRENT_TIME)); +#endif + g_captureWindow = NULL; + NotifyCaptureLost(); } /* static */