window: Force update monitor on hot plugs

Commit a3da4b8d5b changed updating of
window monitors to always use take affect when it was done from a
non-user operation. This could cause feed back loops when a non-user
driven operation would trigger the changing of a monitor, which itself
would trigger changing of the monitor again due to a window scale
change.

The reason for the change, was that when the window monitor changed due
to a hot plug, if it didn't actually change, eventually the window
monitor pointer would be pointing to freed memory.

Instead of force updating the monitor on all non-user operations, just
do it on hot plugs. This allows for the feedback loop preventing logic
to still do what its supposed to do, without risking dangling pointers
on hot plugs.

Related: https://gitlab.gnome.org/GNOME/mutter/issues/189
Closes: https://gitlab.gnome.org/GNOME/mutter/issues/192
This commit is contained in:
Jonas Ådahl 2018-08-24 12:56:31 +02:00
parent f4d07caa38
commit 8d3e053059
3 changed files with 4 additions and 3 deletions

View File

@ -125,6 +125,7 @@ typedef enum _MetaWindowUpdateMonitorFlags
{
META_WINDOW_UPDATE_MONITOR_FLAGS_NONE = 0,
META_WINDOW_UPDATE_MONITOR_FLAGS_USER_OP = 1 << 0,
META_WINDOW_UPDATE_MONITOR_FLAGS_FORCE = 1 << 1,
} MetaWindowUpdateMonitorFlags;
typedef struct _MetaPlacementRule

View File

@ -3826,7 +3826,7 @@ meta_window_update_for_monitors_changed (MetaWindow *window)
if (window->override_redirect || window->type == META_WINDOW_DESKTOP)
{
meta_window_update_monitor (window,
META_WINDOW_UPDATE_MONITOR_FLAGS_NONE);
META_WINDOW_UPDATE_MONITOR_FLAGS_FORCE);
return;
}
@ -3862,7 +3862,7 @@ meta_window_update_for_monitors_changed (MetaWindow *window)
else
{
meta_window_update_monitor (window,
META_WINDOW_UPDATE_MONITOR_FLAGS_NONE);
META_WINDOW_UPDATE_MONITOR_FLAGS_FORCE);
}
}

View File

@ -413,7 +413,7 @@ meta_window_wayland_update_main_monitor (MetaWindow *window,
return;
}
if (flags & META_WINDOW_UPDATE_MONITOR_FLAGS_USER_OP)
if (flags & META_WINDOW_UPDATE_MONITOR_FLAGS_FORCE)
{
window->monitor = to;
return;