X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b4e431326594715c7c2e7833fa3016f092c7ac79..c782096417f0fd9de6c6d47b23174233ec6bcf57:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index a113e7105f..e8b8ed1719 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1440,11 +1440,6 @@ gtk_window_button_press_callback( GtkWidget *widget, g_lastButtonNumber = gdk_event->button; - if (win->m_wxwindow && (g_focusWindow != win) && win->IsFocusable()) - { - gtk_widget_grab_focus( win->m_wxwindow ); - } - // GDK sends surplus button down events // before a double click event. We // need to filter these out. @@ -1576,9 +1571,9 @@ gtk_window_button_press_callback( GtkWidget *widget, return TRUE; if ((event_type == wxEVT_LEFT_DOWN) && !win->IsOfStandardClass() && - (g_focusWindow != win) && win->IsFocusable()) + (g_focusWindow != win) /* && win->IsFocusable() */) { - gtk_widget_grab_focus( win->m_wxwindow ); + win->SetFocus(); } if (event_type == wxEVT_RIGHT_DOWN) @@ -1870,7 +1865,9 @@ gtk_window_focus_out_callback( GtkWidget *widget, // Disable default focus handling for custom windows // since the default GTK+ handler issues a repaint if ( has_wxwindow ) + { return TRUE; + } } // continue with normal processing @@ -2107,6 +2104,27 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget), } } +//----------------------------------------------------------------------------- +// "grab_broken" +//----------------------------------------------------------------------------- + +#ifdef __WXGTK210__ +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 ); + } +} +#endif + + } // extern "C" // ---------------------------------------------------------------------------- @@ -2521,6 +2539,26 @@ void wxWindowGTK::PostCreation() // Catch native resize events g_signal_connect (m_wxwindow, "size_allocate", G_CALLBACK (gtk_window_size_callback), this); +#ifdef __WXGTK210__ + if (!gtk_check_version(2,8,0)) + { + // 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); + } +#endif + } + + if ( connect_widget != m_wxwindow ) + { +#ifdef __WXGTK210__ + if (!gtk_check_version(2,8,0)) + { + // 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); + } +#endif } #if wxUSE_COMBOBOX @@ -4069,6 +4107,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() {