From f580b28a27dce071577d718b49e76e864cbaf969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 19 Oct 2018 13:33:13 +0200 Subject: [PATCH] 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 | 44 ++++++++++++++++++++++----------------- src/core/window-private.h | 8 ++++++- 2 files changed, 32 insertions(+), 20 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; + 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; + 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; - } + 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; + 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;