mirror of
https://github.com/brl/mutter.git
synced 2024-11-24 09:00:42 -05:00
constraints: Enforce X11 size limits
X11 limits windows to a maximum of 32767x32767, enforce that restriction to keep insanely huge windows from crashing the WM.
This commit is contained in:
parent
e9d41e0898
commit
7aed7293e3
@ -106,6 +106,7 @@ typedef enum
|
|||||||
PRIORITY_TITLEBAR_VISIBLE = 4,
|
PRIORITY_TITLEBAR_VISIBLE = 4,
|
||||||
PRIORITY_PARTIALLY_VISIBLE_ON_WORKAREA = 4,
|
PRIORITY_PARTIALLY_VISIBLE_ON_WORKAREA = 4,
|
||||||
PRIORITY_CUSTOM_RULE = 4,
|
PRIORITY_CUSTOM_RULE = 4,
|
||||||
|
PRIORITY_XLIMITS = 4,
|
||||||
PRIORITY_MAXIMUM = 4 /* Dummy value used for loop end = max(all priorities) */
|
PRIORITY_MAXIMUM = 4 /* Dummy value used for loop end = max(all priorities) */
|
||||||
} ConstraintPriority;
|
} ConstraintPriority;
|
||||||
|
|
||||||
@ -196,6 +197,10 @@ static gboolean constrain_partially_onscreen (MetaWindow *window,
|
|||||||
ConstraintInfo *info,
|
ConstraintInfo *info,
|
||||||
ConstraintPriority priority,
|
ConstraintPriority priority,
|
||||||
gboolean check_only);
|
gboolean check_only);
|
||||||
|
static gboolean constrain_xlimits (MetaWindow *window,
|
||||||
|
ConstraintInfo *info,
|
||||||
|
ConstraintPriority priority,
|
||||||
|
gboolean check_only);
|
||||||
|
|
||||||
static void setup_constraint_info (ConstraintInfo *info,
|
static void setup_constraint_info (ConstraintInfo *info,
|
||||||
MetaWindow *window,
|
MetaWindow *window,
|
||||||
@ -231,6 +236,7 @@ static const Constraint all_constraints[] = {
|
|||||||
{constrain_fully_onscreen, "constrain_fully_onscreen"},
|
{constrain_fully_onscreen, "constrain_fully_onscreen"},
|
||||||
{constrain_titlebar_visible, "constrain_titlebar_visible"},
|
{constrain_titlebar_visible, "constrain_titlebar_visible"},
|
||||||
{constrain_partially_onscreen, "constrain_partially_onscreen"},
|
{constrain_partially_onscreen, "constrain_partially_onscreen"},
|
||||||
|
{constrain_xlimits, "constrain_xlimits"},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1675,3 +1681,39 @@ constrain_partially_onscreen (MetaWindow *window,
|
|||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_WINDOW_SIZE 32767
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
constrain_xlimits (MetaWindow *window,
|
||||||
|
ConstraintInfo *info,
|
||||||
|
ConstraintPriority priority,
|
||||||
|
gboolean check_only)
|
||||||
|
{
|
||||||
|
int max_w, max_h;
|
||||||
|
gboolean constraint_already_satisfied;
|
||||||
|
|
||||||
|
if (priority > PRIORITY_XLIMITS)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
max_w = max_h = MAX_WINDOW_SIZE;
|
||||||
|
|
||||||
|
if (window->frame)
|
||||||
|
{
|
||||||
|
MetaFrameBorders borders;
|
||||||
|
meta_frame_calc_borders (window->frame, &borders);
|
||||||
|
|
||||||
|
max_w -= (borders.total.left + borders.total.right);
|
||||||
|
max_h -= (borders.total.top + borders.total.bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
constraint_already_satisfied = info->current.width < max_w && info->current.height < max_h;
|
||||||
|
if (check_only || constraint_already_satisfied)
|
||||||
|
return constraint_already_satisfied;
|
||||||
|
|
||||||
|
info->current.width = MIN (info->current.width, max_w);
|
||||||
|
info->current.height = MIN (info->current.height, max_h);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user