- // set size hints
- gint flag = 0; // GDK_HINT_POS;
- GdkGeometry geom;
-
- if ((minWidth != -1) || (minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
- if ((maxWidth != -1) || (maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
-
- geom.min_width = minWidth;
- geom.min_height = minHeight;
-
- // Because of the way we set GDK_HINT_MAX_SIZE above, if either of
- // maxHeight or maxWidth is set, we must set them both, else the
- // remaining -1 will be taken literally.
-
- // I'm certain this also happens elsewhere, and is the probable
- // cause of other such things as:
- // Gtk-WARNING **: gtk_widget_size_allocate():
- // attempt to allocate widget with width 65535 and height 600
- // but I don't have time to track them all now..
- //
- // Really we need to encapulate all this height/width business and
- // stop any old method from ripping at the members directly and
- // scattering -1's without regard for who might resolve them later.
-
- geom.max_width = ( maxHeight == -1 ) ? maxWidth
- : ( maxWidth == -1 ) ? wxGetDisplaySize().GetWidth()
- : maxWidth ;
-
- geom.max_height = ( maxWidth == -1 ) ? maxHeight // ( == -1 here )
- : ( maxHeight == -1 ) ? wxGetDisplaySize().GetHeight()
- : 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. */
-
- int client_x = m_miniEdge;
- int client_y = m_miniEdge + m_miniTitle;
- int client_w = m_width - 2*m_miniEdge;
- int client_h = m_height - 2*m_miniEdge - m_miniTitle;
- if (client_w < 0)
- client_w = 0;
- if (client_h < 0)
- client_h = 0;
-
- // Let the parent perform the resize
- gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
- m_wxwindow,
- client_x, client_y, client_w, client_h );
+ const wxSize diff = decorSize - m_decorSize;
+ m_decorSize = decorSize;
+ bool resized = false;
+ if (m_deferShow)
+ {
+ // keep overall size unchanged by shrinking m_widget
+ int w, h;
+ GTKDoGetSize(&w, &h);
+ // but not if size would be less than minimum, it won't take effect
+ const wxSize minSize = GetMinSize();
+ if (w >= minSize.x && h >= minSize.y)
+ {
+ gtk_window_resize(GTK_WINDOW(m_widget), w, h);
+ resized = true;
+ }
+ }
+ if (!resized)
+ {
+ // adjust overall size to match change in frame extents
+ m_width += diff.x;
+ m_height += diff.y;
+ if (m_width < 0) m_width = 0;
+ if (m_height < 0) m_height = 0;
+ if (!m_deferShow)
+ {
+ m_oldClientWidth = 0;
+ gtk_widget_queue_resize(m_wxwindow);
+ }
+ }