[mutter/wayland] window: don't set _NET_WM_FULLSCREEN_MONITORS to bogus values
- From: Giovanni Campagna <gcampagna src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wayland] window: don't set _NET_WM_FULLSCREEN_MONITORS to bogus values
- Date: Thu, 13 Feb 2014 12:16:58 +0000 (UTC)
commit 0c5a6ad775632356d6c35991ebad1b04ee0b8b68
Author: Giovanni Campagna <gcampagna src gnome org>
Date: Sat Dec 14 14:24:27 2013 +0100
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
src/core/screen.c | 2 ++
src/core/window-x11.c | 46 +++++++++++++++++++++++++++++-----------------
2 files changed, 31 insertions(+), 17 deletions(-)
---
diff --git a/src/core/screen.c b/src/core/screen.c
index e8e8c56..c68ee10 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -389,6 +389,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-x11.c b/src/core/window-x11.c
index d984a59..150390a 100644
--- a/src/core/window-x11.c
+++ b/src/core/window-x11.c
@@ -127,23 +127,35 @@ meta_window_x11_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);
+ }
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]