X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7efaed4de44347f940dfd06ea20d0291b19f54ef..2d956b58023a4955313a1c1531bc70a0deb0b831:/src/gtk1/toplevel.cpp diff --git a/src/gtk1/toplevel.cpp b/src/gtk1/toplevel.cpp index f94dbeab59..b2045d79d4 100644 --- a/src/gtk1/toplevel.cpp +++ b/src/gtk1/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(); } } @@ -263,6 +287,7 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev // "draw" of m_client //----------------------------------------------------------------------------- +#ifndef __WXGTK20__ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxWindow *win ) { @@ -277,6 +302,8 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW 0, 0, -1, -1); } +#endif // GTK+ 1.x + // ---------------------------------------------------------------------------- // wxTopLevelWindowGTK itself // ---------------------------------------------------------------------------- @@ -418,8 +445,10 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, // for m_mainWidget themes gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event", GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this ); +#ifndef __WXGTK20__ gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw", GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this ); +#endif #ifdef __WXDEBUG__ debug_focus_in( m_mainWidget, wxT("wxTopLevelWindowGTK::m_mainWidget"), name ); @@ -845,9 +874,11 @@ void wxTopLevelWindowGTK::SetIcons( const wxIconBundle &icons ) wxTopLevelWindowBase::SetIcons( icons ); DoSetIcon( icons.GetIcon( -1 ) ); - if( window ) + if ( window ) + { wxSetIconsX11( (WXDisplay*)GDK_WINDOW_XDISPLAY( window ), (WXWindow)GDK_WINDOW_XWINDOW( window ), icons ); + } } // ----------------------------------------------------------------------------