From 7aed7293e38ef4e53e06f70748c78314ce03a2f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 12 Mar 2014 02:04:13 +0100 Subject: [PATCH] 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. --- src/core/constraints.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/core/constraints.c b/src/core/constraints.c index 8bfbe73ba..ca3bce9ea 100644 --- a/src/core/constraints.c +++ b/src/core/constraints.c @@ -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; +}