]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/frame.cpp
Unicode fixes.
[wxWidgets.git] / src / gtk / frame.cpp
index b741ebedd18fa6f758ee62e11e0d36c4356a028a..459043b40251634f3b7fcf3691fcf33642b23ee4 100644 (file)
@@ -33,18 +33,37 @@ const int wxMENU_HEIGHT    = 27;
 const int wxSTATUS_HEIGHT  = 25;
 const int wxPLACE_HOLDER   = 0;
 
+//-----------------------------------------------------------------------------
+// idle system
+//-----------------------------------------------------------------------------
+
+extern void wxapp_install_idle_handler();
+extern bool g_isIdle;
+
 //-----------------------------------------------------------------------------
 // data
 //-----------------------------------------------------------------------------
 
 extern wxList wxPendingDelete;
 
+//-----------------------------------------------------------------------------
+// debug
+//-----------------------------------------------------------------------------
+
+#ifdef __WXDEBUG__
+
+extern void debug_focus_in( GtkWidget* widget, const wxChar* name, const wxChar *window );
+
+#endif
+
 //-----------------------------------------------------------------------------
 // "size_allocate"
 //-----------------------------------------------------------------------------
 
 static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
 
 /*
@@ -68,6 +87,8 @@ static void gtk_frame_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation*
 
 static gint gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
 /*
     printf( "OnDelete from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -86,6 +107,8 @@ static gint gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WX
 
 static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_menuBarDetached = FALSE;
@@ -98,6 +121,8 @@ static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *
 
 static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_menuBarDetached = TRUE;
@@ -110,6 +135,8 @@ static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *
 
 static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_toolBarDetached = FALSE;
@@ -122,6 +149,8 @@ static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidge
 
 static void gtk_toolbar_detached_callback( GtkWidget *widget, GtkWidget *WXUNUSED(child), wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return;
     
     win->m_toolBarDetached = TRUE;
@@ -134,6 +163,8 @@ static void gtk_toolbar_detached_callback( GtkWidget *widget, GtkWidget *WXUNUSE
 
 static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     if (!win->HasVMT()) return FALSE;
 
     win->m_x = event->x;
@@ -156,6 +187,8 @@ static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventC
 static gint 
 gtk_frame_realized_callback( GtkWidget *widget, wxFrame *win )
 {
+    if (g_isIdle) wxapp_install_idle_handler();
+
     /* all this is for Motif Window Manager "hints" and is supposed to be
        recognized by other WM as well. not tested. */
     long decor = (long) GDK_DECOR_ALL;
@@ -193,17 +226,20 @@ gtk_frame_realized_callback( GtkWidget *widget, wxFrame *win )
        win->SetIcon( icon );
     }
     
-    return FALSE;
-}
-    
-//-----------------------------------------------------------------------------
-// "map" from m_widget
-//-----------------------------------------------------------------------------
-
-static gint
-gtk_frame_map_callback( GtkWidget *widget, wxFrame *win )
-{
-    gtk_widget_set_uposition( widget, win->m_x, win->m_y );
+    /* we set the focus to the child that accepts the focus. this
+       doesn't really have to be done in "realize" but why not? */
+    wxNode *node = win->m_children.First();
+    while (node)
+    {
+        wxWindow *child = (wxWindow*) node->Data();
+       if (child->AcceptsFocus())
+       {
+           child->SetFocus();
+           break;
+       }
+       
+        node = node->Next();
+    }
     
     return FALSE;
 }
@@ -325,6 +361,10 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
 
     m_widget = gtk_window_new( win_type );
 
+#ifdef __WXDEBUG__
+    debug_focus_in( m_widget, _T("wxFrame::m_widget"), name );
+#endif
+
     gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() );
     GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
 
@@ -337,17 +377,22 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
     GTK_WIDGET_UNSET_FLAGS( m_mainWidget, GTK_CAN_FOCUS );
     gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget );
     
+#ifdef __WXDEBUG__
+    debug_focus_in( m_mainWidget, _T("wxFrame::m_mainWidget"), name );
+#endif
+
     /* m_wxwindow only represents the client area without toolbar and menubar */
     m_wxwindow = gtk_myfixed_new();
     gtk_widget_show( m_wxwindow );
     gtk_container_add( GTK_CONTAINER(m_mainWidget), m_wxwindow );
     
-    /* we allow the frame to get the focus as otherwise no
-       key events will get sent to it. the point with this is
-       that the menu's key accelerators work by interceting
-       key events here */
-    GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
-    gtk_widget_grab_focus( m_wxwindow );
+#ifdef __WXDEBUG__
+    debug_focus_in( m_wxwindow, _T("wxFrame::m_wxwindow"), name );
+#endif
+
+    /* we donm't allow the frame to get the focus as otherwise
+       the frame will grabit at arbitrary fcous changes. */
+    GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
 
     if (m_parent) m_parent->AddChild( this );
 
@@ -358,11 +403,6 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
     gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
                        GTK_SIGNAL_FUNC(gtk_frame_realized_callback), (gpointer) this );
     
-    /* we set the position of the window after the map event. setting it
-       before has no effect (with KWM) */
-    gtk_signal_connect( GTK_OBJECT(m_widget), "map",
-                       GTK_SIGNAL_FUNC(gtk_frame_map_callback), (gpointer) this );
-
     /* the user resized the frame by dragging etc. */
     gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
         GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this );
@@ -708,7 +748,7 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height
 
 void wxFrame::OnInternalIdle()
 {
-    if (!m_sizeSet)
+    if (!m_sizeSet && GTK_WIDGET_REALIZED(m_wxwindow))
         GtkOnSize( m_x, m_y, m_width, m_height );
 
     DoMenuUpdates();