fix releasing mouse capture before showing modal dialog, see #16647

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78147 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett 2014-11-14 18:56:37 +00:00
parent 2f3969724b
commit 00cc0233f6
4 changed files with 24 additions and 13 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

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

View File

@ -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 */