summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagna@src.gnome.org>2013-12-14 14:24:27 +0100
committerGiovanni Campagna <gcampagna@src.gnome.org>2014-02-13 13:19:32 +0100
commitb39ef6a9611f5dbd33ec5ba625222efab402c45b (patch)
treec6b9112c784f84213f2dbcf3018d43578b1613dc
parent14dbe8ac8ae6012f9dfc8e356ba9eb267ae11fb2 (diff)
window: don't set _NET_WM_FULLSCREEN_MONITORS to bogus values
Prior to the DisplayConfig merge, we would set _NET_WM_FULLSCREEN_MONITORS to (unsigned)-1 when unset. After that, we would have invalid reads inside meta_screen_monitor_index_to_xinerama_index() (called with -1). The way I read the specification, the proper way to indicate that the window is back to fullscreen on all monitors is to remove the property, so do that. Also, add an assertion that meta_screne_monitor_index_to_xinerama_index() is doing the right thing. https://bugzilla.gnome.org/show_bug.cgi?id=724258
-rw-r--r--src/core/screen.c2
-rw-r--r--src/core/window.c46
2 files changed, 31 insertions, 17 deletions
diff --git a/src/core/screen.c b/src/core/screen.c
index 6ba2e68c..737c6052 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -392,6 +392,8 @@ int
meta_screen_monitor_index_to_xinerama_index (MetaScreen *screen,
int index)
{
+ g_return_val_if_fail (index >= 0 && index < screen->n_monitor_infos, -1);
+
meta_screen_ensure_xinerama_indices (screen);
return screen->monitor_infos[index].xinerama_index;
diff --git a/src/core/window.c b/src/core/window.c
index fdbd3b4a..7a02c013 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -2059,23 +2059,35 @@ set_net_wm_state (MetaWindow *window)
if (window->fullscreen)
{
- data[0] = meta_screen_monitor_index_to_xinerama_index (window->screen,
- window->fullscreen_monitors[0]);
- data[1] = meta_screen_monitor_index_to_xinerama_index (window->screen,
- window->fullscreen_monitors[1]);
- data[2] = meta_screen_monitor_index_to_xinerama_index (window->screen,
- window->fullscreen_monitors[2]);
- data[3] = meta_screen_monitor_index_to_xinerama_index (window->screen,
- window->fullscreen_monitors[3]);
-
- meta_verbose ("Setting _NET_WM_FULLSCREEN_MONITORS\n");
- meta_error_trap_push (window->display);
- XChangeProperty (window->display->xdisplay,
- window->xwindow,
- window->display->atom__NET_WM_FULLSCREEN_MONITORS,
- XA_CARDINAL, 32, PropModeReplace,
- (guchar*) data, 4);
- meta_error_trap_pop (window->display);
+ if (window->fullscreen_monitors[0] >= 0)
+ {
+ data[0] = meta_screen_monitor_index_to_xinerama_index (window->screen,
+ window->fullscreen_monitors[0]);
+ data[1] = meta_screen_monitor_index_to_xinerama_index (window->screen,
+ window->fullscreen_monitors[1]);
+ data[2] = meta_screen_monitor_index_to_xinerama_index (window->screen,
+ window->fullscreen_monitors[2]);
+ data[3] = meta_screen_monitor_index_to_xinerama_index (window->screen,
+ window->fullscreen_monitors[3]);
+
+ meta_verbose ("Setting _NET_WM_FULLSCREEN_MONITORS\n");
+ meta_error_trap_push (window->display);
+ XChangeProperty (window->display->xdisplay,
+ window->xwindow,
+ window->display->atom__NET_WM_FULLSCREEN_MONITORS,
+ XA_CARDINAL, 32, PropModeReplace,
+ (guchar*) data, 4);
+ meta_error_trap_pop (window->display);
+ }
+ else
+ {
+ meta_verbose ("Clearing _NET_WM_FULLSCREEN_MONITORS\n");
+ meta_error_trap_push (window->display);
+ XDeleteProperty (window->display->xdisplay,
+ window->xwindow,
+ window->display->atom__NET_WM_FULLSCREEN_MONITORS);
+ meta_error_trap_pop (window->display);
+ }
}
}