window: Replace 'winsys_id' for monitor matching

Instead use an abstract "logical monitor id" that is generated from the
logical monitor. Instead of using low level numbers from the mode
setting devices, use either data from the EDID, or the connector, if the
EDID is not useful.

This should help with windows remembering monitor positions when the
same monitor reappears but with another mode setting device ID.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3753>
This commit is contained in:
Jonas Ådahl
2024-05-14 17:19:59 +02:00
committed by Marge Bot
parent ad60d7123b
commit 297ae74771
5 changed files with 138 additions and 72 deletions

View File

@ -325,6 +325,9 @@ meta_window_finalize (GObject *object)
if (window->cgroup_path)
g_object_unref (window->cgroup_path);
g_clear_pointer (&window->preferred_logical_monitor,
meta_logical_monitor_id_free);
g_free (window->startup_id);
g_free (window->role);
g_free (window->res_class);
@ -1129,9 +1132,10 @@ meta_window_constructed (GObject *object)
}
if (window->monitor)
window->preferred_output_winsys_id = window->monitor->winsys_id;
else
window->preferred_output_winsys_id = UINT_MAX;
{
window->preferred_logical_monitor =
meta_logical_monitor_dup_id (window->monitor);
}
window->tile_match = NULL;
@ -3662,22 +3666,27 @@ meta_window_get_highest_scale_monitor (MetaWindow *window)
}
static MetaLogicalMonitor *
find_monitor_by_winsys_id (MetaWindow *window,
uint64_t winsys_id)
find_monitor_by_id (MetaWindow *window,
const MetaLogicalMonitorId *id)
{
MetaBackend *backend = backend_from_window (window);
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
GList *logical_monitors, *l;
if (!id)
return NULL;
logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager);
for (l = logical_monitors; l; l = l->next)
{
MetaLogicalMonitor *logical_monitor = l->data;
const MetaLogicalMonitorId *other_id =
meta_logical_monitor_get_id (logical_monitor);
if (logical_monitor->winsys_id == winsys_id)
if (meta_logical_monitor_id_equal (id, other_id))
return logical_monitor;
}
@ -3694,11 +3703,13 @@ meta_window_find_monitor_from_id (MetaWindow *window)
MetaLogicalMonitor *old_monitor = window->monitor;
MetaLogicalMonitor *new_monitor;
new_monitor = find_monitor_by_winsys_id (window,
window->preferred_output_winsys_id);
new_monitor = find_monitor_by_id (window, window->preferred_logical_monitor);
if (old_monitor && !new_monitor)
new_monitor = find_monitor_by_winsys_id (window, old_monitor->winsys_id);
{
new_monitor = find_monitor_by_id (window,
meta_logical_monitor_get_id (old_monitor));
}
if (!new_monitor)
{
@ -3979,15 +3990,21 @@ meta_window_move_resize_internal (MetaWindow *window,
if (window->monitor)
{
uint64_t old_output_winsys_id;
old_output_winsys_id = window->monitor->winsys_id;
const MetaLogicalMonitorId *old_id;
const MetaLogicalMonitorId *new_id;
old_id = meta_logical_monitor_get_id (window->monitor);
meta_window_update_monitor (window, update_monitor_flags);
new_id = meta_logical_monitor_get_id (window->monitor);
if (old_output_winsys_id != window->monitor->winsys_id &&
if (!meta_logical_monitor_id_equal (old_id, new_id) &&
flags & META_MOVE_RESIZE_MOVE_ACTION && flags & META_MOVE_RESIZE_USER_ACTION)
window->preferred_output_winsys_id = window->monitor->winsys_id;
{
g_clear_pointer (&window->preferred_logical_monitor,
meta_logical_monitor_id_free);
window->preferred_logical_monitor =
meta_logical_monitor_id_dup (new_id);
}
}
else
{
@ -4179,7 +4196,10 @@ meta_window_move_to_monitor (MetaWindow *window,
meta_window_move_between_rects (window, 0, &old_area, &new_area);
}
window->preferred_output_winsys_id = window->monitor->winsys_id;
g_clear_pointer (&window->preferred_logical_monitor,
meta_logical_monitor_id_free);
window->preferred_logical_monitor =
meta_logical_monitor_dup_id (window->monitor);
if (window->fullscreen || window->override_redirect)
meta_display_queue_check_fullscreen (window->display);