diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 439133d152..9cb4987243 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -173,7 +173,7 @@ static gint gtk_frame_focus_in_callback( GtkWidget *widget, event.SetEventObject(g_activeFrame); g_activeFrame->GetEventHandler()->ProcessEvent(event); - return FALSE; + return TRUE; } } @@ -208,7 +208,7 @@ static gint gtk_frame_focus_out_callback( GtkWidget *widget, g_activeFrame = NULL; } - return FALSE; + return TRUE; } } diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index c1b8439792..bc032656c6 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1867,20 +1867,25 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, } #endif // wxUSE_CARET + bool ret = FALSE; + // does the window itself think that it has the focus? if ( !win->m_hasFocus ) { // not yet, notify it win->m_hasFocus = true; - if ( DoSendFocusEvents(win) ) - { - g_signal_stop_emission_by_name (widget, "focus_in_event"); - return TRUE; - } + (void)DoSendFocusEvents(win); + + ret = TRUE; } - return FALSE; + // Disable default focus handling for custom windows + // since the default GTK+ handler issues a repaint + if (win->m_wxwindow) + g_signal_stop_emission_by_name (widget, "focus_in_event"); + + return ret; } } @@ -1923,6 +1928,8 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk } #endif // wxUSE_CARET + bool ret = FALSE; + // don't send the window a kill focus event if it thinks that it doesn't // have focus already if ( win->m_hasFocus ) @@ -1932,14 +1939,17 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() ); event.SetEventObject( win ); - // even if we did process the event in wx code, still let GTK itself - // process it too as otherwise bad things happen, especially in GTK2 - // where the text control simply aborts the program if it doesn't get - // the matching focus out event (void)win->GetEventHandler()->ProcessEvent( event ); + + ret = TRUE; } - - return FALSE; + + // Disable default focus handling for custom windows + // since the default GTK+ handler issues a repaint + if (win->m_wxwindow) + g_signal_stop_emission_by_name (widget, "focus_out_event"); + + return ret; } }