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:
parent
b4f1569640
commit
f580b28a27
@ -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);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user