[mutter] window: Make edge constraint code more readable



commit 640a04d0e4bd8c15a74b23fd449c9c4b2f572e70
Author: Jonas Ådahl <jadahl gmail com>
Date:   Wed Oct 24 14:24:22 2018 +0200

    window: Make edge constraint code more readable
    
    It relied on indices in arrays determining tile direction and
    non-obvious bitmask logic to translate to _GTK_EDGE_CONSTRAINTS. Change
    this to explicitly named edge constraints, and clear translation methods
    that converts between mutters and GTK+s edge constraint formats.

 src/core/window-private.h            | 11 ++---
 src/core/window.c                    | 44 ++++++++++----------
 src/wayland/meta-wayland-gtk-shell.c | 20 ++++-----
 src/x11/window-x11.c                 | 81 +++++++++++++++++++++++++++++++-----
 4 files changed, 107 insertions(+), 49 deletions(-)
---
diff --git a/src/core/window-private.h b/src/core/window-private.h
index c88d1131e..6fc943f72 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -222,11 +222,12 @@ struct _MetaWindow
   guint saved_maximize : 1;
   int tile_monitor_number;
 
-  /* 0 - top
-   * 1 - right
-   * 2 - bottom
-   * 3 - left */
-  MetaEdgeConstraint edge_constraints[4];
+  struct {
+    MetaEdgeConstraint top;
+    MetaEdgeConstraint right;
+    MetaEdgeConstraint bottom;
+    MetaEdgeConstraint left;
+  } edge_constraints;
 
   double tile_hfraction;
 
diff --git a/src/core/window.c b/src/core/window.c
index a053f28a0..d00719e23 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -3074,54 +3074,54 @@ update_edge_constraints (MetaWindow *window)
   switch (window->tile_mode)
     {
     case META_TILE_NONE:
-      window->edge_constraints[0] = META_EDGE_CONSTRAINT_NONE;
-      window->edge_constraints[1] = META_EDGE_CONSTRAINT_NONE;
-      window->edge_constraints[2] = META_EDGE_CONSTRAINT_NONE;
-      window->edge_constraints[3] = META_EDGE_CONSTRAINT_NONE;
+      window->edge_constraints.top = META_EDGE_CONSTRAINT_NONE;
+      window->edge_constraints.right = META_EDGE_CONSTRAINT_NONE;
+      window->edge_constraints.bottom = META_EDGE_CONSTRAINT_NONE;
+      window->edge_constraints.left = META_EDGE_CONSTRAINT_NONE;
       break;
 
     case META_TILE_MAXIMIZED:
-      window->edge_constraints[0] = META_EDGE_CONSTRAINT_MONITOR;
-      window->edge_constraints[1] = META_EDGE_CONSTRAINT_MONITOR;
-      window->edge_constraints[2] = META_EDGE_CONSTRAINT_MONITOR;
-      window->edge_constraints[3] = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.top = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.right = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.bottom = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.left = META_EDGE_CONSTRAINT_MONITOR;
       break;
 
     case META_TILE_LEFT:
-      window->edge_constraints[0] = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.top = META_EDGE_CONSTRAINT_MONITOR;
 
       if (window->tile_match)
-        window->edge_constraints[1] = META_EDGE_CONSTRAINT_WINDOW;
+        window->edge_constraints.right = META_EDGE_CONSTRAINT_WINDOW;
       else
-        window->edge_constraints[1] = META_EDGE_CONSTRAINT_NONE;
+        window->edge_constraints.right = META_EDGE_CONSTRAINT_NONE;
 
-      window->edge_constraints[2] = META_EDGE_CONSTRAINT_MONITOR;
-      window->edge_constraints[3] = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.bottom = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.left = META_EDGE_CONSTRAINT_MONITOR;
       break;
 
     case META_TILE_RIGHT:
-      window->edge_constraints[0] = META_EDGE_CONSTRAINT_MONITOR;
-      window->edge_constraints[1] = META_EDGE_CONSTRAINT_MONITOR;
-      window->edge_constraints[2] = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.top = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.right = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.bottom = META_EDGE_CONSTRAINT_MONITOR;
 
       if (window->tile_match)
-        window->edge_constraints[3] = META_EDGE_CONSTRAINT_WINDOW;
+        window->edge_constraints.left = META_EDGE_CONSTRAINT_WINDOW;
       else
-        window->edge_constraints[3] = META_EDGE_CONSTRAINT_NONE;
+        window->edge_constraints.left = META_EDGE_CONSTRAINT_NONE;
       break;
     }
 
   /* h/vmaximize also modify the edge constraints */
   if (window->maximized_vertically)
     {
-      window->edge_constraints[0] = META_EDGE_CONSTRAINT_MONITOR;
-      window->edge_constraints[2] = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.top = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.bottom = META_EDGE_CONSTRAINT_MONITOR;
     }
 
   if (window->maximized_horizontally)
     {
-      window->edge_constraints[1] = META_EDGE_CONSTRAINT_MONITOR;
-      window->edge_constraints[3] = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.right = META_EDGE_CONSTRAINT_MONITOR;
+      window->edge_constraints.left = META_EDGE_CONSTRAINT_MONITOR;
     }
 }
 
diff --git a/src/wayland/meta-wayland-gtk-shell.c b/src/wayland/meta-wayland-gtk-shell.c
index 474595b18..10ed05137 100644
--- a/src/wayland/meta-wayland-gtk-shell.c
+++ b/src/wayland/meta-wayland-gtk-shell.c
@@ -162,29 +162,25 @@ fill_edge_states (struct wl_array *states,
 {
   uint32_t *s;
 
-  /* Top */
-  if (window->edge_constraints[0] != META_EDGE_CONSTRAINT_MONITOR)
+  if (window->edge_constraints.top != META_EDGE_CONSTRAINT_MONITOR)
     {
       s = wl_array_add (states, sizeof *s);
       *s = GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_TOP;
     }
 
-  /* Right */
-  if (window->edge_constraints[1] != META_EDGE_CONSTRAINT_MONITOR)
+  if (window->edge_constraints.right != META_EDGE_CONSTRAINT_MONITOR)
     {
       s = wl_array_add (states, sizeof *s);
       *s = GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_RIGHT;
     }
 
-  /* Bottom */
-  if (window->edge_constraints[2] != META_EDGE_CONSTRAINT_MONITOR)
+  if (window->edge_constraints.bottom != META_EDGE_CONSTRAINT_MONITOR)
     {
       s = wl_array_add (states, sizeof *s);
       *s = GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_BOTTOM;
     }
 
-  /* Left */
-  if (window->edge_constraints[3] != META_EDGE_CONSTRAINT_MONITOR)
+  if (window->edge_constraints.left != META_EDGE_CONSTRAINT_MONITOR)
     {
       s = wl_array_add (states, sizeof *s);
       *s = GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_LEFT;
@@ -224,28 +220,28 @@ fill_states (struct wl_array    *states,
     }
 
   if (version >= GTK_SURFACE1_STATE_TILED_TOP_SINCE_VERSION &&
-      window->edge_constraints[0] != META_EDGE_CONSTRAINT_NONE)
+      window->edge_constraints.top != META_EDGE_CONSTRAINT_NONE)
     {
       s = wl_array_add (states, sizeof *s);
       *s = GTK_SURFACE1_STATE_TILED_TOP;
     }
 
   if (version >= GTK_SURFACE1_STATE_TILED_RIGHT_SINCE_VERSION &&
-      window->edge_constraints[1] != META_EDGE_CONSTRAINT_NONE)
+      window->edge_constraints.right != META_EDGE_CONSTRAINT_NONE)
     {
       s = wl_array_add (states, sizeof *s);
       *s = GTK_SURFACE1_STATE_TILED_RIGHT;
     }
 
   if (version >= GTK_SURFACE1_STATE_TILED_BOTTOM_SINCE_VERSION &&
-      window->edge_constraints[2] != META_EDGE_CONSTRAINT_NONE)
+      window->edge_constraints.bottom != META_EDGE_CONSTRAINT_NONE)
     {
       s = wl_array_add (states, sizeof *s);
       *s = GTK_SURFACE1_STATE_TILED_BOTTOM;
     }
 
   if (version >= GTK_SURFACE1_STATE_TILED_LEFT_SINCE_VERSION &&
-      window->edge_constraints[3] != META_EDGE_CONSTRAINT_NONE)
+      window->edge_constraints.left != META_EDGE_CONSTRAINT_NONE)
     {
       s = wl_array_add (states, sizeof *s);
       *s = GTK_SURFACE1_STATE_TILED_LEFT;
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index e67cf2a5c..ac304e3fa 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -50,6 +50,18 @@
 #include "x11/window-props.h"
 #include "x11/xprops.h"
 
+enum _MetaGtkEdgeConstraints
+{
+  META_GTK_EDGE_CONSTRAINT_TOP_TILED = 1 << 0,
+  META_GTK_EDGE_CONSTRAINT_TOP_RESIZABLE = 1 << 1,
+  META_GTK_EDGE_CONSTRAINT_RIGHT_TILED = 1 << 2,
+  META_GTK_EDGE_CONSTRAINT_RIGHT_RESIZABLE = 1 << 3,
+  META_GTK_EDGE_CONSTRAINT_BOTTOM_TILED = 1 << 4,
+  META_GTK_EDGE_CONSTRAINT_BOTTOM_RESIZABLE = 1 << 5,
+  META_GTK_EDGE_CONSTRAINT_LEFT_TILED = 1 << 6,
+  META_GTK_EDGE_CONSTRAINT_LEFT_RESIZABLE = 1 << 7
+} MetaGtkEdgeConstraints;
+
 G_DEFINE_TYPE_WITH_PRIVATE (MetaWindowX11, meta_window_x11, META_TYPE_WINDOW)
 
 static void
@@ -906,22 +918,71 @@ update_net_frame_extents (MetaWindow *window)
   meta_x11_error_trap_pop (x11_display);
 }
 
+static gboolean
+is_edge_constraint_resizable (MetaEdgeConstraint constraint)
+{
+  switch (constraint)
+    {
+    case META_EDGE_CONSTRAINT_NONE:
+    case META_EDGE_CONSTRAINT_WINDOW:
+      return TRUE;
+    case META_EDGE_CONSTRAINT_MONITOR:
+      return FALSE;
+    }
+
+  g_assert_not_reached ();
+}
+
+static gboolean
+is_edge_constraint_tiled (MetaEdgeConstraint constraint)
+{
+  switch (constraint)
+    {
+    case META_EDGE_CONSTRAINT_NONE:
+      return FALSE;
+    case META_EDGE_CONSTRAINT_WINDOW:
+    case META_EDGE_CONSTRAINT_MONITOR:
+      return TRUE;
+    }
+
+  g_assert_not_reached ();
+}
+
+static unsigned long
+edge_constraints_to_gtk_edge_constraints (MetaWindow *window)
+{
+  unsigned long gtk_edge_constraints = 0;
+
+  if (is_edge_constraint_tiled (window->edge_constraints.top))
+    gtk_edge_constraints |= META_GTK_EDGE_CONSTRAINT_TOP_TILED;
+  if (is_edge_constraint_resizable (window->edge_constraints.top))
+    gtk_edge_constraints |= META_GTK_EDGE_CONSTRAINT_TOP_RESIZABLE;
+
+  if (is_edge_constraint_tiled (window->edge_constraints.right))
+    gtk_edge_constraints |= META_GTK_EDGE_CONSTRAINT_RIGHT_TILED;
+  if (is_edge_constraint_resizable (window->edge_constraints.right))
+    gtk_edge_constraints |= META_GTK_EDGE_CONSTRAINT_RIGHT_RESIZABLE;
+
+  if (is_edge_constraint_tiled (window->edge_constraints.bottom))
+    gtk_edge_constraints |= META_GTK_EDGE_CONSTRAINT_BOTTOM_TILED;
+  if (is_edge_constraint_resizable (window->edge_constraints.bottom))
+    gtk_edge_constraints |= META_GTK_EDGE_CONSTRAINT_BOTTOM_RESIZABLE;
+
+  if (is_edge_constraint_tiled (window->edge_constraints.left))
+    gtk_edge_constraints |= META_GTK_EDGE_CONSTRAINT_LEFT_TILED;
+  if (is_edge_constraint_resizable (window->edge_constraints.left))
+    gtk_edge_constraints |= META_GTK_EDGE_CONSTRAINT_LEFT_RESIZABLE;
+
+  return gtk_edge_constraints;
+}
+
 static void
 update_gtk_edge_constraints (MetaWindow *window)
 {
   MetaX11Display *x11_display = window->display->x11_display;
-  MetaEdgeConstraint *constraints = window->edge_constraints;
   unsigned long data[1];
 
-  /* Edge constraints */
-  data[0] = (constraints[0] != META_EDGE_CONSTRAINT_NONE ? 1 : 0)    << 0 |
-            (constraints[0] != META_EDGE_CONSTRAINT_MONITOR ? 1 : 0) << 1 |
-            (constraints[1] != META_EDGE_CONSTRAINT_NONE ? 1 : 0)    << 2 |
-            (constraints[1] != META_EDGE_CONSTRAINT_MONITOR ? 1 : 0) << 3 |
-            (constraints[2] != META_EDGE_CONSTRAINT_NONE ? 1 : 0)    << 4 |
-            (constraints[2] != META_EDGE_CONSTRAINT_MONITOR ? 1 : 0) << 5 |
-            (constraints[3] != META_EDGE_CONSTRAINT_NONE ? 1 : 0)    << 6 |
-            (constraints[3] != META_EDGE_CONSTRAINT_MONITOR ? 1 : 0) << 7;
+  data[0] = edge_constraints_to_gtk_edge_constraints (window);
 
   meta_verbose ("Setting _GTK_EDGE_CONSTRAINTS to %lu\n", data[0]);
 


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