-wxFrame::wxFrame()
-{
- m_frameMenuBar = NULL;
- m_frameStatusBar = NULL;
- m_frameToolBar = NULL;
- m_sizeSet = FALSE;
- m_addPrivateChild = FALSE;
- m_wxwindow = NULL;
- m_mainWindow = NULL;
- wxTopLevelWindows.Insert( this );
-};
-
-wxFrame::wxFrame( wxWindow *parent, wxWindowID id, const wxString &title,
- const wxPoint &pos, const wxSize &size,
- long style, const wxString &name )
-{
- m_frameMenuBar = NULL;
- m_frameStatusBar = NULL;
- m_frameToolBar = NULL;
- m_sizeSet = FALSE;
- m_addPrivateChild = FALSE;
- m_wxwindow = NULL;
- m_mainWindow = NULL;
- Create( parent, id, title, pos, size, style, name );
- wxTopLevelWindows.Insert( this );
-};
-
-bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
- const wxPoint &pos, const wxSize &size,
- long style, const wxString &name )
-{
- m_needParent = FALSE;
-
- PreCreation( parent, id, pos, size, style, name );
-
- 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 );
+//-----------------------------------------------------------------------------
+// "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->SetIconizeState(FALSE);
+}
+
+//-----------------------------------------------------------------------------
+// "unmap_event" from m_widget
+//-----------------------------------------------------------------------------
+
+static void
+gtk_frame_unmap_callback( GtkWidget * WXUNUSED(widget),
+ GdkEvent * WXUNUSED(event),
+ wxFrame *win )
+{
+ win->SetIconizeState(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
+//-----------------------------------------------------------------------------