]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/frame.cpp
Made tearoff menus work for gtk :-)
[wxWidgets.git] / src / gtk1 / frame.cpp
index 37e2910235545f7a66c582105417ee6e56656886..61259fad4b0f23497b45048703f53d0dbd49effd 100644 (file)
 #include "wx/control.h"
 #include "wx/app.h"
 #include "wx/menu.h"
 #include "wx/control.h"
 #include "wx/app.h"
 #include "wx/menu.h"
+#if wxUSE_TOOLBAR
 #include "wx/toolbar.h"
 #include "wx/toolbar.h"
+#endif
+#if wxUSE_STATUSBAR
 #include "wx/statusbr.h"
 #include "wx/statusbr.h"
+#endif
 #include "wx/dcclient.h"
 
 #include "glib.h"
 #include "wx/dcclient.h"
 
 #include "glib.h"
@@ -148,19 +152,28 @@ static void gtk_toolbar_detached_callback( GtkWidget *widget, GtkWidget *WXUNUSE
 // "configure_event"
 //-----------------------------------------------------------------------------
 
 // "configure_event"
 //-----------------------------------------------------------------------------
 
-static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxFrame *win )
+static gint 
+#if (GTK_MINOR_VERSON > 0)
+gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WXUNUSED(event), wxFrame *win )
+#else
+gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxFrame *win )
+#endif
 {
 {
-    if (g_isIdle)
+    if (g_isIdle) 
         wxapp_install_idle_handler();
 
     if (!win->m_hasVMT) return FALSE;
 
         wxapp_install_idle_handler();
 
     if (!win->m_hasVMT) return FALSE;
 
+#if (GTK_MINOR_VERSON > 0)
     int x = 0;
     int y = 0;
     gdk_window_get_root_origin( win->m_widget->window, &x, &y );
     int x = 0;
     int y = 0;
     gdk_window_get_root_origin( win->m_widget->window, &x, &y );
-
     win->m_x = x;
     win->m_y = y;
     win->m_x = x;
     win->m_y = y;
+#else
+    win->m_x = event->x;
+    win->m_y = event->y;
+#endif
 
     wxMoveEvent mevent( wxPoint(win->m_x,win->m_y), win->GetId() );
     mevent.SetEventObject( win );
 
     wxMoveEvent mevent( wxPoint(win->m_x,win->m_y), win->GetId() );
     mevent.SetEventObject( win );
@@ -482,7 +495,7 @@ void wxFrame::DoSetSize( int x, int y, int width, int height, int sizeFlags )
     int old_width = m_width;
     int old_height = m_height;
 
     int old_width = m_width;
     int old_height = m_height;
 
-    if ((sizeFlags & wxSIZE_USE_EXISTING) == wxSIZE_USE_EXISTING)
+    if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
     {
         if (x != -1) m_x = x;
         if (y != -1) m_y = y;
     {
         if (x != -1) m_x = x;
         if (y != -1) m_y = y;
@@ -560,9 +573,12 @@ void wxFrame::DoGetClientSize( int *width, int *height ) const
                 (*height) -= wxPLACE_HOLDER;
         }
 
                 (*height) -= wxPLACE_HOLDER;
         }
 
+#if wxUSE_STATUSBAR
         /* status bar */
         if (m_frameStatusBar) (*height) -= wxSTATUS_HEIGHT;
         /* status bar */
         if (m_frameStatusBar) (*height) -= wxSTATUS_HEIGHT;
+#endif
 
 
+#if wxUSE_TOOLBAR
         /* tool bar */
         if (m_frameToolBar)
         {
         /* tool bar */
         if (m_frameToolBar)
         {
@@ -575,6 +591,7 @@ void wxFrame::DoGetClientSize( int *width, int *height ) const
             else
                 (*height) -= wxPLACE_HOLDER;
         }
             else
                 (*height) -= wxPLACE_HOLDER;
         }
+#endif
 
         /* mini edge */
         (*height) -= m_miniEdge*2 + m_miniTitle;
 
         /* mini edge */
         (*height) -= m_miniEdge*2 + m_miniTitle;
@@ -598,9 +615,12 @@ void wxFrame::DoSetClientSize( int width, int height )
                 height += wxPLACE_HOLDER;
         }
 
                 height += wxPLACE_HOLDER;
         }
 
+#if wxUSE_STATUSBAR
         /* status bar */
         if (m_frameStatusBar) height += wxSTATUS_HEIGHT;
         /* status bar */
         if (m_frameStatusBar) height += wxSTATUS_HEIGHT;
+#endif
 
 
+#if wxUSE_TOOLBAR
         /* tool bar */
         if (m_frameToolBar)
         {
         /* tool bar */
         if (m_frameToolBar)
         {
@@ -613,6 +633,7 @@ void wxFrame::DoSetClientSize( int width, int height )
             else
                 height += wxPLACE_HOLDER;
         }
             else
                 height += wxPLACE_HOLDER;
         }
+#endif
 
     wxWindow::DoSetClientSize( width + m_miniEdge*2, height  + m_miniEdge*2 + m_miniTitle );
 }
 
     wxWindow::DoSetClientSize( width + m_miniEdge*2, height  + m_miniEdge*2 + m_miniTitle );
 }
@@ -674,6 +695,7 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height
             client_area_y_offset += hh;
         }
 
             client_area_y_offset += hh;
         }
 
+#if wxUSE_TOOLBAR
         if (m_frameToolBar)
         {
             int xx = m_miniEdge;
         if (m_frameToolBar)
         {
             int xx = m_miniEdge;
@@ -697,6 +719,7 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height
                                   xx, yy, ww, hh );
             client_area_y_offset += hh;
         }
                                   xx, yy, ww, hh );
             client_area_y_offset += hh;
         }
+#endif
 
         int client_x = m_miniEdge;
         int client_y = client_area_y_offset + m_miniEdge + m_miniTitle;
 
         int client_x = m_miniEdge;
         int client_y = client_area_y_offset + m_miniEdge + m_miniTitle;
@@ -712,6 +735,7 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height
            is no need to set the size or position of m_wxwindow. */
     }
 
            is no need to set the size or position of m_wxwindow. */
     }
 
+#if wxUSE_STATUSBAR
     if (m_frameStatusBar)
     {
         int xx = 0 + m_miniEdge;
     if (m_frameStatusBar)
     {
         int xx = 0 + m_miniEdge;
@@ -726,6 +750,7 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height
                               m_frameStatusBar->m_widget,
                               xx, yy, ww, hh );
     }
                               m_frameStatusBar->m_widget,
                               xx, yy, ww, hh );
     }
+#endif
 
     /* we actually set the size of a frame here and no-where else */
     gtk_widget_set_usize( m_widget, m_width, m_height );
 
     /* we actually set the size of a frame here and no-where else */
     gtk_widget_set_usize( m_widget, m_width, m_height );
@@ -764,8 +789,12 @@ void wxFrame::OnInternalIdle()
     DoMenuUpdates();
 
     if (m_frameMenuBar) m_frameMenuBar->OnInternalIdle();
     DoMenuUpdates();
 
     if (m_frameMenuBar) m_frameMenuBar->OnInternalIdle();
+#if wxUSE_TOOLBAR
     if (m_frameToolBar) m_frameToolBar->OnInternalIdle();
     if (m_frameToolBar) m_frameToolBar->OnInternalIdle();
+#endif
+#if wxUSE_STATUSBAR
     if (m_frameStatusBar) m_frameStatusBar->OnInternalIdle();
     if (m_frameStatusBar) m_frameStatusBar->OnInternalIdle();
+#endif
 }
 
 void wxFrame::OnCloseWindow( wxCloseEvent& WXUNUSED(event) )
 }
 
 void wxFrame::OnCloseWindow( wxCloseEvent& WXUNUSED(event) )
@@ -813,25 +842,6 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
     }
 }
 
     }
 }
 
-static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
-{
-    menu->SetInvokingWindow( win );
-
-#if (GTK_MINOR_VERSION > 0)
-    /* support for native hot keys  */
-    gtk_accel_group_attach( menu->m_accel, GTK_OBJECT(win->m_widget));
-#endif
-
-    wxNode *node = menu->GetItems().First();
-    while (node)
-    {
-        wxMenuItem *menuitem = (wxMenuItem*)node->Data();
-        if (menuitem->IsSubMenu())
-            SetInvokingWindow( menuitem->GetSubMenu(), win );
-        node = node->Next();
-    }
-}
-
 void wxFrame::SetMenuBar( wxMenuBar *menuBar )
 {
     wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
 void wxFrame::SetMenuBar( wxMenuBar *menuBar )
 {
     wxASSERT_MSG( (m_widget != NULL), _T("invalid frame") );
@@ -841,18 +851,7 @@ void wxFrame::SetMenuBar( wxMenuBar *menuBar )
 
     if (m_frameMenuBar)
     {
 
     if (m_frameMenuBar)
     {
-#if (GTK_MINOR_VERSION > 0) && (GTK_MICRO_VERSION > 0)
-        /* support for native key accelerators indicated by underscroes */
-         gtk_accel_group_attach( m_frameMenuBar->m_accel, GTK_OBJECT(m_widget));
-#endif
-
-        wxNode *node = m_frameMenuBar->GetMenus().First();
-        while (node)
-        {
-            wxMenu *menu = (wxMenu*)node->Data();
-            SetInvokingWindow( menu, this );
-            node = node->Next();
-        }
+        m_frameMenuBar->SetInvokingWindow( this );
 
         if (m_frameMenuBar->GetParent() != this)
         {
 
         if (m_frameMenuBar->GetParent() != this)
         {
@@ -872,6 +871,8 @@ void wxFrame::SetMenuBar( wxMenuBar *menuBar )
                 gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_detached",
                     GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
             }
                 gtk_signal_connect( GTK_OBJECT(menuBar->m_widget), "child_detached",
                     GTK_SIGNAL_FUNC(gtk_menu_detached_callback), (gpointer)this );
             }
+           
+           m_frameMenuBar->Show( TRUE );
         }
     }
 
         }
     }