relinquish the mouse capture when a dialog is about to be made modal to ensure that the mouse can be used in it (patch 1754648)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48121 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2007-08-15 21:01:30 +00:00
parent b1294ada8e
commit 7738af5957
4 changed files with 54 additions and 0 deletions

View File

@ -178,6 +178,10 @@ public:
// there is also the exception of wxMenuBar)
virtual bool GTKNeedsParent() const { return !IsTopLevel(); }
// This is called when capture is taken from the window. It will
// fire off capture lost events.
void GTKReleaseMouseAndNotify();
protected:
// Override GTKWidgetNeedsMnemonic and return true if your
// needs to set its mnemonic widget, such as for a

View File

@ -112,6 +112,13 @@ int wxDialog::ShowModal()
return GetReturnCode();
}
// 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();
// use the apps top level window as parent if none given unless explicitly
// forbidden
if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )

View File

@ -137,6 +137,12 @@ void wxMessageDialog::GTKCreateMsgDialog()
int wxMessageDialog::ShowModal()
{
// 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();

View File

@ -2107,6 +2107,25 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget),
}
}
//-----------------------------------------------------------------------------
// "grab_broken"
//-----------------------------------------------------------------------------
static void
gtk_window_grab_broken( GtkWidget *m_widget,
GdkEventGrabBroken *event,
wxWindow *win )
{
// Mouse capture has been lost involuntarily, notify the application
if( !event->keyboard && win && wxWindow::GetCapture() == win )
{
wxMouseCaptureLostEvent evt( win->GetId() );
evt.SetEventObject( win );
win->GetEventHandler()->ProcessEvent( evt );
}
}
} // extern "C"
// ----------------------------------------------------------------------------
@ -2521,6 +2540,16 @@ void wxWindowGTK::PostCreation()
// Catch native resize events
g_signal_connect (m_wxwindow, "size_allocate",
G_CALLBACK (gtk_window_size_callback), this);
// Make sure we can notify the app when mouse capture is lost
g_signal_connect (m_wxwindow, "grab_broken_event",
G_CALLBACK (gtk_window_grab_broken), this);
}
if ( connect_widget != m_wxwindow )
{
// Make sure we can notify app code when mouse capture is lost
g_signal_connect (connect_widget, "grab_broken_event",
G_CALLBACK (gtk_window_grab_broken), this);
}
#if wxUSE_COMBOBOX
@ -4069,6 +4098,14 @@ void wxWindowGTK::DoReleaseMouse()
gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME );
}
void wxWindowGTK::GTKReleaseMouseAndNotify()
{
DoReleaseMouse();
wxMouseCaptureLostEvent evt(GetId());
evt.SetEventObject( this );
GetEventHandler()->ProcessEvent( evt );
}
/* static */
wxWindow *wxWindowBase::GetCapture()
{