X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f618020a15f1647a83aaeab1fe315f90497a9876..2d956b58023a4955313a1c1531bc70a0deb0b831:/src/gtk/toplevel.cpp diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 6484fa7f00..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 //----------------------------------------------------------------------------- @@ -191,16 +193,39 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK * gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1); // reset the icon - wxIcon iconOld = win->GetIcon(); - if ( iconOld != wxNullIcon ) + wxIconBundle iconsOld = win->GetIcons(); + wxIcon tmp = iconsOld.GetIcon( -1 ); // operator != is not-const + if ( tmp != wxNullIcon ) { - wxIcon icon( iconOld ); + // wxIconBundle icon( iconOld ); win->SetIcon( wxNullIcon ); - win->SetIcon( icon ); + 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) { @@ -210,7 +235,7 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK * child->SetFocus(); break; } - + node = node->GetNext(); } } @@ -262,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 ) { @@ -276,6 +302,8 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW 0, 0, -1, -1); } +#endif // GTK+ 1.x + // ---------------------------------------------------------------------------- // wxTopLevelWindowGTK itself // ---------------------------------------------------------------------------- @@ -417,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 ); @@ -840,13 +870,15 @@ void wxTopLevelWindowGTK::SetIcons( const wxIconBundle &icons ) { wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); GdkWindow* window = m_widget->window; - wxCHECK_RET( window, _T("window not created yet - can't set icon") ); wxTopLevelWindowBase::SetIcons( icons ); DoSetIcon( icons.GetIcon( -1 ) ); - wxSetIconsX11( (WXDisplay*)GDK_WINDOW_XDISPLAY( window ), - (WXWindow)GDK_WINDOW_XWINDOW( window ), icons ); + if ( window ) + { + wxSetIconsX11( (WXDisplay*)GDK_WINDOW_XDISPLAY( window ), + (WXWindow)GDK_WINDOW_XWINDOW( window ), icons ); + } } // ----------------------------------------------------------------------------