#include "wx/gtk/win_gtk.h"
+#include "wx/unix/utilsx11.h"
+
// ----------------------------------------------------------------------------
// idle system
// ----------------------------------------------------------------------------
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
#endif
-// ============================================================================
-// implementation
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-// GTK callbacks
-// ----------------------------------------------------------------------------
-
//-----------------------------------------------------------------------------
// "focus" from m_window
//-----------------------------------------------------------------------------
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
//-----------------------------------------------------------------------------
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)
{
child->SetFocus();
break;
}
-
+
node = node->GetNext();
}
}
// "draw" of m_client
//-----------------------------------------------------------------------------
+#ifndef __WXGTK20__
static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxWindow *win )
{
0, 0, -1, -1);
}
+#endif // GTK+ 1.x
+
// ----------------------------------------------------------------------------
// wxTopLevelWindowGTK itself
// ----------------------------------------------------------------------------
// 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 );
{
m_isBeingDeleted = TRUE;
- gtk_window_set_focus( GTK_WINDOW(m_widget), NULL );
+ // it may also be GtkScrolledWindow in the case of an MDI child
+ if (GTK_IS_WINDOW(m_widget))
+ {
+ gtk_window_set_focus( GTK_WINDOW(m_widget), NULL );
+ }
wxTopLevelWindows.DeleteObject( this );
gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() );
}
-void wxTopLevelWindowGTK::SetIcon( const wxIcon &icon )
+void wxTopLevelWindowGTK::DoSetIcon( const wxIcon &icon )
{
- wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
-
- wxTopLevelWindowBase::SetIcon(icon);
-
- if ( !m_icon.Ok() )
+ if ( !icon.Ok() )
return;
if (!m_widget->window)
gdk_window_set_icon( m_widget->window, (GdkWindow *) NULL, icon.GetPixmap(), bm );
}
+void wxTopLevelWindowGTK::SetIcon( const wxIcon &icon )
+{
+ SetIcons( wxIconBundle( icon ) );
+}
+
+void wxTopLevelWindowGTK::SetIcons( const wxIconBundle &icons )
+{
+ wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
+ GdkWindow* window = m_widget->window;
+
+ wxTopLevelWindowBase::SetIcons( icons );
+
+ DoSetIcon( icons.GetIcon( -1 ) );
+ if ( window )
+ {
+ wxSetIconsX11( (WXDisplay*)GDK_WINDOW_XDISPLAY( window ),
+ (WXWindow)GDK_WINDOW_XWINDOW( window ), icons );
+ }
+}
+
// ----------------------------------------------------------------------------
// frame state: maximized/iconized/normal
// ----------------------------------------------------------------------------