[mutter] window: Replace placement constrained bool with state



commit f580b28a27dce071577d718b49e76e864cbaf969
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Oct 19 13:33:13 2018 +0200

    window: Replace placement constrained bool with state
    
    Using an actual state instead of a boolean makes it clearer it's a state
    that changes. Eventually we might add more state too.
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/496

 src/core/constraints.c    | 50 ++++++++++++++++++++++++++---------------------
 src/core/window-private.h |  8 +++++++-
 2 files changed, 35 insertions(+), 23 deletions(-)
---
diff --git a/src/core/constraints.c b/src/core/constraints.c
index 67fb92215..445d8539e 100644
--- a/src/core/constraints.c
+++ b/src/core/constraints.c
@@ -818,28 +818,34 @@ constrain_custom_rule (MetaWindow         *window,
   if (!placement_rule)
     return TRUE;
 
-  if (window->placement_rule_constrained)
+  switch (window->placement_state)
     {
-      MetaRectangle parent_buffer_rect;
-
-      parent = meta_window_get_transient_for (window);
-      meta_window_get_frame_rect (parent, &parent_rect);
-      info->current.x =
-        parent_rect.x + window->constrained_placement_rule_offset_x;
-      info->current.y =
-        parent_rect.y + window->constrained_placement_rule_offset_y;
-
-      meta_window_get_buffer_rect (parent, &parent_buffer_rect);
-      if (!meta_rectangle_overlap (&info->current, &parent_buffer_rect) &&
-          !meta_rectangle_is_adjacent_to (&info->current, &parent_buffer_rect))
-        {
-          g_warning ("Buggy client caused popup to be placed outside of parent "
-                     "window");
-          info->should_unmanage = TRUE;
-          return TRUE;
-        }
-
-      return TRUE;
+    case META_PLACEMENT_STATE_UNCONSTRAINED:
+      break;
+    case META_PLACEMENT_STATE_CONSTRAINED:
+      {
+        MetaRectangle parent_buffer_rect;
+
+        parent = meta_window_get_transient_for (window);
+        meta_window_get_frame_rect (parent, &parent_rect);
+        info->current.x =
+          parent_rect.x + window->constrained_placement_rule_offset_x;
+        info->current.y =
+          parent_rect.y + window->constrained_placement_rule_offset_y;
+
+        meta_window_get_buffer_rect (parent, &parent_buffer_rect);
+        if (!meta_rectangle_overlap (&info->current, &parent_buffer_rect) &&
+            !meta_rectangle_is_adjacent_to (&info->current,
+                                            &parent_buffer_rect))
+          {
+            g_warning ("Buggy client caused popup to be placed outside of "
+                       "parent window");
+            info->should_unmanage = TRUE;
+            return TRUE;
+          }
+
+        return TRUE;
+      }
     }
 
   meta_rectangle_intersect (&info->current, &info->work_area_monitor,
@@ -923,7 +929,7 @@ constrain_custom_rule (MetaWindow         *window,
     }
 
 done:
-  window->placement_rule_constrained = TRUE;
+  window->placement_state = META_PLACEMENT_STATE_CONSTRAINED;
 
   parent = meta_window_get_transient_for (window);
   meta_window_get_frame_rect (parent, &parent_rect);
diff --git a/src/core/window-private.h b/src/core/window-private.h
index a6cebb4fb..06be5aad8 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -142,6 +142,12 @@ typedef struct _MetaPlacementRule
   int height;
 } MetaPlacementRule;
 
+typedef enum _MetaPlacementState
+{
+  META_PLACEMENT_STATE_UNCONSTRAINED,
+  META_PLACEMENT_STATE_CONSTRAINED,
+} MetaPlacementState;
+
 typedef enum
 {
   META_EDGE_CONSTRAINT_NONE    = 0,
@@ -524,7 +530,7 @@ struct _MetaWindow
   guint bypass_compositor;
 
   MetaPlacementRule *placement_rule;
-  gboolean placement_rule_constrained;
+  MetaPlacementState placement_state;
   int constrained_placement_rule_offset_x;
   int constrained_placement_rule_offset_y;
 


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