[gtk: 44/88] gdk: Always get shadow width via GdkToplevelSize
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk: 44/88] gdk: Always get shadow width via GdkToplevelSize
- Date: Tue, 8 Dec 2020 15:38:41 +0000 (UTC)
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]