backport mouse capture fixes 00cc023 and dc555a9

00cc023 "fix releasing mouse capture before showing modal dialog"
dc555a9 "notify all windows in capture stack about capture lost, and empty the stack"
closes #16647
This commit is contained in:
Paul Cornett
2015-05-13 10:13:49 -07:00
parent a2f1bc1fde
commit 69c7a8c405
4 changed files with 31 additions and 16 deletions

View File

@@ -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 )

View File

@@ -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)

View File

@@ -299,6 +299,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));

View File

@@ -2030,9 +2030,7 @@ gtk_window_grab_broken( GtkWidget*,
// Mouse capture has been lost involuntarily, notify the application
if(!event->keyboard && wxWindow::GetCapture() == win)
{
wxMouseCaptureLostEvent evt( win->GetId() );
evt.SetEventObject( win );
win->HandleWindowEvent( evt );
wxWindowGTK::GTKHandleCaptureLost();
}
return false;
}
@@ -4799,10 +4797,22 @@ void wxWindowGTK::DoReleaseMouse()
void wxWindowGTK::GTKReleaseMouseAndNotify()
{
DoReleaseMouse();
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();
}
void wxWindowGTK::GTKHandleCaptureLost()
{
g_captureWindow = NULL;
NotifyCaptureLost();
}
/* static */