From f91851154ebca9851e26b87b664d142be49578af Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Mon, 8 Apr 2024 12:13:45 +0200 Subject: [PATCH] core/window: Do not rely on Monitor Numbering When the monitors change meta_window_update_for_monitors_changed is called which is responsible for updating window->monitor. It however can go through the entire window placement and constraint machinery before it's able to do so. In this period window->monitor points to the old MetaMonitor where the monitor number doesn't reflect the index into the MonitorManager anymore. Avoid relying on the window->monitor->number and go through the Monitor directly. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3402 Part-of: --- src/core/window.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/core/window.c b/src/core/window.c index 47c29d94a..c6c23708e 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -2227,7 +2227,7 @@ meta_window_show (MetaWindow *window) window->has_maximize_func) { MtkRectangle work_area; - meta_window_get_work_area_for_monitor (window, window->monitor->number, &work_area); + meta_window_get_work_area_current_monitor (window, &work_area); /* Automaximize windows that map with a size > MAX_UNMAXIMIZED_WINDOW_AREA of the work area */ if (window->rect.width * window->rect.height > work_area.width * work_area.height * MAX_UNMAXIMIZED_WINDOW_AREA) { @@ -3101,7 +3101,7 @@ meta_window_unmaximize (MetaWindow *window, MtkRectangle old_frame_rect, old_buffer_rect; gboolean has_target_size; - meta_window_get_work_area_for_monitor (window, window->monitor->number, &work_area); + meta_window_get_work_area_current_monitor (window, &work_area); meta_window_get_frame_rect (window, &old_frame_rect); meta_window_get_buffer_rect (window, &old_buffer_rect); @@ -5837,9 +5837,7 @@ void meta_window_get_work_area_current_monitor (MetaWindow *window, MtkRectangle *area) { - meta_window_get_work_area_for_monitor (window, - window->monitor->number, - area); + meta_window_get_work_area_for_logical_monitor (window, window->monitor, area); } /**