From: Michael Webster Date: Aug 17, 2022 5:03pm GMT+0300 Subject: tiling: Skip the resize effect for tiled windows during user grabs. meta_window_tile ends up being called during each update_resize, but the incremental changes don't need to be animated. Closes: #2246 (https://gitlab.gnome.org/GNOME/mutter/-/issues/2246) Origin: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2579/commits diff --git a/src/core/keybindings.c b/src/core/keybindings.c index 975e68897a25062e2d5dc9f8940366230814f14c..7017d1f75ea4f14218f1bbdc30b017e97dec4c6b 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -3272,7 +3272,7 @@ handle_toggle_tiled (MetaDisplay *display, * save an additional roundtrip. */ window->maximized_horizontally = FALSE; - meta_window_tile (window, mode); + meta_window_tile (window, mode, FALSE); } } diff --git a/src/core/window-private.h b/src/core/window-private.h index 4f269ff37a122ef395ca54b5f4c41c99feb28d65..b127f3f41f0a350bd571d148de3cb3385e1b0aa5 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -665,7 +665,8 @@ void meta_window_untile (MetaWindow *window); META_EXPORT_TEST void meta_window_tile (MetaWindow *window, - MetaTileMode mode); + MetaTileMode mode, + gboolean in_update_resize); MetaTileMode meta_window_get_tile_mode (MetaWindow *window); void meta_window_restore_tile (MetaWindow *window, MetaTileMode mode, diff --git a/src/core/window.c b/src/core/window.c index 0a1a97547ce36bb6717d3bfcd23e2a5f429aab81..7acf503fcabb557a22c807805556e2fd055d801c 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -2817,7 +2817,8 @@ meta_window_get_tile_fraction (MetaWindow *window, static void meta_window_update_tile_fraction (MetaWindow *window, int new_w, - int new_h) + int new_h, + gboolean in_update_resize) { MetaWindow *tile_match = window->tile_match; MetaRectangle work_area; @@ -2831,7 +2832,7 @@ meta_window_update_tile_fraction (MetaWindow *window, window->tile_hfraction = (double)new_w / work_area.width; if (tile_match && window->display->grab_window == window) - meta_window_tile (tile_match, tile_match->tile_mode); + meta_window_tile (tile_match, tile_match->tile_mode, in_update_resize); } static void @@ -2909,7 +2910,8 @@ meta_window_untile (MetaWindow *window) void meta_window_tile (MetaWindow *window, - MetaTileMode tile_mode) + MetaTileMode tile_mode, + gboolean in_update_resize) { MetaMaximizeFlags directions; MetaRectangle old_frame_rect, old_buffer_rect; @@ -2939,12 +2941,15 @@ meta_window_tile (MetaWindow *window, /* Setup the edge constraints */ update_edge_constraints (window); - meta_window_get_frame_rect (window, &old_frame_rect); - meta_window_get_buffer_rect (window, &old_buffer_rect); + if (!in_update_resize) + { + meta_window_get_frame_rect (window, &old_frame_rect); + meta_window_get_buffer_rect (window, &old_buffer_rect); - meta_compositor_size_change_window (window->display->compositor, window, - META_SIZE_CHANGE_MAXIMIZE, - &old_frame_rect, &old_buffer_rect); + meta_compositor_size_change_window (window->display->compositor, window, + META_SIZE_CHANGE_MAXIMIZE, + &old_frame_rect, &old_buffer_rect); + } meta_window_move_resize_internal (window, (META_MOVE_RESIZE_MOVE_ACTION | @@ -2969,8 +2974,8 @@ meta_window_restore_tile (MetaWindow *window, int width, int height) { - meta_window_update_tile_fraction (window, width, height); - meta_window_tile (window, mode); + meta_window_update_tile_fraction (window, width, height, FALSE); + meta_window_tile (window, mode, FALSE); } static gboolean @@ -4149,7 +4154,7 @@ meta_window_resize_frame_with_gravity (MetaWindow *window, */ if (window->display->grab_window == window) adjust_size_for_tile_match (window, &w, &h); - meta_window_update_tile_fraction (window, w, h); + meta_window_update_tile_fraction (window, w, h, TRUE); } flags = (user_op ? META_MOVE_RESIZE_USER_ACTION : 0) | META_MOVE_RESIZE_RESIZE_ACTION; @@ -6212,7 +6217,7 @@ end_grab_op (MetaWindow *window, if (meta_grab_op_is_moving (window->display->grab_op)) { if (window->display->preview_tile_mode != META_TILE_NONE) - meta_window_tile (window, window->display->preview_tile_mode); + meta_window_tile (window, window->display->preview_tile_mode, FALSE); else update_move (window, flags, x, y); } diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c index ed81afbf1ecfc84805696f328d86fa03f3fde9e0..b4f20d2fffcb7870bd4113b9b750f31a14bdd6eb 100644 --- a/src/tests/monitor-unit-tests.c +++ b/src/tests/monitor-unit-tests.c @@ -8352,7 +8352,7 @@ meta_test_monitor_wm_tiling (void) g_error ("Failed to find the window: %s", error->message); meta_test_client_wait_for_window_shown (test_client, test_window); - meta_window_tile (test_window, META_TILE_MAXIMIZED); + meta_window_tile (test_window, META_TILE_MAXIMIZED, FALSE); meta_window_move_to_monitor (test_window, 1); check_test_client_state (test_client); @@ -8384,7 +8384,7 @@ meta_test_monitor_wm_tiling (void) emulate_hotplug (test_setup); meta_window_move_to_monitor (test_window, 1); - meta_window_tile (test_window, META_TILE_NONE); + meta_window_tile (test_window, META_TILE_NONE, FALSE); test_case.setup.n_outputs = 1; test_setup = meta_create_monitor_test_setup (test_backend, @@ -8392,7 +8392,7 @@ meta_test_monitor_wm_tiling (void) MONITOR_TEST_FLAG_NO_STORED); emulate_hotplug (test_setup); - meta_window_tile (test_window, META_TILE_MAXIMIZED); + meta_window_tile (test_window, META_TILE_MAXIMIZED, FALSE); meta_test_client_destroy (test_client); } diff --git a/src/tests/test-runner.c b/src/tests/test-runner.c index 9a9fb9631076987a954284c380ad5ac9200927d3..8eb94f2f8ca806374faaab475b85e925b82af015 100644 --- a/src/tests/test-runner.c +++ b/src/tests/test-runner.c @@ -722,7 +722,7 @@ test_case_do (TestCase *test, return FALSE; } - meta_window_tile (window, tile_mode); + meta_window_tile (window, tile_mode, FALSE); } else if (strcmp (argv[0], "untile") == 0) {