[evolution/gnome-3-30] Clamp GSettings values before restoring window size
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/gnome-3-30] Clamp GSettings values before restoring window size
- Date: Mon, 10 Dec 2018 10:12:15 +0000 (UTC)
commit bfa3443f5a018e5ab53f576bd5a6bc8107748a3b
Author: Milan Crha <mcrha redhat com>
Date: Mon Dec 10 11:06:35 2018 +0100
Clamp GSettings values before restoring window size
The GSettings values can be changed by anything, which means the user
can override the last stored window size to some large enough that
the gdk (or WebKitGTK+) will fail to allocated such large pixmap,
which can lead to a crash. This size clamp helps to avoid it.
Related to downstream bug:
https://bugzilla.redhat.com/show_bug.cgi?id=1657361
src/e-util/e-misc-utils.c | 45 ++++++++++++++++++++++++++-------------------
1 file changed, 26 insertions(+), 19 deletions(-)
---
diff --git a/src/e-util/e-misc-utils.c b/src/e-util/e-misc-utils.c
index c6a3db3372..3238e2c690 100644
--- a/src/e-util/e-misc-utils.c
+++ b/src/e-util/e-misc-utils.c
@@ -395,38 +395,45 @@ e_restore_window (GtkWindow *window,
data->flags = flags;
if (flags & E_RESTORE_WINDOW_SIZE) {
- gint width, height;
+ GdkScreen *screen;
+ GdkRectangle monitor_area;
+ gint x, y, width, height, monitor;
+
+ x = g_settings_get_int (settings, "x");
+ y = g_settings_get_int (settings, "y");
+
+ screen = gtk_window_get_screen (window);
+ monitor = gdk_screen_get_monitor_at_point (screen, x, y);
+ if (monitor < 0)
+ monitor = 0;
+
+ if (monitor >= gdk_screen_get_n_monitors (screen))
+ monitor = 0;
+
+ gdk_screen_get_monitor_workarea (
+ screen, monitor, &monitor_area);
width = g_settings_get_int (settings, "width");
height = g_settings_get_int (settings, "height");
+ /* Clamp the GSettings value to actual monitor area before restoring the size */
+ if (width > 0 && height > 0) {
+ if (width > 1.5 * monitor_area.width)
+ width = 1.5 * monitor_area.width;
+
+ if (height > 1.5 * monitor_area.height)
+ height = 1.5 * monitor_area.height;
+ }
+
if (width > 0 && height > 0)
gtk_window_resize (window, width, height);
if (g_settings_get_boolean (settings, "maximized")) {
- GdkScreen *screen;
- GdkRectangle monitor_area;
- gint x, y, monitor;
-
- x = g_settings_get_int (settings, "x");
- y = g_settings_get_int (settings, "y");
-
- screen = gtk_window_get_screen (window);
gtk_window_get_size (window, &width, &height);
data->premax_width = width;
data->premax_height = height;
- monitor = gdk_screen_get_monitor_at_point (screen, x, y);
- if (monitor < 0)
- monitor = 0;
-
- if (monitor >= gdk_screen_get_n_monitors (screen))
- monitor = 0;
-
- gdk_screen_get_monitor_workarea (
- screen, monitor, &monitor_area);
-
gtk_window_resize (
window,
monitor_area.width,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]