mirror of
https://github.com/brl/mutter.git
synced 2024-11-27 18:40:40 -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_PARTIALLY_VISIBLE_ON_WORKAREA = 4,
|
||||
PRIORITY_CUSTOM_RULE = 4,
|
||||
PRIORITY_XLIMITS = 4,
|
||||
PRIORITY_MAXIMUM = 4 /* Dummy value used for loop end = max(all priorities) */
|
||||
} ConstraintPriority;
|
||||
|
||||
@ -196,6 +197,10 @@ static gboolean constrain_partially_onscreen (MetaWindow *window,
|
||||
ConstraintInfo *info,
|
||||
ConstraintPriority priority,
|
||||
gboolean check_only);
|
||||
static gboolean constrain_xlimits (MetaWindow *window,
|
||||
ConstraintInfo *info,
|
||||
ConstraintPriority priority,
|
||||
gboolean check_only);
|
||||
|
||||
static void setup_constraint_info (ConstraintInfo *info,
|
||||
MetaWindow *window,
|
||||
@ -231,6 +236,7 @@ static const Constraint all_constraints[] = {
|
||||
{constrain_fully_onscreen, "constrain_fully_onscreen"},
|
||||
{constrain_titlebar_visible, "constrain_titlebar_visible"},
|
||||
{constrain_partially_onscreen, "constrain_partially_onscreen"},
|
||||
{constrain_xlimits, "constrain_xlimits"},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
@ -1675,3 +1681,39 @@ constrain_partially_onscreen (MetaWindow *window,
|
||||
|
||||
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