-wxFrame::wxFrame(void)
-{
- m_doingOnSize = FALSE;
- m_frameMenuBar = NULL;
- m_frameStatusBar = NULL;
- m_sizeSet = FALSE;
- wxTopLevelWindows.Insert( this );
-};
-
-wxFrame::wxFrame( wxWindow *parent, const wxWindowID id, const wxString &title,
- const wxPoint &pos, const wxSize &size,
- const long style, const wxString &name )
-{
- m_sizeSet = FALSE;
- Create( parent, id, title, pos, size, style, name );
- wxTopLevelWindows.Insert( this );
-};
-
-bool wxFrame::Create( wxWindow *parent, const wxWindowID id, const wxString &title,
- const wxPoint &pos, const wxSize &size,
- const long style, const wxString &name )
-{
- m_needParent = FALSE;
- m_mainWindow = NULL;
- m_wxwindow = NULL;
-
- PreCreation( parent, id, pos, size, style, name );
-
- m_doingOnSize = FALSE;
-
- m_title = title;
-
- m_widget = gtk_window_new( GTK_WINDOW_TOPLEVEL );
- if ((size.x != -1) && (size.y != -1))
- gtk_widget_set_usize( m_widget, m_width, m_height );
- if ((pos.x != -1) && (pos.y != -1))
- gtk_widget_set_uposition( m_widget, m_x, m_y );
-
- gtk_window_set_title( GTK_WINDOW(m_widget), title );
- GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
-
- gtk_widget_set( m_widget, "GtkWindow::allow_shrink", TRUE, NULL);
-
- gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
- GTK_SIGNAL_FUNC(gtk_frame_delete_callback), (gpointer)this );
-
- m_mainWindow = gtk_myfixed_new();
- gtk_widget_show( m_mainWindow );
- GTK_WIDGET_UNSET_FLAGS( m_mainWindow, GTK_CAN_FOCUS );
-
- gtk_container_add( GTK_CONTAINER(m_widget), m_mainWindow );
- gtk_widget_set_uposition( m_mainWindow, 0, 0 );
-
- m_wxwindow = gtk_myfixed_new();
- gtk_widget_show( m_wxwindow );
- GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
-
- gtk_container_add( GTK_CONTAINER(m_mainWindow), m_wxwindow );
-
- m_frameMenuBar = NULL;
- m_frameStatusBar = NULL;
-
- gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
- GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this );
-
- PostCreation();
-
- gtk_widget_realize( m_mainWindow );
-
- return TRUE;
-};
-
-wxFrame::~wxFrame(void)
-{
- if (m_frameMenuBar) delete m_frameMenuBar;
- if (m_frameStatusBar) delete m_frameStatusBar;
-
-// if (m_mainWindow) gtk_widget_destroy( m_mainWindow );
-
- wxTopLevelWindows.DeleteObject( this );
- if (wxTopLevelWindows.Number() == 0) wxTheApp->ExitMainLoop();
-};
-
-bool wxFrame::Show( const bool show )
-{
- if (show)
- {
- wxSizeEvent event( wxSize(m_width,m_height), GetId() );
+//-----------------------------------------------------------------------------
+// "child_detached" of menu bar
+//-----------------------------------------------------------------------------
+
+static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
+{
+ if (!win->m_hasVMT) return;
+
+ win->m_menuBarDetached = TRUE;
+ win->GtkUpdateSize();
+}
+
+#if wxUSE_TOOLBAR
+//-----------------------------------------------------------------------------
+// "child_attached" of tool bar
+//-----------------------------------------------------------------------------
+
+static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
+{
+ if (!win->m_hasVMT) return;
+
+ win->m_toolBarDetached = FALSE;
+
+ win->GtkUpdateSize();
+}
+
+//-----------------------------------------------------------------------------
+// "child_detached" of tool bar
+//-----------------------------------------------------------------------------
+
+static void gtk_toolbar_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win )
+{
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ if (!win->m_hasVMT) return;
+
+ win->m_toolBarDetached = TRUE;
+ win->GtkUpdateSize();
+}
+#endif // wxUSE_TOOLBAR
+
+//-----------------------------------------------------------------------------
+// "configure_event"
+//-----------------------------------------------------------------------------
+
+static gint
+#if (GTK_MINOR_VERSION > 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)
+ wxapp_install_idle_handler();
+
+ if (!win->m_hasVMT)
+ return FALSE;
+
+#if (GTK_MINOR_VERSION > 0)
+ 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;
+#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 );
+ win->GetEventHandler()->ProcessEvent( mevent );
+
+ return FALSE;
+}
+
+//-----------------------------------------------------------------------------
+// "realize" from m_widget
+//-----------------------------------------------------------------------------
+
+/* we cannot MWM hints and icons before the widget has been realized,
+ so we do this directly after realization */
+
+static void
+gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxFrame *win )
+{
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ if ((win->m_miniEdge > 0) || (win->HasFlag(wxSIMPLE_BORDER)) || (win->HasFlag(wxNO_BORDER)))
+ {
+ /* This is a mini-frame or a borderless frame. */
+ gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)0 );
+ gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)0 );
+ }
+ else
+ {
+ /* 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_BORDER;
+ long func = (long) GDK_FUNC_MOVE;
+
+ if ((win->GetWindowStyle() & wxCAPTION) != 0)
+ decor |= GDK_DECOR_TITLE;
+ if ((win->GetWindowStyle() & wxSYSTEM_MENU) != 0)
+ {
+ decor |= GDK_DECOR_MENU;
+ func |= GDK_FUNC_CLOSE;
+ }
+ if ((win->GetWindowStyle() & wxMINIMIZE_BOX) != 0)
+ {
+ func |= GDK_FUNC_MINIMIZE;
+ decor |= GDK_DECOR_MINIMIZE;
+ }
+ if ((win->GetWindowStyle() & wxMAXIMIZE_BOX) != 0)
+ {
+ func |= GDK_FUNC_MAXIMIZE;
+ decor |= GDK_DECOR_MAXIMIZE;
+ }
+ if ((win->GetWindowStyle() & wxRESIZE_BORDER) != 0)
+ {
+ func |= GDK_FUNC_RESIZE;
+ decor |= GDK_DECOR_RESIZEH;
+ }
+
+ gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
+ gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
+ }
+
+ /* GTK's shrinking/growing policy */
+ if ((win->GetWindowStyle() & wxRESIZE_BORDER) == 0)
+ gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
+ else
+ gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
+
+ /* reset the icon */
+ wxIcon iconOld = win->GetIcon();
+ if ( iconOld != wxNullIcon )
+ {
+ wxIcon icon( iconOld );
+ win->SetIcon( wxNullIcon );
+ win->SetIcon( icon );
+ }
+
+ /* 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();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// "map_event" from m_widget
+//-----------------------------------------------------------------------------
+
+static void
+gtk_frame_map_callback( GtkWidget * WXUNUSED(widget),
+ GdkEvent * WXUNUSED(event),
+ wxFrame *win )
+{
+ win->m_isIconized = FALSE;
+}
+
+//-----------------------------------------------------------------------------
+// "unmap_event" from m_widget
+//-----------------------------------------------------------------------------
+
+static void
+gtk_frame_unmap_callback( GtkWidget * WXUNUSED(widget),
+ GdkEvent * WXUNUSED(event),
+ wxFrame *win )
+{
+ win->m_isIconized = TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// "expose_event" of m_client
+//-----------------------------------------------------------------------------
+
+static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindow *win )
+{
+ GtkPizza *pizza = GTK_PIZZA(widget);
+
+ gtk_paint_flat_box (win->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL,
+ GTK_SHADOW_NONE, &gdk_event->area, win->m_widget, "base", 0, 0, -1, -1);
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// "draw" of m_client
+//-----------------------------------------------------------------------------
+
+
+static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxWindow *win )
+{
+ GtkPizza *pizza = GTK_PIZZA(widget);
+
+ gtk_paint_flat_box (win->m_widget->style, pizza->bin_window, GTK_STATE_NORMAL,
+ GTK_SHADOW_NONE, rect, win->m_widget, "base", 0, 0, -1, -1);
+}
+
+// ----------------------------------------------------------------------------
+// wxFrame itself
+// ----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// InsertChild for wxFrame
+//-----------------------------------------------------------------------------
+
+/* Callback for wxFrame. This very strange beast has to be used because
+ * C++ has no virtual methods in a constructor. We have to emulate a
+ * virtual function here as wxWindows requires different ways to insert
+ * a child in container classes. */
+
+static void wxInsertChildInFrame( wxFrame* parent, wxWindow* child )
+{
+ wxASSERT( GTK_IS_WIDGET(child->m_widget) );
+
+ if (!parent->m_insertInClientArea)
+ {
+ /* these are outside the client area */
+ wxFrame* frame = (wxFrame*) parent;
+ gtk_pizza_put( GTK_PIZZA(frame->m_mainWidget),
+ GTK_WIDGET(child->m_widget),
+ child->m_x,
+ child->m_y,
+ child->m_width,
+ child->m_height );
+
+#if wxUSE_TOOLBAR_NATIVE
+ /* we connect to these events for recalculating the client area
+ space when the toolbar is floating */
+ if (wxIS_KIND_OF(child,wxToolBar))
+ {
+ wxToolBar *toolBar = (wxToolBar*) child;
+ if (toolBar->GetWindowStyle() & wxTB_DOCKABLE)
+ {
+ gtk_signal_connect( GTK_OBJECT(toolBar->m_widget), "child_attached",
+ GTK_SIGNAL_FUNC(gtk_toolbar_attached_callback), (gpointer)parent );
+
+ gtk_signal_connect( GTK_OBJECT(toolBar->m_widget), "child_detached",
+ GTK_SIGNAL_FUNC(gtk_toolbar_detached_callback), (gpointer)parent );
+ }
+ }
+#endif // wxUSE_TOOLBAR
+ }
+ else
+ {
+ /* these are inside the client area */
+ gtk_pizza_put( GTK_PIZZA(parent->m_wxwindow),
+ GTK_WIDGET(child->m_widget),
+ child->m_x,
+ child->m_y,
+ child->m_width,
+ child->m_height );
+ }
+
+ /* resize on OnInternalIdle */
+ parent->GtkUpdateSize();
+}
+
+// ----------------------------------------------------------------------------
+// wxFrame creation
+// ----------------------------------------------------------------------------
+
+void wxFrame::Init()
+{