window: Handle being headless better

This avoids updating state (such as position, size etc) when going
headless. Eventually, when non-headless, things will be updated again,
and not until then will we be able to update to a valid state.

https://bugzilla.gnome.org/show_bug.cgi?id=730551
This commit is contained in:
Jonas Ådahl 2017-08-18 14:21:11 +08:00
parent dcd15e6145
commit 2df4ccd1cd
2 changed files with 43 additions and 23 deletions

View File

@ -3584,19 +3584,26 @@ meta_window_update_for_monitors_changed (MetaWindow *window)
if (!new)
new = meta_monitor_manager_get_primary_logical_monitor (monitor_manager);
if (window->tile_mode != META_TILE_NONE)
window->tile_monitor_number = new->number;
if (new && old)
{
if (window->tile_mode != META_TILE_NONE)
window->tile_monitor_number = new->number;
/* This will eventually reach meta_window_update_monitor that
* will send leave/enter-monitor events. The old != new monitor
* check will always fail (due to the new logical_monitors set) so
* we will always send the events, even if the new and old monitor
* index is the same. That is right, since the enumeration of the
* monitors changed and the same index could be refereing
* to a different monitor. */
meta_window_move_between_rects (window,
&old->rect,
&new->rect);
/* This will eventually reach meta_window_update_monitor that
* will send leave/enter-monitor events. The old != new monitor
* check will always fail (due to the new logical_monitors set) so
* we will always send the events, even if the new and old monitor
* index is the same. That is right, since the enumeration of the
* monitors changed and the same index could be refereing
* to a different monitor. */
meta_window_move_between_rects (window,
&old->rect,
&new->rect);
}
else
{
meta_window_update_monitor (window, FALSE);
}
}
void
@ -3659,7 +3666,6 @@ meta_window_move_resize_internal (MetaWindow *window,
*/
gboolean did_placement;
guint old_output_winsys_id;
MetaRectangle unconstrained_rect;
MetaRectangle constrained_rect;
MetaMoveResizeResultFlags result = 0;
@ -3713,7 +3719,8 @@ meta_window_move_resize_internal (MetaWindow *window,
g_assert_not_reached ();
constrained_rect = unconstrained_rect;
if (flags & (META_MOVE_RESIZE_MOVE_ACTION | META_MOVE_RESIZE_RESIZE_ACTION))
if (flags & (META_MOVE_RESIZE_MOVE_ACTION | META_MOVE_RESIZE_RESIZE_ACTION) &&
window->monitor)
{
MetaRectangle old_rect;
meta_window_get_frame_rect (window, &old_rect);
@ -3763,13 +3770,22 @@ meta_window_move_resize_internal (MetaWindow *window,
did_placement);
}
old_output_winsys_id = window->monitor->winsys_id;
if (window->monitor)
{
guint old_output_winsys_id;
meta_window_update_monitor (window, flags & META_MOVE_RESIZE_USER_ACTION);
old_output_winsys_id = window->monitor->winsys_id;
if (old_output_winsys_id != window->monitor->winsys_id &&
flags & META_MOVE_RESIZE_MOVE_ACTION && flags & META_MOVE_RESIZE_USER_ACTION)
window->preferred_output_winsys_id = window->monitor->winsys_id;
meta_window_update_monitor (window, flags & META_MOVE_RESIZE_USER_ACTION);
if (old_output_winsys_id != window->monitor->winsys_id &&
flags & META_MOVE_RESIZE_MOVE_ACTION && flags & META_MOVE_RESIZE_USER_ACTION)
window->preferred_output_winsys_id = window->monitor->winsys_id;
}
else
{
meta_window_update_monitor (window, flags & META_MOVE_RESIZE_USER_ACTION);
}
if ((result & META_MOVE_RESIZE_RESULT_FRAME_SHAPE_CHANGED) && window->frame_bounds)
{
@ -5352,7 +5368,7 @@ meta_window_recalc_features (MetaWindow *window)
window->has_maximize_func = FALSE;
}
if (window->has_maximize_func)
if (window->has_maximize_func && window->monitor)
{
MetaRectangle work_area, client_rect;

View File

@ -386,12 +386,16 @@ meta_window_wayland_update_main_monitor (MetaWindow *window,
if (from == to)
return;
if (from == NULL || to == NULL)
{
window->monitor = to;
return;
}
from_scale = meta_logical_monitor_get_scale (from);
to_scale = meta_logical_monitor_get_scale (to);
/* If we are setting the first output, unsetting the output, or the new has
* the same scale as the old no need to do any further checking. */
if (from == NULL || to == NULL || from_scale == to_scale)
if (from_scale == to_scale)
{
window->monitor = to;
return;