You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
3.1 KiB
85 lines
3.1 KiB
From 547af942e6a0586208dbc3f158a7ec2c14611ff8 Mon Sep 17 00:00:00 2001 |
|
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org> |
|
Date: Wed, 12 Mar 2014 02:04:13 +0100 |
|
Subject: [PATCH 1/8] 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 f5360ef9d..3b6203d6b 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} |
|
}; |
|
|
|
@@ -1674,3 +1680,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; |
|
+} |
|
-- |
|
2.14.2 |
|
|
|
|