[gtk+] wayland: Move move_to_rect related code closer together
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] wayland: Move move_to_rect related code closer together
- Date: Wed, 14 Sep 2016 03:49:34 +0000 (UTC)
commit e656a14764f409aaf1e7cc127188b8bdc67bbd7d
Author: Jonas Ådahl <jadahl gmail com>
Date: Mon Sep 12 14:53:51 2016 +0800
wayland: Move move_to_rect related code closer together
Move the code used for calculating the result of move_to_rect
(final_rect, flipped_rect etc) closer to the other move_to_rect
functions (i.e. next to create_dynamic_positioner), and let the
xdg_popup configure handler just call the calculation function.
https://bugzilla.gnome.org/show_bug.cgi?id=771117
gdk/wayland/gdkwindow-wayland.c | 283 ++++++++++++++++++++++-----------------
1 files changed, 157 insertions(+), 126 deletions(-)
---
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index be9bf98..929ee0c 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -229,6 +229,16 @@ static void gdk_wayland_window_sync_opaque_region (GdkWindow *window);
static void unset_transient_for_exported (GdkWindow *window);
+static void calculate_moved_to_rect_result (GdkWindow *window,
+ int x,
+ int y,
+ int width,
+ int height,
+ GdkRectangle *flipped_rect,
+ GdkRectangle *final_rect,
+ gboolean *flipped_x,
+ gboolean *flipped_y);
+
GType _gdk_window_impl_wayland_get_type (void);
G_DEFINE_TYPE (GdkWindowImplWayland, _gdk_window_impl_wayland, GDK_TYPE_WINDOW_IMPL)
@@ -1483,6 +1493,138 @@ gdk_wayland_window_create_xdg_toplevel (GdkWindow *window)
}
static void
+xdg_popup_configure (void *data,
+ struct zxdg_popup_v6 *xdg_popup,
+ int32_t x,
+ int32_t y,
+ int32_t width,
+ int32_t height)
+{
+ GdkWindow *window = GDK_WINDOW (data);
+ GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+ GdkRectangle flipped_rect;
+ GdkRectangle final_rect;
+ gboolean flipped_x;
+ gboolean flipped_y;
+
+ g_return_if_fail (impl->transient_for);
+
+ calculate_moved_to_rect_result (window, x, y, width, height,
+ &flipped_rect,
+ &final_rect,
+ &flipped_x,
+ &flipped_y);
+
+ g_signal_emit_by_name (window,
+ "moved-to-rect",
+ &flipped_rect,
+ &final_rect,
+ flipped_x,
+ flipped_y);
+}
+
+static void
+xdg_popup_done (void *data,
+ struct zxdg_popup_v6 *xdg_popup)
+{
+ GdkWindow *window = GDK_WINDOW (data);
+
+ GDK_NOTE (EVENTS,
+ g_message ("done %p", window));
+
+ gdk_window_hide (window);
+}
+
+static const struct zxdg_popup_v6_listener xdg_popup_listener = {
+ xdg_popup_configure,
+ xdg_popup_done,
+};
+
+static enum zxdg_positioner_v6_anchor
+rect_anchor_to_anchor (GdkGravity rect_anchor)
+{
+ switch (rect_anchor)
+ {
+ case GDK_GRAVITY_NORTH_WEST:
+ case GDK_GRAVITY_STATIC:
+ return (ZXDG_POSITIONER_V6_ANCHOR_TOP |
+ ZXDG_POSITIONER_V6_ANCHOR_LEFT);
+ case GDK_GRAVITY_NORTH:
+ return ZXDG_POSITIONER_V6_ANCHOR_TOP;
+ case GDK_GRAVITY_NORTH_EAST:
+ return (ZXDG_POSITIONER_V6_ANCHOR_TOP |
+ ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
+ case GDK_GRAVITY_WEST:
+ return ZXDG_POSITIONER_V6_ANCHOR_LEFT;
+ case GDK_GRAVITY_CENTER:
+ return ZXDG_POSITIONER_V6_ANCHOR_NONE;
+ case GDK_GRAVITY_EAST:
+ return ZXDG_POSITIONER_V6_ANCHOR_RIGHT;
+ case GDK_GRAVITY_SOUTH_WEST:
+ return (ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
+ ZXDG_POSITIONER_V6_ANCHOR_LEFT);
+ case GDK_GRAVITY_SOUTH:
+ return ZXDG_POSITIONER_V6_ANCHOR_BOTTOM;
+ case GDK_GRAVITY_SOUTH_EAST:
+ return (ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
+ ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+static enum zxdg_positioner_v6_gravity
+window_anchor_to_gravity (GdkGravity rect_anchor)
+{
+ switch (rect_anchor)
+ {
+ case GDK_GRAVITY_NORTH_WEST:
+ case GDK_GRAVITY_STATIC:
+ return (ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
+ ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
+ case GDK_GRAVITY_NORTH:
+ return ZXDG_POSITIONER_V6_ANCHOR_BOTTOM;
+ case GDK_GRAVITY_NORTH_EAST:
+ return (ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
+ ZXDG_POSITIONER_V6_ANCHOR_LEFT);
+ case GDK_GRAVITY_WEST:
+ return ZXDG_POSITIONER_V6_ANCHOR_RIGHT;
+ case GDK_GRAVITY_CENTER:
+ return ZXDG_POSITIONER_V6_ANCHOR_NONE;
+ case GDK_GRAVITY_EAST:
+ return ZXDG_POSITIONER_V6_ANCHOR_LEFT;
+ case GDK_GRAVITY_SOUTH_WEST:
+ return (ZXDG_POSITIONER_V6_ANCHOR_TOP |
+ ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
+ case GDK_GRAVITY_SOUTH:
+ return ZXDG_POSITIONER_V6_ANCHOR_TOP;
+ case GDK_GRAVITY_SOUTH_EAST:
+ return (ZXDG_POSITIONER_V6_ANCHOR_TOP |
+ ZXDG_POSITIONER_V6_ANCHOR_LEFT);
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+static GdkWindow *
+get_real_parent_and_translate (GdkWindow *child,
+ GdkWindow *parent,
+ gint *x,
+ gint *y)
+{
+ while (parent &&
+ !gdk_window_has_native (parent) &&
+ gdk_window_get_effective_parent (parent))
+ {
+ *x += parent->x;
+ *y += parent->y;
+ parent = gdk_window_get_effective_parent (parent);
+ }
+
+ return parent;
+}
+
+static void
calculate_popup_rect (GdkWindow *window,
GdkRectangle anchor_rect,
GdkGravity rect_anchor,
@@ -1648,22 +1790,19 @@ flip_anchor_vertically (GdkGravity anchor)
}
static void
-xdg_popup_configure (void *data,
- struct zxdg_popup_v6 *xdg_popup,
- int32_t x,
- int32_t y,
- int32_t width,
- int32_t height)
+calculate_moved_to_rect_result (GdkWindow *window,
+ int x,
+ int y,
+ int width,
+ int height,
+ GdkRectangle *flipped_rect,
+ GdkRectangle *final_rect,
+ gboolean *flipped_x,
+ gboolean *flipped_y)
{
- GdkWindow *window = GDK_WINDOW (data);
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
GdkRectangle best_rect;
- GdkRectangle flipped_rect;
GdkRectangle geometry;
- GdkRectangle final_rect;
- gboolean flipped_x, flipped_y;
-
- g_return_if_fail (impl->transient_for);
x += impl->transient_for->shadow_left;
y += impl->transient_for->shadow_top;
@@ -1677,14 +1816,14 @@ xdg_popup_configure (void *data,
&best_rect);
gdk_wayland_window_get_window_geometry (window, &geometry);
- final_rect = (GdkRectangle) {
+ *final_rect = (GdkRectangle) {
.x = x,
.y = y,
.width = geometry.width,
.height = geometry.height
};
- flipped_rect = best_rect;
+ *flipped_rect = best_rect;
if (x != best_rect.x &&
impl->pending_move_to_rect.anchor_hints & GDK_ANCHOR_FLIP_X)
@@ -1706,7 +1845,7 @@ xdg_popup_configure (void *data,
&flipped_x_rect);
if (flipped_x_rect.x == x)
- flipped_rect.x = x;
+ flipped_rect->x = x;
}
if (y != best_rect.y &&
impl->pending_move_to_rect.anchor_hints & GDK_ANCHOR_FLIP_Y)
@@ -1728,119 +1867,11 @@ xdg_popup_configure (void *data,
&flipped_y_rect);
if (flipped_y_rect.y == y)
- flipped_rect.y = y;
- }
-
- flipped_x = flipped_rect.x != best_rect.x;
- flipped_y = flipped_rect.y != best_rect.y;
-
- g_signal_emit_by_name (window,
- "moved-to-rect",
- &flipped_rect,
- &final_rect,
- flipped_x,
- flipped_y);
-}
-
-static void
-xdg_popup_done (void *data,
- struct zxdg_popup_v6 *xdg_popup)
-{
- GdkWindow *window = GDK_WINDOW (data);
-
- GDK_NOTE (EVENTS,
- g_message ("done %p", window));
-
- gdk_window_hide (window);
-}
-
-static const struct zxdg_popup_v6_listener xdg_popup_listener = {
- xdg_popup_configure,
- xdg_popup_done,
-};
-
-static enum zxdg_positioner_v6_anchor
-rect_anchor_to_anchor (GdkGravity rect_anchor)
-{
- switch (rect_anchor)
- {
- case GDK_GRAVITY_NORTH_WEST:
- case GDK_GRAVITY_STATIC:
- return (ZXDG_POSITIONER_V6_ANCHOR_TOP |
- ZXDG_POSITIONER_V6_ANCHOR_LEFT);
- case GDK_GRAVITY_NORTH:
- return ZXDG_POSITIONER_V6_ANCHOR_TOP;
- case GDK_GRAVITY_NORTH_EAST:
- return (ZXDG_POSITIONER_V6_ANCHOR_TOP |
- ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
- case GDK_GRAVITY_WEST:
- return ZXDG_POSITIONER_V6_ANCHOR_LEFT;
- case GDK_GRAVITY_CENTER:
- return ZXDG_POSITIONER_V6_ANCHOR_NONE;
- case GDK_GRAVITY_EAST:
- return ZXDG_POSITIONER_V6_ANCHOR_RIGHT;
- case GDK_GRAVITY_SOUTH_WEST:
- return (ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
- ZXDG_POSITIONER_V6_ANCHOR_LEFT);
- case GDK_GRAVITY_SOUTH:
- return ZXDG_POSITIONER_V6_ANCHOR_BOTTOM;
- case GDK_GRAVITY_SOUTH_EAST:
- return (ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
- ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
- default:
- g_assert_not_reached ();
+ flipped_rect->y = y;
}
-}
-static enum zxdg_positioner_v6_gravity
-window_anchor_to_gravity (GdkGravity rect_anchor)
-{
- switch (rect_anchor)
- {
- case GDK_GRAVITY_NORTH_WEST:
- case GDK_GRAVITY_STATIC:
- return (ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
- ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
- case GDK_GRAVITY_NORTH:
- return ZXDG_POSITIONER_V6_ANCHOR_BOTTOM;
- case GDK_GRAVITY_NORTH_EAST:
- return (ZXDG_POSITIONER_V6_ANCHOR_BOTTOM |
- ZXDG_POSITIONER_V6_ANCHOR_LEFT);
- case GDK_GRAVITY_WEST:
- return ZXDG_POSITIONER_V6_ANCHOR_RIGHT;
- case GDK_GRAVITY_CENTER:
- return ZXDG_POSITIONER_V6_ANCHOR_NONE;
- case GDK_GRAVITY_EAST:
- return ZXDG_POSITIONER_V6_ANCHOR_LEFT;
- case GDK_GRAVITY_SOUTH_WEST:
- return (ZXDG_POSITIONER_V6_ANCHOR_TOP |
- ZXDG_POSITIONER_V6_ANCHOR_RIGHT);
- case GDK_GRAVITY_SOUTH:
- return ZXDG_POSITIONER_V6_ANCHOR_TOP;
- case GDK_GRAVITY_SOUTH_EAST:
- return (ZXDG_POSITIONER_V6_ANCHOR_TOP |
- ZXDG_POSITIONER_V6_ANCHOR_LEFT);
- default:
- g_assert_not_reached ();
- }
-}
-
-static GdkWindow *
-get_real_parent_and_translate (GdkWindow *child,
- GdkWindow *parent,
- gint *x,
- gint *y)
-{
- while (parent &&
- !gdk_window_has_native (parent) &&
- gdk_window_get_effective_parent (parent))
- {
- *x += parent->x;
- *y += parent->y;
- parent = gdk_window_get_effective_parent (parent);
- }
-
- return parent;
+ *flipped_x = flipped_rect->x != best_rect.x;
+ *flipped_y = flipped_rect->y != best_rect.y;
}
static struct zxdg_positioner_v6 *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]