]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/win_gtk.cpp
update GTK size hints when window decorations change
[wxWidgets.git] / src / gtk / win_gtk.cpp
index de2354d2b64d98c624d8022ac74eeef5a3610cf0..97755632fc92f3b2c50efa270caadf19880bb26d 100644 (file)
@@ -8,8 +8,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "wx/defs.h"
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "wx/defs.h"
-#include "wx/gtk/win_gtk.h"
-#include "gtk/gtk.h"
+#include "wx/gtk/private/win_gtk.h"
 
 /*
 wxPizza is a custom GTK+ widget derived from GtkFixed.  A custom widget
 
 /*
 wxPizza is a custom GTK+ widget derived from GtkFixed.  A custom widget
@@ -65,29 +64,28 @@ static void size_allocate(GtkWidget* widget, GtkAllocation* alloc)
 
         if (pizza->m_is_scrollable)
         {
 
         if (pizza->m_is_scrollable)
         {
-            // backing window is inside border
+            // two windows, both same size
             gdk_window_move_resize(pizza->m_backing_window,
                 alloc->x + border_x, alloc->y + border_y, w, h);
             gdk_window_move_resize(pizza->m_backing_window,
                 alloc->x + border_x, alloc->y + border_y, w, h);
+            if (is_resize)
+                gdk_window_resize(widget->window, w, h);
+        }
+        else if (pizza->m_backing_window)
+        {
+            // two windows, widget->window is smaller by border widths (need to
+            // move widget->window as well as resize because border can change)
+            gdk_window_move_resize(pizza->m_backing_window,
+                alloc->x, alloc->y, alloc->width, alloc->height);
+            gdk_window_move_resize(widget->window, border_x, border_y, w, h);
         }
         else
         {
         }
         else
         {
-            // border window (or only window if
-            // no-scroll no-border) is full size
-            GdkWindow* window = pizza->m_backing_window;
-            if (window == NULL)
-                window = widget->window;
-            gdk_window_move_resize(
-                window, alloc->x, alloc->y, alloc->width, alloc->height);
+            // one window
+            gdk_window_move_resize(widget->window,
+                alloc->x, alloc->y, alloc->width, alloc->height);
         }
         if (is_resize && pizza->m_backing_window)
         {
         }
         if (is_resize && pizza->m_backing_window)
         {
-            // main window is inside border
-            if (pizza->m_is_scrollable)
-                gdk_window_resize(widget->window, w, h);
-            else
-                // need move as well as resize because border can change
-                gdk_window_move_resize(widget->window, border_x, border_y, w, h);
-
             // wxWidgets turns off redraw-on-allocate by default,
             // so border area needs to be invalidated
             if (border_x > 1 || border_y > 1)
             // wxWidgets turns off redraw-on-allocate by default,
             // so border area needs to be invalidated
             if (border_x > 1 || border_y > 1)
@@ -167,9 +165,11 @@ static void realize(GtkWidget* widget)
         else
             gdk_window_reparent(widget->window, pizza->m_backing_window, border_x, border_y);
         gdk_window_resize(widget->window, w, h);
         else
             gdk_window_reparent(widget->window, pizza->m_backing_window, border_x, border_y);
         gdk_window_resize(widget->window, w, h);
-        
-        widget->style = gtk_style_attach (widget->style, pizza->m_backing_window);
-        gtk_style_set_background (widget->style, pizza->m_backing_window, GTK_STATE_NORMAL);
+
+        // Parts of m_backing_window which are supposed to be obscured may be
+        // exposed temporarily while resizing. Setting the backing pixmap to
+        // None prevents those areas from being briefly painted black.
+        gdk_window_set_back_pixmap(pizza->m_backing_window, NULL, false);
     }
 }
 
     }
 }
 
@@ -302,8 +302,8 @@ GtkWidget* wxPizza::New(long windowStyle)
     pizza->m_scroll_x = 0;
     pizza->m_scroll_y = 0;
     pizza->m_is_scrollable = (windowStyle & (wxHSCROLL | wxVSCROLL)) != 0;
     pizza->m_scroll_x = 0;
     pizza->m_scroll_y = 0;
     pizza->m_is_scrollable = (windowStyle & (wxHSCROLL | wxVSCROLL)) != 0;
-    pizza->m_border_style =
-        int(windowStyle & (wxBORDER_SIMPLE | wxBORDER_RAISED | wxBORDER_SUNKEN | wxBORDER_THEME));
+    // mask off border styles not useable with wxPizza
+    pizza->m_border_style = int(windowStyle & BORDER_STYLES);
     gtk_fixed_set_has_window(GTK_FIXED(widget), true);
     gtk_widget_add_events(widget,
         GDK_EXPOSURE_MASK |
     gtk_fixed_set_has_window(GTK_FIXED(widget), true);
     gtk_widget_add_events(widget,
         GDK_EXPOSURE_MASK |
@@ -321,7 +321,6 @@ GtkWidget* wxPizza::New(long windowStyle)
         GDK_ENTER_NOTIFY_MASK |
         GDK_LEAVE_NOTIFY_MASK |
         GDK_FOCUS_CHANGE_MASK);
         GDK_ENTER_NOTIFY_MASK |
         GDK_LEAVE_NOTIFY_MASK |
         GDK_FOCUS_CHANGE_MASK);
-    gtk_container_set_resize_mode(GTK_CONTAINER(widget), GTK_RESIZE_QUEUE);
     return widget;
 }
 
     return widget;
 }