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
This commit is contained in:
Jonas Ådahl 2018-10-19 13:33:13 +02:00 committed by Florian Müllner
parent b4f1569640
commit f580b28a27
2 changed files with 32 additions and 20 deletions

View File

@ -818,28 +818,34 @@ constrain_custom_rule (MetaWindow *window,
if (!placement_rule) if (!placement_rule)
return TRUE; 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); parent = meta_window_get_transient_for (window);
meta_window_get_frame_rect (parent, &parent_rect); meta_window_get_frame_rect (parent, &parent_rect);
info->current.x = info->current.x =
parent_rect.x + window->constrained_placement_rule_offset_x; parent_rect.x + window->constrained_placement_rule_offset_x;
info->current.y = info->current.y =
parent_rect.y + window->constrained_placement_rule_offset_y; parent_rect.y + window->constrained_placement_rule_offset_y;
meta_window_get_buffer_rect (parent, &parent_buffer_rect); meta_window_get_buffer_rect (parent, &parent_buffer_rect);
if (!meta_rectangle_overlap (&info->current, &parent_buffer_rect) && if (!meta_rectangle_overlap (&info->current, &parent_buffer_rect) &&
!meta_rectangle_is_adjacent_to (&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"); g_warning ("Buggy client caused popup to be placed outside of "
info->should_unmanage = TRUE; "parent window");
return TRUE; info->should_unmanage = TRUE;
} return TRUE;
}
return TRUE; return TRUE;
}
} }
meta_rectangle_intersect (&info->current, &info->work_area_monitor, meta_rectangle_intersect (&info->current, &info->work_area_monitor,
@ -923,7 +929,7 @@ constrain_custom_rule (MetaWindow *window,
} }
done: done:
window->placement_rule_constrained = TRUE; window->placement_state = META_PLACEMENT_STATE_CONSTRAINED;
parent = meta_window_get_transient_for (window); parent = meta_window_get_transient_for (window);
meta_window_get_frame_rect (parent, &parent_rect); meta_window_get_frame_rect (parent, &parent_rect);

View File

@ -142,6 +142,12 @@ typedef struct _MetaPlacementRule
int height; int height;
} MetaPlacementRule; } MetaPlacementRule;
typedef enum _MetaPlacementState
{
META_PLACEMENT_STATE_UNCONSTRAINED,
META_PLACEMENT_STATE_CONSTRAINED,
} MetaPlacementState;
typedef enum typedef enum
{ {
META_EDGE_CONSTRAINT_NONE = 0, META_EDGE_CONSTRAINT_NONE = 0,
@ -524,7 +530,7 @@ struct _MetaWindow
guint bypass_compositor; guint bypass_compositor;
MetaPlacementRule *placement_rule; MetaPlacementRule *placement_rule;
gboolean placement_rule_constrained; MetaPlacementState placement_state;
int constrained_placement_rule_offset_x; int constrained_placement_rule_offset_x;
int constrained_placement_rule_offset_y; int constrained_placement_rule_offset_y;