[gtk: 44/88] gdk: Always get shadow width via GdkToplevelSize




commit 3f96d4b6dae56e5e3fc27a4d7b9a8bd90c9a802c
Author: Jonas Ådahl <jadahl gmail com>
Date:   Wed Dec 2 14:58:45 2020 +0100

    gdk: Always get shadow width via GdkToplevelSize
    
    This removes the gdk_surface_set_shadow_width() function and related
    vfuncs. The point here is that the shadow width and surface size can now
    be communicated to GDK atomically, meaning it's possible to avoid
    intermediate stages where the surface size includes the shadow, but
    without the shadow width set, or the other way around.

 docs/reference/gdk/gdk4-sections.txt |  1 -
 gdk/broadway/gdksurface-broadway.c   | 14 ++++++++
 gdk/broadway/gdksurface-broadway.h   |  5 +++
 gdk/gdksurface.c                     | 63 ++++++------------------------------
 gdk/gdksurface.h                     |  7 ----
 gdk/gdksurfaceprivate.h              | 13 +++-----
 gdk/macos/gdkmacospopupsurface.c     |  4 +++
 gdk/macos/gdkmacossurface-private.h  |  5 +++
 gdk/macos/gdkmacossurface.c          |  3 +-
 gdk/macos/gdkmacostoplevelsurface.c  |  9 ++++++
 gdk/wayland/gdksurface-wayland.c     | 21 ++++--------
 gdk/win32/gdksurface-win32.c         | 16 +++++++--
 gdk/x11/gdksurface-x11.c             | 15 +++------
 gtk/gtkwindow.c                      |  4 ---
 14 files changed, 77 insertions(+), 103 deletions(-)
---
diff --git a/docs/reference/gdk/gdk4-sections.txt b/docs/reference/gdk/gdk4-sections.txt
index 1680e9e3e5..f480652627 100644
--- a/docs/reference/gdk/gdk4-sections.txt
+++ b/docs/reference/gdk/gdk4-sections.txt
@@ -203,7 +203,6 @@ gdk_surface_get_cursor
 gdk_surface_set_input_region
 gdk_surface_get_width
 gdk_surface_get_height
-gdk_surface_set_shadow_width
 gdk_surface_get_device_position
 GdkModifierType
 GDK_MODIFIER_MASK
diff --git a/gdk/broadway/gdksurface-broadway.c b/gdk/broadway/gdksurface-broadway.c
index bc5f3eb6c9..d8667d0028 100644
--- a/gdk/broadway/gdksurface-broadway.c
+++ b/gdk/broadway/gdksurface-broadway.c
@@ -558,6 +558,7 @@ gdk_broadway_surface_layout_popup (GdkSurface     *surface,
                                    int             height,
                                    GdkPopupLayout *layout)
 {
+  GdkBroadwaySurface *impl = GDK_BROADWAY_SURFACE (surface);
   GdkMonitor *monitor;
   GdkRectangle bounds;
   GdkRectangle final_rect;
@@ -570,6 +571,10 @@ gdk_broadway_surface_layout_popup (GdkSurface     *surface,
   gdk_surface_layout_popup_helper (surface,
                                    width,
                                    height,
+                                   impl->shadow_left,
+                                   impl->shadow_right,
+                                   impl->shadow_top,
+                                   impl->shadow_bottom,
                                    monitor,
                                    &bounds,
                                    layout,
@@ -1529,6 +1534,7 @@ gdk_broadway_toplevel_present (GdkToplevel       *toplevel,
                                GdkToplevelLayout *layout)
 {
   GdkSurface *surface = GDK_SURFACE (toplevel);
+  GdkBroadwaySurface *impl = GDK_BROADWAY_SURFACE (surface);
   GdkDisplay *display = gdk_surface_get_display (surface);
   GdkMonitor *monitor;
   GdkToplevelSize size;
@@ -1582,6 +1588,14 @@ gdk_broadway_toplevel_present (GdkToplevel       *toplevel,
   else
     gdk_broadway_surface_unmaximize (surface);
 
+  if (size.margin.is_valid)
+    {
+      impl->shadow_left = size.margin.left;
+      impl->shadow_right = size.margin.right;
+      impl->shadow_top = size.margin.top;
+      impl->shadow_bottom = size.margin.bottom;
+    }
+
   show_surface (surface);
 }
 
diff --git a/gdk/broadway/gdksurface-broadway.h b/gdk/broadway/gdksurface-broadway.h
index 0ca144fc80..95cb02ce6d 100644
--- a/gdk/broadway/gdksurface-broadway.h
+++ b/gdk/broadway/gdksurface-broadway.h
@@ -64,6 +64,11 @@ struct _GdkBroadwaySurface
 
   int root_x;
   int root_y;
+
+  int shadow_left;
+  int shadow_right;
+  int shadow_top;
+  int shadow_bottom;
 };
 
 struct _GdkBroadwaySurfaceClass
diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c
index d0cdcc33f2..e4240a3706 100644
--- a/gdk/gdksurface.c
+++ b/gdk/gdksurface.c
@@ -285,6 +285,10 @@ void
 gdk_surface_layout_popup_helper (GdkSurface     *surface,
                                  int             width,
                                  int             height,
+                                 int             shadow_left,
+                                 int             shadow_right,
+                                 int             shadow_top,
+                                 int             shadow_bottom,
                                  GdkMonitor     *monitor,
                                  GdkRectangle   *bounds,
                                  GdkPopupLayout *layout,
@@ -315,8 +319,8 @@ gdk_surface_layout_popup_helper (GdkSurface     *surface,
   gdk_popup_layout_get_offset (layout, &rect_anchor_dx, &rect_anchor_dy);
   anchor_hints = gdk_popup_layout_get_anchor_hints (layout);
 
-  final_rect.width = width - surface->shadow_left - surface->shadow_right;
-  final_rect.height = height - surface->shadow_top - surface->shadow_bottom;
+  final_rect.width = width - shadow_left - shadow_right;
+  final_rect.height = height - shadow_top - shadow_bottom;
   final_rect.x = maybe_flip_position (bounds->x,
                                       bounds->width,
                                       root_rect.x,
@@ -380,10 +384,10 @@ gdk_surface_layout_popup_helper (GdkSurface     *surface,
         final_rect.height = bounds->y + bounds->height - final_rect.y;
     }
 
-  final_rect.x -= surface->shadow_left;
-  final_rect.y -= surface->shadow_top;
-  final_rect.width += surface->shadow_left + surface->shadow_right;
-  final_rect.height += surface->shadow_top + surface->shadow_bottom;
+  final_rect.x -= shadow_left;
+  final_rect.y -= shadow_top;
+  final_rect.width += shadow_left + shadow_right;
+  final_rect.height += shadow_top + shadow_bottom;
 
   gdk_surface_get_origin (surface->parent, &x, &y);
   final_rect.x -= x;
@@ -2646,53 +2650,6 @@ gdk_surface_set_opaque_region (GdkSurface      *surface,
     class->set_opaque_region (surface, region);
 }
 
-/**
- * gdk_surface_set_shadow_width:
- * @surface: a #GdkSurface
- * @left: The left extent
- * @right: The right extent
- * @top: The top extent
- * @bottom: The bottom extent
- *
- * Newer GTK windows using client-side decorations use extra geometry
- * around their frames for effects like shadows and invisible borders.
- * Window managers that want to maximize windows or snap to edges need
- * to know where the extents of the actual frame lie, so that users
- * don’t feel like windows are snapping against random invisible edges.
- *
- * Note that this property is automatically updated by GTK, so this
- * function should only be used by applications which do not use GTK
- * to create toplevel surfaces.
- */
-void
-gdk_surface_set_shadow_width (GdkSurface *surface,
-                              int        left,
-                              int        right,
-                              int        top,
-                              int        bottom)
-{
-  GdkSurfaceClass *class;
-
-  g_return_if_fail (GDK_IS_SURFACE (surface));
-  g_return_if_fail (!GDK_SURFACE_DESTROYED (surface));
-  g_return_if_fail (left >= 0 && right >= 0 && top >= 0 && bottom >= 0);
-
-  if (surface->shadow_left == left &&
-      surface->shadow_right == right &&
-      surface->shadow_top == top &&
-      surface->shadow_bottom == bottom)
-    return;
-
-  surface->shadow_top = top;
-  surface->shadow_left = left;
-  surface->shadow_right = right;
-  surface->shadow_bottom = bottom;
-
-  class = GDK_SURFACE_GET_CLASS (surface);
-  if (class->set_shadow_width)
-    class->set_shadow_width (surface, left, right, top, bottom);
-}
-
 void
 gdk_surface_set_state (GdkSurface      *surface,
                        GdkToplevelState new_state)
diff --git a/gdk/gdksurface.h b/gdk/gdksurface.h
index 4c47fe659b..4e083ec07b 100644
--- a/gdk/gdksurface.h
+++ b/gdk/gdksurface.h
@@ -128,13 +128,6 @@ GDK_AVAILABLE_IN_ALL
 void       gdk_surface_set_opaque_region        (GdkSurface      *surface,
                                                  cairo_region_t *region);
 
-GDK_AVAILABLE_IN_ALL
-void       gdk_surface_set_shadow_width         (GdkSurface      *surface,
-                                                 int             left,
-                                                 int             right,
-                                                 int             top,
-                                                 int             bottom);
-
 GDK_AVAILABLE_IN_ALL
 GdkCairoContext *gdk_surface_create_cairo_context(GdkSurface    *surface);
 GDK_AVAILABLE_IN_ALL
diff --git a/gdk/gdksurfaceprivate.h b/gdk/gdksurfaceprivate.h
index 6a4a820faa..4fb40a376b 100644
--- a/gdk/gdksurfaceprivate.h
+++ b/gdk/gdksurfaceprivate.h
@@ -84,10 +84,6 @@ struct _GdkSurface
   guint update_and_descendants_freeze_count;
 
   int width, height;
-  int shadow_top;
-  int shadow_left;
-  int shadow_right;
-  int shadow_bottom;
 
   GdkCursor *cursor;
   GHashTable *device_cursor;
@@ -161,11 +157,6 @@ struct _GdkSurfaceClass
 
   void         (* set_opaque_region)      (GdkSurface      *surface,
                                            cairo_region_t *region);
-  void         (* set_shadow_width)       (GdkSurface      *surface,
-                                           int             left,
-                                           int             right,
-                                           int             top,
-                                           int             bottom);
   GdkGLContext *(*create_gl_context)      (GdkSurface      *surface,
                                            gboolean        attached,
                                            GdkGLContext   *share,
@@ -190,6 +181,10 @@ GdkMonitor * gdk_surface_get_layout_monitor (GdkSurface      *surface,
 void gdk_surface_layout_popup_helper (GdkSurface     *surface,
                                       int             width,
                                       int             height,
+                                      int             shadow_left,
+                                      int             shadow_right,
+                                      int             shadow_top,
+                                      int             shadow_bottom,
                                       GdkMonitor     *monitor,
                                       GdkRectangle   *bounds,
                                       GdkPopupLayout *layout,
diff --git a/gdk/macos/gdkmacospopupsurface.c b/gdk/macos/gdkmacospopupsurface.c
index 48c2ca02b8..23c44a70a8 100644
--- a/gdk/macos/gdkmacospopupsurface.c
+++ b/gdk/macos/gdkmacospopupsurface.c
@@ -69,6 +69,10 @@ gdk_macos_popup_surface_layout (GdkMacosPopupSurface *self,
   gdk_surface_layout_popup_helper (GDK_SURFACE (self),
                                    width,
                                    height,
+                                   self->parent_instance.shadow_left,
+                                   self->parent_instance.shadow_right,
+                                   self->parent_instance.shadow_top,
+                                   self->parent_instance.shadow_bottom,
                                    monitor,
                                    &bounds,
                                    self->layout,
diff --git a/gdk/macos/gdkmacossurface-private.h b/gdk/macos/gdkmacossurface-private.h
index 074fd28854..9dd2a7ba52 100644
--- a/gdk/macos/gdkmacossurface-private.h
+++ b/gdk/macos/gdkmacossurface-private.h
@@ -125,6 +125,11 @@ void               _gdk_macos_surface_set_opacity             (GdkMacosSurface
 void               _gdk_macos_surface_get_root_coords         (GdkMacosSurface    *self,
                                                                int                *x,
                                                                int                *y);
+void               _gdk_macos_surface_set_shadow_width        (GdkSurface         *surface,
+                                                               int                 left,
+                                                               int                 right,
+                                                               int                 top,
+                                                               int                 bottom);
 
 G_END_DECLS
 
diff --git a/gdk/macos/gdkmacossurface.c b/gdk/macos/gdkmacossurface.c
index 7c1c03f44d..4f0617e878 100644
--- a/gdk/macos/gdkmacossurface.c
+++ b/gdk/macos/gdkmacossurface.c
@@ -139,7 +139,7 @@ gdk_macos_surface_get_scale_factor (GdkSurface *surface)
   return [self->window backingScaleFactor];
 }
 
-static void
+void
 gdk_macos_surface_set_shadow_width (GdkSurface *surface,
                                     int         left,
                                     int         right,
@@ -491,7 +491,6 @@ gdk_macos_surface_class_init (GdkMacosSurfaceClass *klass)
   surface_class->hide = gdk_macos_surface_hide;
   surface_class->set_input_region = gdk_macos_surface_set_input_region;
   surface_class->set_opaque_region = gdk_macos_surface_set_opaque_region;
-  surface_class->set_shadow_width = gdk_macos_surface_set_shadow_width;
 
   properties [PROP_NATIVE] =
     g_param_spec_pointer ("native",
diff --git a/gdk/macos/gdkmacostoplevelsurface.c b/gdk/macos/gdkmacostoplevelsurface.c
index 7af4725b35..da6b7e6c18 100644
--- a/gdk/macos/gdkmacostoplevelsurface.c
+++ b/gdk/macos/gdkmacostoplevelsurface.c
@@ -155,6 +155,15 @@ _gdk_macos_toplevel_surface_present (GdkToplevel       *toplevel,
   if (style_mask != [nswindow styleMask])
     [nswindow setStyleMask:style_mask];
 
+  if (size.margin.is_valid)
+    {
+      _gdk_macos_surface_set_shadow_width (surface,
+                                           size.margin.left,
+                                           size.margin.right,
+                                           size.margin.top,
+                                           size.margin.bottom);
+    }
+
   _gdk_macos_surface_set_geometry_hints (GDK_MACOS_SURFACE (self), &geometry, mask);
   gdk_surface_constrain_size (&geometry, mask, width, height, &width, &height);
   _gdk_macos_surface_resize (GDK_MACOS_SURFACE (self), width, height);
diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c
index 69d9776131..8282e25ea6 100644
--- a/gdk/wayland/gdksurface-wayland.c
+++ b/gdk/wayland/gdksurface-wayland.c
@@ -1537,6 +1537,7 @@ static void
 gdk_wayland_surface_configure_popup (GdkSurface *surface)
 {
   GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
+  GdkWaylandSurface *parent_impl = GDK_WAYLAND_SURFACE (surface->parent);
   int x, y, width, height;
 
   if (impl->display_server.xdg_popup)
@@ -1576,8 +1577,8 @@ gdk_wayland_surface_configure_popup (GdkSurface *surface)
   width = impl->pending.popup.width;
   height = impl->pending.popup.height;
 
-  x += surface->parent->shadow_left;
-  y += surface->parent->shadow_top;
+  x += parent_impl->margin_left;
+  y += parent_impl->margin_top;
 
   update_popup_layout_state (surface,
                              x, y,
@@ -2449,6 +2450,7 @@ create_dynamic_positioner (GdkSurface     *surface,
 {
   GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
   GdkSurface *parent = surface->parent;
+  GdkWaylandSurface *parent_impl = GDK_WAYLAND_SURFACE (parent);
   GdkWaylandDisplay *display =
     GDK_WAYLAND_DISPLAY (gdk_surface_get_display (surface));
   GdkRectangle geometry;
@@ -2470,8 +2472,8 @@ create_dynamic_positioner (GdkSurface     *surface,
   };
 
   anchor_rect = gdk_popup_layout_get_anchor_rect (layout);
-  real_anchor_rect_x = anchor_rect->x - parent->shadow_left;
-  real_anchor_rect_y = anchor_rect->y - parent->shadow_top;
+  real_anchor_rect_x = anchor_rect->x - parent_impl->margin_left;
+  real_anchor_rect_y = anchor_rect->y - parent_impl->margin_top;
 
   anchor_rect_width = MAX (anchor_rect->width, 1);
   anchor_rect_height = MAX (anchor_rect->height, 1);
@@ -2530,7 +2532,6 @@ create_dynamic_positioner (GdkSurface     *surface,
             xdg_positioner_get_version (positioner) >=
             XDG_POSITIONER_SET_PARENT_CONFIGURE_SINCE_VERSION)
           {
-            GdkWaylandSurface *parent_impl = GDK_WAYLAND_SURFACE (parent);
             int parent_width;
             int parent_height;
 
@@ -4068,15 +4069,6 @@ gdk_wayland_surface_set_opaque_region (GdkSurface     *surface,
   impl->opaque_region_dirty = TRUE;
 }
 
-static void
-gdk_wayland_surface_set_shadow_width (GdkSurface *surface,
-                                      int         left,
-                                      int         right,
-                                      int         top,
-                                      int         bottom)
-{
-}
-
 static gboolean
 gdk_wayland_surface_show_window_menu (GdkSurface *surface,
                                       GdkEvent   *event)
@@ -4161,7 +4153,6 @@ gdk_wayland_surface_class_init (GdkWaylandSurfaceClass *klass)
   impl_class->drag_begin = _gdk_wayland_surface_drag_begin;
   impl_class->get_scale_factor = gdk_wayland_surface_get_scale_factor;
   impl_class->set_opaque_region = gdk_wayland_surface_set_opaque_region;
-  impl_class->set_shadow_width = gdk_wayland_surface_set_shadow_width;
   impl_class->create_gl_context = gdk_wayland_surface_create_gl_context;
   impl_class->request_layout = gdk_wayland_surface_request_layout;
   impl_class->compute_size = gdk_wayland_surface_compute_size;
diff --git a/gdk/win32/gdksurface-win32.c b/gdk/win32/gdksurface-win32.c
index 1f76b5bbb3..238be977af 100644
--- a/gdk/win32/gdksurface-win32.c
+++ b/gdk/win32/gdksurface-win32.c
@@ -1217,6 +1217,7 @@ gdk_win32_surface_layout_popup (GdkSurface     *surface,
                                 int             height,
                                 GdkPopupLayout *layout)
 {
+  GdkWin32Surface *impl = GDK_WIN32_SURFACE (surface);
   GdkMonitor *monitor;
   GdkRectangle bounds;
   GdkRectangle final_rect;
@@ -1229,6 +1230,10 @@ gdk_win32_surface_layout_popup (GdkSurface     *surface,
   gdk_surface_layout_popup_helper (surface,
                                    width,
                                    height,
+                                   impl->margins.left,
+                                   impl->margins.right,
+                                   impl->margins.top,
+                                   impl->margins.bottom,
                                    monitor,
                                    &bounds,
                                    layout,
@@ -4615,8 +4620,6 @@ gdk_win32_surface_class_init (GdkWin32SurfaceClass *klass)
 
   //impl_class->beep = gdk_x11_surface_beep;
 
-
-  impl_class->set_shadow_width = gdk_win32_surface_set_shadow_width;
   impl_class->destroy_notify = gdk_win32_surface_destroy_notify;
   impl_class->drag_begin = _gdk_win32_surface_drag_begin;
   impl_class->create_gl_context = _gdk_win32_surface_create_gl_context;
@@ -4992,6 +4995,15 @@ gdk_win32_toplevel_present (GdkToplevel       *toplevel,
 
   show_surface (surface);
 
+  if (size.margin.is_valid)
+    {
+      gdk_win32_surface_set_shadow_width (surface,
+                                          size.margin.left,
+                                          size.margin.right,
+                                          size.margin.top,
+                                          size.margin.bottom);
+    }
+
   return TRUE;
 }
 
diff --git a/gdk/x11/gdksurface-x11.c b/gdk/x11/gdksurface-x11.c
index a207c8964b..a531659267 100644
--- a/gdk/x11/gdksurface-x11.c
+++ b/gdk/x11/gdksurface-x11.c
@@ -1664,6 +1664,7 @@ gdk_x11_surface_layout_popup (GdkSurface     *surface,
                               int             height,
                               GdkPopupLayout *layout)
 {
+  GdkX11Surface *impl = GDK_X11_SURFACE (surface);
   GdkMonitor *monitor;
   GdkRectangle bounds;
   GdkRectangle final_rect;
@@ -1676,6 +1677,10 @@ gdk_x11_surface_layout_popup (GdkSurface     *surface,
   gdk_surface_layout_popup_helper (surface,
                                    width,
                                    height,
+                                   impl->shadow_left,
+                                   impl->shadow_right,
+                                   impl->shadow_top,
+                                   impl->shadow_bottom,
                                    monitor,
                                    &bounds,
                                    layout,
@@ -2924,15 +2929,6 @@ gdk_x11_surface_set_utf8_property  (GdkSurface *surface,
     }
 }
 
-static void
-gdk_x11_surface_set_shadow_width (GdkSurface *surface,
-                                 int        left,
-                                 int        right,
-                                 int        top,
-                                 int        bottom)
-{
-}
-
 /**
  * gdk_x11_surface_set_theme_variant:
  * @surface: (type GdkX11Surface): a #GdkSurface
@@ -4658,7 +4654,6 @@ gdk_x11_surface_class_init (GdkX11SurfaceClass *klass)
   impl_class->drag_begin = _gdk_x11_surface_drag_begin;
   impl_class->get_scale_factor = gdk_x11_surface_get_scale_factor;
   impl_class->set_opaque_region = gdk_x11_surface_set_opaque_region;
-  impl_class->set_shadow_width = gdk_x11_surface_set_shadow_width;
   impl_class->create_gl_context = gdk_x11_surface_create_gl_context;
   impl_class->get_unscaled_size = gdk_x11_surface_get_unscaled_size;
   impl_class->request_layout = gdk_x11_surface_request_layout;
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 90864cea57..b3f848f8e1 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -4139,10 +4139,6 @@ update_realized_window_properties (GtkWindow *window)
   if (!priv->client_decorated)
     return;
 
-  if (priv->surface && priv->use_client_shadow)
-    gdk_surface_set_shadow_width (priv->surface,
-                                  shadow.left, shadow.right, shadow.top, shadow.bottom);
-
   gtk_native_get_surface_transform (GTK_NATIVE (window), &native_x, &native_y);
 
   /* update the input shape, which makes it so that clicks


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]