+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()
+{
+ m_sizeSet = FALSE;
+ m_miniEdge = 0;
+ m_miniTitle = 0;
+ m_mainWidget = (GtkWidget*) NULL;
+ m_menuBarDetached = FALSE;
+ m_toolBarDetached = FALSE;
+ m_insertInClientArea = TRUE;
+ m_isFrame = TRUE;
+ m_isIconized = TRUE;
+ m_fsIsShowing = FALSE;
+ m_themeEnabled = TRUE;
+}
+
+bool wxFrame::Create( wxWindow *parent,
+ wxWindowID id,
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& sizeOrig,
+ long style,
+ const wxString &name )
+{
+ // always create a frame of some reasonable, even if arbitrary, size (at
+ // least for MSW compatibility)
+ wxSize size = sizeOrig;
+ if ( size.x == -1 || size.y == -1 )
+ {
+ wxSize sizeDpy = wxGetDisplaySize();
+ if ( size.x == -1 )
+ size.x = sizeDpy.x / 3;
+ if ( size.y == -1 )
+ size.y = sizeDpy.y / 5;
+ }
+
+ wxTopLevelWindows.Append( this );
+
+ m_needParent = FALSE;
+
+ if (!PreCreation( parent, pos, size ) ||
+ !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
+ {
+ wxFAIL_MSG( wxT("wxFrame creation failed") );
+ return FALSE;
+ }
+
+ m_title = title;
+
+ m_insertCallback = (wxInsertChildFunction) wxInsertChildInFrame;
+
+ GtkWindowType win_type = GTK_WINDOW_TOPLEVEL;
+
+ if (style & wxFRAME_TOOL_WINDOW)
+ win_type = GTK_WINDOW_POPUP;
+
+ m_widget = gtk_window_new( win_type );
+
+ if ((m_parent) && (HasFlag(wxFRAME_FLOAT_ON_PARENT)) && (GTK_IS_WINDOW(m_parent->m_widget)))
+ gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(m_parent->m_widget) );
+
+ 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("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 );
+
+ gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
+ GTK_SIGNAL_FUNC(gtk_frame_delete_callback), (gpointer)this );
+
+ /* m_mainWidget holds the toolbar, the menubar and the client area */
+ m_mainWidget = gtk_pizza_new();
+ gtk_widget_show( m_mainWidget );
+ GTK_WIDGET_UNSET_FLAGS( m_mainWidget, GTK_CAN_FOCUS );
+ gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget );
+
+ /* for m_mainWidget themes */
+ gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event",
+ GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
+ gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw",
+ GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
+
+#ifdef __WXDEBUG__
+ debug_focus_in( m_mainWidget, wxT("wxFrame::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("wxFrame::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 );
+
+ if (m_parent) m_parent->AddChild( 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 );
+
+ PostCreation();
+
+ if ((m_x != -1) || (m_y != -1))
+ gtk_widget_set_uposition( m_widget, m_x, m_y );
+ gtk_widget_set_usize( m_widget, m_width, m_height );
+
+ /* we cannot set MWM hints and icons before the widget has
+ been realized, so we do this directly after realization */
+ gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
+ GTK_SIGNAL_FUNC(gtk_frame_realized_callback), (gpointer) this );
+
+ /* the only way to get the window size is to connect to this event */
+ gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event",
+ GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this );
+
+ /* map and unmap for iconized state */
+ gtk_signal_connect( GTK_OBJECT(m_widget), "map_event",
+ GTK_SIGNAL_FUNC(gtk_frame_map_callback), (gpointer)this );
+ gtk_signal_connect( GTK_OBJECT(m_widget), "unmap_event",
+ GTK_SIGNAL_FUNC(gtk_frame_unmap_callback), (gpointer)this );
+
+ /* the only way to get the window size is to connect to this event */
+ gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event",
+ GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this );
+
+ /* disable native tab traversal */
+ gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
+ GTK_SIGNAL_FUNC(gtk_frame_focus_callback), (gpointer)this );
+
+ return TRUE;
+}