X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/52d6235db0c5c1d3734afc03321da8267c969d34..40f7145ca55ccf1b197e70acf79bbd4aa5d85145:/src/gtk/toplevel.cpp diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index a32d659c2f..b2045d79d4 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -46,17 +46,15 @@ extern void wxapp_install_idle_handler(); extern bool g_isIdle; -extern int g_openDialogs; - -// ---------------------------------------------------------------------------- -// event tables -// ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // data // ---------------------------------------------------------------------------- -extern wxList wxPendingDelete; +extern wxList wxPendingDelete; + +extern int g_openDialogs; +extern wxWindowGTK *g_delayedFocus; // ---------------------------------------------------------------------------- // debug @@ -68,14 +66,6 @@ extern void debug_focus_in( GtkWidget* widget, const wxChar* name, const wxChar #endif -// ============================================================================ -// implementation -// ============================================================================ - -// ---------------------------------------------------------------------------- -// GTK callbacks -// ---------------------------------------------------------------------------- - //----------------------------------------------------------------------------- // "focus" from m_window //----------------------------------------------------------------------------- @@ -164,6 +154,18 @@ gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WX return FALSE; } +//----------------------------------------------------------------------------- +// local code +//----------------------------------------------------------------------------- + +static wxWindow* wxGetTopLevelParent(wxWindow *win) +{ + wxWindow *p = win; + while (p && !p->IsTopLevel()) + p = p->GetParent(); + return p; +} + //----------------------------------------------------------------------------- // "realize" from m_widget //----------------------------------------------------------------------------- @@ -200,8 +202,30 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK * win->SetIcons( iconsOld ); } - // we set the focus to the child that accepts the focus. this - // doesn't really have to be done in "realize" but why not? + // We need to set the focus to some child. Either, this + // has been done already or will be done in the next + // idle cycle, or we will set it ourselves. + + if (g_delayedFocus) + { + if (wxGetTopLevelParent(g_delayedFocus)) + return; + else + g_delayedFocus = NULL; + } + + wxWindow *currentFocus = wxWindow::FindFocus(); + if (currentFocus) + { + // I am not sure if this ever can happen, + // since the TLW is just about to get + // created and its children probably don't + // have any focus. + if (wxGetTopLevelParent(currentFocus) == win) + return; + } + + // We set the focus to the child that accepts the focus. wxWindowList::Node *node = win->GetChildren().GetFirst(); while (node) { @@ -211,7 +235,7 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK * child->SetFocus(); break; } - + node = node->GetNext(); } }