]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/toplevel.cpp
Added some missing wxTextCtrl features to to-do list in wxX11's readme.txt
[wxWidgets.git] / src / gtk1 / toplevel.cpp
index a32d659c2f89a8eeb6cb1afe69d7ad7f6059b302..9f5beeea7c234aaac0c55790d7dcd81a6b83d37f 100644 (file)
 
 extern void wxapp_install_idle_handler();
 extern bool g_isIdle;
-extern int g_openDialogs;
-
-// ----------------------------------------------------------------------------
-// event tables
-// ----------------------------------------------------------------------------
 
 // ----------------------------------------------------------------------------
 // data
 // ----------------------------------------------------------------------------
 
-extern wxList wxPendingDelete;
-
-// ----------------------------------------------------------------------------
-// debug
-// ----------------------------------------------------------------------------
+extern wxList         wxPendingDelete;
 
-#ifdef __WXDEBUG__
-
-extern void debug_focus_in( GtkWidget* widget, const wxChar* name, const wxChar *window );
-
-#endif
-
-// ============================================================================
-// implementation
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-// GTK callbacks
-// ----------------------------------------------------------------------------
+extern int            g_openDialogs;
+extern wxWindowGTK   *g_delayedFocus;
 
 //-----------------------------------------------------------------------------
 // "focus" from m_window
@@ -172,7 +152,8 @@ gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WX
 // so we do this directly after realization
 
 static void
-gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK *win )
+gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget),
+                             wxTopLevelWindowGTK *win )
 {
     if (g_isIdle)
         wxapp_install_idle_handler();
@@ -192,28 +173,11 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK *
 
     // reset the icon
     wxIconBundle iconsOld = win->GetIcons();
-    wxIcon tmp = iconsOld.GetIcon( -1 ); // operator != is not-const
-    if ( tmp != wxNullIcon )
+    if ( iconsOld.GetIcon(-1).Ok() )
     {
-        // wxIconBundle icon( iconOld );
         win->SetIcon( wxNullIcon );
         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? 
-    wxWindowList::Node *node = win->GetChildren().GetFirst();
-    while (node)
-    {
-        wxWindow *child = node->GetData();
-        if (child->AcceptsFocus())
-        {
-            child->SetFocus();
-            break;
-        }
-
-        node = node->GetNext();
-    }
 }
 
 //-----------------------------------------------------------------------------
@@ -284,6 +248,10 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
 // wxTopLevelWindowGTK itself
 // ----------------------------------------------------------------------------
 
+BEGIN_EVENT_TABLE(wxTopLevelWindowGTK, wxTopLevelWindowBase)
+    EVT_SET_FOCUS(wxTopLevelWindowGTK::OnSetFocus)
+END_EVENT_TABLE()
+
 //-----------------------------------------------------------------------------
 // InsertChild for wxTopLevelWindowGTK
 //-----------------------------------------------------------------------------
@@ -364,7 +332,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
     wxTopLevelWindows.Append( this );
 
     m_needParent = FALSE;
-    
+
     if (!PreCreation( parent, pos, size ) ||
         !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
     {
@@ -402,10 +370,6 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
     if (!name.IsEmpty())
         gtk_window_set_wmclass( GTK_WINDOW(m_widget), name.mb_str(), name.mb_str() );
 
-#ifdef __WXDEBUG__
-    debug_focus_in( m_widget, wxT("wxTopLevelWindowGTK::m_widget"), name );
-#endif
-
     gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() );
     GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
 
@@ -426,19 +390,11 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
                 GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
 #endif
 
-#ifdef __WXDEBUG__
-    debug_focus_in( m_mainWidget, wxT("wxTopLevelWindowGTK::m_mainWidget"), name );
-#endif
-
     // m_wxwindow only represents the client area without toolbar and menubar
     m_wxwindow = gtk_pizza_new();
     gtk_widget_show( m_wxwindow );
     gtk_container_add( GTK_CONTAINER(m_mainWidget), m_wxwindow );
 
-#ifdef __WXDEBUG__
-    debug_focus_in( m_wxwindow, wxT("wxTopLevelWindowGTK::m_wxwindow"), name );
-#endif
-
     // we donm't allow the frame to get the focus as otherwise
     // the frame will grab it at arbitrary focus changes
     GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
@@ -453,7 +409,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
 
     if ((m_x != -1) || (m_y != -1))
         gtk_widget_set_uposition( m_widget, m_x, m_y );
-        
+
     gtk_window_set_default_size( GTK_WINDOW(m_widget), m_width, m_height );
 
     //  we cannot set MWM hints and icons before the widget has
@@ -522,7 +478,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
 wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
 {
     m_isBeingDeleted = TRUE;
-    
+
     // it may also be GtkScrolledWindow in the case of an MDI child
     if (GTK_IS_WINDOW(m_widget))
     {
@@ -806,9 +762,31 @@ void wxTopLevelWindowGTK::OnInternalIdle()
         return;
     }
 
+    // set the focus if not done yet and if we can already do it
+    if ( GTK_WIDGET_REALIZED(m_wxwindow) )
+    {
+        if ( g_delayedFocus && wxGetTopLevelParent(g_delayedFocus) == this )
+        {
+            g_delayedFocus->SetFocus();
+            g_delayedFocus = NULL;
+        }
+    }
+
     wxWindow::OnInternalIdle();
 }
 
+void wxTopLevelWindowGTK::OnSetFocus(wxFocusEvent& event)
+{
+#if 0
+    if ( !g_delayedFocus || wxGetTopLevelParent(g_delayedFocus) != this )
+    {
+        // let the base class version set the focus to the first child which
+        // accepts it
+        event.Skip();
+    }
+    //else: the focus will be really set from OnInternalIdle() later
+#endif
+}
 
 // ----------------------------------------------------------------------------
 // frame title/icon