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
This commit is contained in:
Giovanni Campagna 2013-12-14 14:24:27 +01:00
parent 2be5401b1e
commit 0c5a6ad775
2 changed files with 30 additions and 16 deletions

View File

@ -389,6 +389,8 @@ int
meta_screen_monitor_index_to_xinerama_index (MetaScreen *screen, meta_screen_monitor_index_to_xinerama_index (MetaScreen *screen,
int index) int index)
{ {
g_return_val_if_fail (index >= 0 && index < screen->n_monitor_infos, -1);
meta_screen_ensure_xinerama_indices (screen); meta_screen_ensure_xinerama_indices (screen);
return screen->monitor_infos[index].xinerama_index; return screen->monitor_infos[index].xinerama_index;

View File

@ -127,23 +127,35 @@ meta_window_x11_set_net_wm_state (MetaWindow *window)
if (window->fullscreen) if (window->fullscreen)
{ {
data[0] = meta_screen_monitor_index_to_xinerama_index (window->screen, if (window->fullscreen_monitors[0] >= 0)
window->fullscreen_monitors[0]); {
data[1] = meta_screen_monitor_index_to_xinerama_index (window->screen, data[0] = meta_screen_monitor_index_to_xinerama_index (window->screen,
window->fullscreen_monitors[1]); window->fullscreen_monitors[0]);
data[2] = meta_screen_monitor_index_to_xinerama_index (window->screen, data[1] = meta_screen_monitor_index_to_xinerama_index (window->screen,
window->fullscreen_monitors[2]); window->fullscreen_monitors[1]);
data[3] = meta_screen_monitor_index_to_xinerama_index (window->screen, data[2] = meta_screen_monitor_index_to_xinerama_index (window->screen,
window->fullscreen_monitors[3]); 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_verbose ("Setting _NET_WM_FULLSCREEN_MONITORS\n");
meta_error_trap_push (window->display); meta_error_trap_push (window->display);
XChangeProperty (window->display->xdisplay, XChangeProperty (window->display->xdisplay,
window->xwindow, window->xwindow,
window->display->atom__NET_WM_FULLSCREEN_MONITORS, window->display->atom__NET_WM_FULLSCREEN_MONITORS,
XA_CARDINAL, 32, PropModeReplace, XA_CARDINAL, 32, PropModeReplace,
(guchar*) data, 4); (guchar*) data, 4);
meta_error_trap_pop (window->display); 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);
}
} }
} }