+    // due to a bug in gtk, x,y are always 0
+    // m_x = x;
+    // m_y = y;
+
+    // avoid recursions
+    if (m_resizing) return;
+    m_resizing = TRUE;
+
+    // this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow
+    wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid frame") );
+
+    m_width = width;
+    m_height = height;
+
+    // space occupied by m_frameToolBar and m_frameMenuBar
+    int client_area_x_offset = 0,
+        client_area_y_offset = 0;
+
+    /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses
+       wxWindow::Create to create it's GTK equivalent. m_mainWidget is only
+       set in wxFrame::Create so it is used to check what kind of frame we
+       have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we
+       skip the part which handles m_frameMenuBar, m_frameToolBar and (most
+       importantly) m_mainWidget */
+
+    int minWidth = GetMinWidth(),
+        minHeight = GetMinHeight(),
+        maxWidth = GetMaxWidth(),
+        maxHeight = GetMaxHeight();
+
+    if ((minWidth != -1) && (m_width < minWidth)) m_width = minWidth;
+    if ((minHeight != -1) && (m_height < minHeight)) m_height = minHeight;
+    if ((maxWidth != -1) && (m_width > maxWidth)) m_width = maxWidth;
+    if ((maxHeight != -1) && (m_height > maxHeight)) m_height = maxHeight;
+
+    if (m_mainWidget)
+    {
+        // set size hints
+        gint flag = 0; // GDK_HINT_POS;
+        if ((minWidth != -1) || (minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
+        if ((maxWidth != -1) || (maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
+        GdkGeometry geom;
+        geom.min_width = minWidth;
+        geom.min_height = minHeight;
+        geom.max_width = maxWidth;
+        geom.max_height = maxHeight;
+        gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
+                                       (GtkWidget*) NULL,
+                                       &geom,
+                                       (GdkWindowHints) flag );
+
+        // I revert back to wxGTK's original behaviour. m_mainWidget holds
+        // the menubar, the toolbar and the client area, which is represented
+        // by m_wxwindow.
+        // This hurts in the eye, but I don't want to call SetSize()
+        // because I don't want to call any non-native functions here.
+
+#if wxUSE_MENUS_NATIVE
+        if (m_frameMenuBar)
+        {
+            int xx = m_miniEdge;
+            int yy = m_miniEdge + m_miniTitle;
+            int ww = m_width  - 2*m_miniEdge;
+            int hh = m_menuBarHeight;
+            if (m_menuBarDetached) hh = wxPLACE_HOLDER;
+            m_frameMenuBar->m_x = xx;
+            m_frameMenuBar->m_y = yy;
+            m_frameMenuBar->m_width = ww;
+            m_frameMenuBar->m_height = hh;
+            gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
+                                  m_frameMenuBar->m_widget,
+                                  xx, yy, ww, hh );
+            client_area_y_offset += hh;
+        }
+#endif // wxUSE_MENUS_NATIVE
+
+#if wxUSE_TOOLBAR
+        if ((m_frameToolBar) && m_frameToolBar->IsShown() &&
+            (m_frameToolBar->m_widget->parent == m_mainWidget))
+        {
+            int xx = m_miniEdge;
+            int yy = m_miniEdge + m_miniTitle;
+#if wxUSE_MENUS_NATIVE
+            if (m_frameMenuBar)
+            {
+                if (!m_menuBarDetached)
+                    yy += m_menuBarHeight;
+                else
+                    yy += wxPLACE_HOLDER;
+            }
+#endif // wxUSE_MENUS_NATIVE
+
+            m_frameToolBar->m_x = xx;
+            m_frameToolBar->m_y = yy;
+
+            // don't change the toolbar's reported height/width
+            int ww, hh;
+            if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL )
+            {
+                ww = m_toolBarDetached ? wxPLACE_HOLDER
+                                       : m_frameToolBar->m_width;
+                hh = m_height - 2*m_miniEdge;
+
+                client_area_x_offset += ww;
+            }
+            else
+            {
+                ww = m_width - 2*m_miniEdge;
+                hh = m_toolBarDetached ? wxPLACE_HOLDER
+                                       : m_frameToolBar->m_height;
+
+                client_area_y_offset += hh;
+            }
+
+            gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
+                                  m_frameToolBar->m_widget,
+                                  xx, yy, ww, hh );
+        }
+#endif // wxUSE_TOOLBAR
+
+        int client_x = client_area_x_offset + m_miniEdge;
+        int client_y = client_area_y_offset + m_miniEdge + m_miniTitle;
+        int client_w = m_width - client_area_x_offset - 2*m_miniEdge;
+        int client_h = m_height - client_area_y_offset- 2*m_miniEdge - m_miniTitle;
+        gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
+                              m_wxwindow,
+                              client_x, client_y, client_w, client_h );
+    }
+    else
+    {
+        // If there is no m_mainWidget between m_widget and m_wxwindow there
+        // is no need to set the size or position of m_wxwindow.
+    }