From 6a84b17fb8babd40a866b4ec7d29446edfdc386e Mon Sep 17 00:00:00 2001 From: lenemter Date: Thu, 13 Apr 2023 17:36:23 +0900 Subject: [PATCH 1/7] WorkspaceClone and partially WindowClone --- src/Widgets/WindowClone.vala | 22 +++++++++------------- src/Widgets/WorkspaceClone.vala | 8 ++++---- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/Widgets/WindowClone.vala b/src/Widgets/WindowClone.vala index 5359787f3..86f23fddd 100644 --- a/src/Widgets/WindowClone.vala +++ b/src/Widgets/WindowClone.vala @@ -286,9 +286,11 @@ public class Gala.WindowClone : Clutter.Actor { return; } + var duration = (animate && wm.enable_animations) ? MultitaskingView.ANIMATION_DURATION : 0; + save_easing_state (); set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); - set_easing_duration (animate ? MultitaskingView.ANIMATION_DURATION : 0); + set_easing_duration (duration); set_position (target_x, target_y); set_size (outer_rect.width, outer_rect.height); @@ -305,7 +307,7 @@ public class Gala.WindowClone : Clutter.Actor { window_icon.save_easing_state (); window_icon.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); - window_icon.set_easing_duration (MultitaskingView.ANIMATION_DURATION); + window_icon.set_easing_duration (duration); window_icon.opacity = 0; set_window_icon_position (outer_rect.width, outer_rect.height); window_icon.restore_easing_state (); @@ -364,32 +366,26 @@ public class Gala.WindowClone : Clutter.Actor { return; } + var duration = wm.enable_animations ? MultitaskingView.ANIMATION_DURATION : 0; + save_easing_state (); - set_easing_duration (MultitaskingView.ANIMATION_DURATION); set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); + set_easing_duration (duration); set_size (rect.width, rect.height); set_position (rect.x, rect.y); + opacity = 255; restore_easing_state (); window_icon.save_easing_state (); window_icon.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); - window_icon.set_easing_duration (MultitaskingView.ANIMATION_DURATION); + window_icon.set_easing_duration (duration); window_icon.opacity = 255; set_window_icon_position (rect.width, rect.height); window_icon.restore_easing_state (); toggle_shadow (true); - if (opacity < 255) { - save_easing_state (); - set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); - set_easing_duration (300); - - opacity = 255; - restore_easing_state (); - } - window_icon.get_transition ("opacity").completed.connect (() => { in_slot_animation = false; place_widgets (rect.width, rect.height); diff --git a/src/Widgets/WorkspaceClone.vala b/src/Widgets/WorkspaceClone.vala index 5387877f8..3f80c2c64 100644 --- a/src/Widgets/WorkspaceClone.vala +++ b/src/Widgets/WorkspaceClone.vala @@ -340,7 +340,7 @@ namespace Gala { window_container.restack_windows (); - var display = workspace.get_display (); + unowned var display = workspace.get_display (); var monitor = display.get_monitor_geometry (display.get_primary_monitor ()); var initial_x = is_cancel_animation ? x : x + current_x_overlap (); @@ -360,7 +360,7 @@ namespace Gala { var x = GestureTracker.animation_value (initial_x, target_x, percentage); set_x (x); - double update_scale = (double) GestureTracker.animation_value (1.0f, (float)scale, percentage); + var update_scale = (double) GestureTracker.animation_value (1.0f, (float)scale, percentage); background.set_scale (update_scale, update_scale); }; @@ -370,14 +370,14 @@ namespace Gala { } save_easing_state (); - set_easing_duration (MultitaskingView.ANIMATION_DURATION); set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); + set_easing_duration (wm.enable_animations ? MultitaskingView.ANIMATION_DURATION : 0); set_x (target_x); restore_easing_state (); background.save_easing_state (); - background.set_easing_duration (MultitaskingView.ANIMATION_DURATION); background.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); + background.set_easing_duration (wm.enable_animations ? MultitaskingView.ANIMATION_DURATION : 0); background.set_scale (scale, scale); background.restore_easing_state (); }; From 6064c8b1c877c54eaed7b3b0a508d8f22a8b2d4d Mon Sep 17 00:00:00 2001 From: lenemter Date: Thu, 13 Apr 2023 18:59:07 +0900 Subject: [PATCH 2/7] IconGroup, WindowClone, WorkspaceClone --- src/Widgets/MultitaskingView.vala | 35 ++++++++++++---------- src/Widgets/WindowClone.vala | 48 ++++++++++++++++++++----------- src/Widgets/WorkspaceClone.vala | 8 +++--- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/src/Widgets/MultitaskingView.vala b/src/Widgets/MultitaskingView.vala index 28b75d16d..f3e071a3d 100644 --- a/src/Widgets/MultitaskingView.vala +++ b/src/Widgets/MultitaskingView.vala @@ -355,21 +355,26 @@ namespace Gala { workspaces.restore_easing_state (); if (!is_nudge_animation) { - var active_transition = new Clutter.PropertyTransition ("backdrop-opacity") { - duration = calculated_duration, - remove_on_complete = true - }; - active_transition.set_from_value (active_icon_group.backdrop_opacity); - active_transition.set_to_value (0.0f); - active_icon_group.add_transition ("backdrop-opacity", active_transition); - - var target_transition = new Clutter.PropertyTransition ("backdrop-opacity") { - duration = calculated_duration, - remove_on_complete = true - }; - target_transition.set_from_value (target_icon_group.backdrop_opacity); - target_transition.set_to_value (1.0f); - target_icon_group.add_transition ("backdrop-opacity", target_transition); + if (wm.enable_animations) { + var active_transition = new Clutter.PropertyTransition ("backdrop-opacity") { + duration = duration, + remove_on_complete = true + }; + active_transition.set_from_value (active_icon_group.backdrop_opacity); + active_transition.set_to_value (0.0f); + active_icon_group.add_transition ("backdrop-opacity", active_transition); + + var target_transition = new Clutter.PropertyTransition ("backdrop-opacity") { + duration = duration, + remove_on_complete = true + }; + target_transition.set_from_value (target_icon_group.backdrop_opacity); + target_transition.set_to_value (1.0f); + target_icon_group.add_transition ("backdrop-opacity", target_transition); + } else { + active_icon_group.backdrop_opacity = cancel_action ? 1.0f : 0.0f; + target_icon_group.backdrop_opacity = cancel_action ? 0.0f : 1.0f; + } } diff --git a/src/Widgets/WindowClone.vala b/src/Widgets/WindowClone.vala index 86f23fddd..4d68077e6 100644 --- a/src/Widgets/WindowClone.vala +++ b/src/Widgets/WindowClone.vala @@ -43,7 +43,7 @@ public class Gala.WindowClone : Clutter.Actor { public bool active { set { active_shape.save_easing_state (); - active_shape.set_easing_duration (FADE_ANIMATION_DURATION); + active_shape.set_easing_duration (wm.enable_animations ? FADE_ANIMATION_DURATION : 0); active_shape.opacity = value ? 255 : 0; active_shape.restore_easing_state (); @@ -324,7 +324,7 @@ public class Gala.WindowClone : Clutter.Actor { } }; - if (!animate || gesture_tracker == null || !with_gesture) { + if (!animate || gesture_tracker == null || !with_gesture || !wm.enable_animations) { on_animation_end (1, false, 0); } else { gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end); @@ -386,13 +386,19 @@ public class Gala.WindowClone : Clutter.Actor { toggle_shadow (true); - window_icon.get_transition ("opacity").completed.connect (() => { + var transition = window_icon.get_transition ("opacity"); + if (transition != null) { + transition.completed.connect (() => { + in_slot_animation = false; + place_widgets (rect.width, rect.height); + }); + } else { in_slot_animation = false; place_widgets (rect.width, rect.height); - }); + } }; - if (gesture_tracker == null || !with_gesture) { + if (gesture_tracker == null || !with_gesture || !wm.enable_animations) { on_animation_end (1, false, 0); } else { gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end); @@ -437,15 +443,17 @@ public class Gala.WindowClone : Clutter.Actor { return Gdk.EVENT_PROPAGATE; } + var duration = wm.enable_animations ? FADE_ANIMATION_DURATION : 0; + close_button.save_easing_state (); close_button.set_easing_mode (Clutter.AnimationMode.LINEAR); - close_button.set_easing_duration (wm.enable_animations ? FADE_ANIMATION_DURATION : 0); + close_button.set_easing_duration (duration); close_button.opacity = in_slot_animation ? 0 : 255; close_button.restore_easing_state (); window_title.save_easing_state (); window_title.set_easing_mode (Clutter.AnimationMode.LINEAR); - window_title.set_easing_duration (wm.enable_animations ? FADE_ANIMATION_DURATION : 0); + window_title.set_easing_duration (duration); window_title.opacity = in_slot_animation ? 0 : 255; window_title.restore_easing_state (); @@ -453,15 +461,17 @@ public class Gala.WindowClone : Clutter.Actor { } public override bool leave_event (Clutter.CrossingEvent event) { + var duration = wm.enable_animations ? FADE_ANIMATION_DURATION : 0; + close_button.save_easing_state (); close_button.set_easing_mode (Clutter.AnimationMode.LINEAR); - close_button.set_easing_duration (wm.enable_animations ? FADE_ANIMATION_DURATION : 0); + close_button.set_easing_duration (duration); close_button.opacity = 0; close_button.restore_easing_state (); window_title.save_easing_state (); window_title.set_easing_mode (Clutter.AnimationMode.LINEAR); - window_title.set_easing_duration (wm.enable_animations ? FADE_ANIMATION_DURATION : 0); + window_title.set_easing_duration (duration); window_title.opacity = 0; window_title.restore_easing_state (); @@ -497,14 +507,18 @@ public class Gala.WindowClone : Clutter.Actor { remove_transition ("shadow-opacity"); } - var shadow_transition = new Clutter.PropertyTransition ("shadow-opacity") { - duration = MultitaskingView.ANIMATION_DURATION, - remove_on_complete = true, - progress_mode = Clutter.AnimationMode.EASE_OUT_QUAD, - interval = new Clutter.Interval (typeof (uint8), shadow_opacity, show ? 255 : 0) - }; - - add_transition ("shadow-opacity", shadow_transition); + if (wm.enable_animations) { + var shadow_transition = new Clutter.PropertyTransition ("shadow-opacity") { + duration = MultitaskingView.ANIMATION_DURATION, + remove_on_complete = true, + progress_mode = Clutter.AnimationMode.EASE_OUT_QUAD, + interval = new Clutter.Interval (typeof (uint8), shadow_opacity, show ? 255 : 0) + }; + + add_transition ("shadow-opacity", shadow_transition); + } else { + shadow_opacity = 255; + } } /** diff --git a/src/Widgets/WorkspaceClone.vala b/src/Widgets/WorkspaceClone.vala index 3f80c2c64..e0fa5b880 100644 --- a/src/Widgets/WorkspaceClone.vala +++ b/src/Widgets/WorkspaceClone.vala @@ -382,7 +382,7 @@ namespace Gala { background.restore_easing_state (); }; - if (!with_gesture) { + if (!with_gesture || !wm.enable_animations) { on_animation_begin (0); on_animation_end (1, false, 0); } else { @@ -442,19 +442,19 @@ namespace Gala { } save_easing_state (); - set_easing_duration (MultitaskingView.ANIMATION_DURATION); set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); + set_easing_duration (wm.enable_animations ? MultitaskingView.ANIMATION_DURATION : 0); set_x (target_x); restore_easing_state (); background.save_easing_state (); - background.set_easing_duration (MultitaskingView.ANIMATION_DURATION); background.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); + background.set_easing_duration (wm.enable_animations ? MultitaskingView.ANIMATION_DURATION : 0); background.set_scale (1, 1); background.restore_easing_state (); }; - if (!with_gesture) { + if (!with_gesture || !wm.enable_animations) { on_animation_end (1, false, 0); } else { gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end); From 8f1f54084b50db2dc815948892af5442c56a912f Mon Sep 17 00:00:00 2001 From: lenemter Date: Thu, 13 Apr 2023 20:14:06 +0900 Subject: [PATCH 3/7] MultitaskingView --- src/Widgets/MultitaskingView.vala | 56 ++++++++++++++++++------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/src/Widgets/MultitaskingView.vala b/src/Widgets/MultitaskingView.vala index 1c2db2fff..5019d0a01 100644 --- a/src/Widgets/MultitaskingView.vala +++ b/src/Widgets/MultitaskingView.vala @@ -378,21 +378,31 @@ namespace Gala { } - workspaces.get_transition ("x").completed.connect (() => { + var transition = workspaces.get_transition ("x"); + if (transition != null) { + transition.completed.connect (() => { + workspace_gesture_tracker.enabled = true; + + if (!is_nudge_animation && !cancel_action) { + manager.get_workspace_by_index (target_workspace_index).activate (display.get_current_time ()); + update_positions (false); + } + }); + } else { workspace_gesture_tracker.enabled = true; - + if (!is_nudge_animation && !cancel_action) { manager.get_workspace_by_index (target_workspace_index).activate (display.get_current_time ()); update_positions (false); - } else { - // Reset easing parameters either way. - // This stops the animation from causing touch events to "lag" behind. - workspaces.set_easing_duration (0); } - }); + } }; - workspace_gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end); + if (!wm.enable_animations) { + on_animation_end (1, false, 0); + } else { + workspace_gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end); + } } /** @@ -420,13 +430,13 @@ namespace Gala { } workspace_clone.save_easing_state (); - workspace_clone.set_easing_duration (animate ? 200 : 0); + workspace_clone.set_easing_duration ((animate && wm.enable_animations) ? 200 : 0); workspace_clone.x = dest_x; workspace_clone.restore_easing_state (); } workspaces.save_easing_state (); - workspaces.set_easing_duration (animate ? AnimationDuration.WORKSPACE_SWITCH_MIN : 0); + workspaces.set_easing_duration ((animate && wm.enable_animations) ? AnimationDuration.WORKSPACE_SWITCH_MIN : 0); workspaces.x = -active_x; workspaces.restore_easing_state (); @@ -634,6 +644,11 @@ namespace Gala { return; } + // we don't want to handle cancel animation when animation are off + if (is_cancel_animation && !wm.enable_animations) { + return; + } + animating = true; opened = !opened; @@ -774,9 +789,7 @@ namespace Gala { var clone = new SafeWindowClone (window, true); dock_clones.add_child (clone); - GestureTracker.OnBegin on_animation_begin = () => { - clone.set_position (initial_x, initial_y); - }; + clone.set_position (initial_x, initial_y); GestureTracker.OnUpdate on_animation_update = (percentage) => { var y = GestureTracker.animation_value (initial_y, target_y, percentage); @@ -790,16 +803,15 @@ namespace Gala { clone.save_easing_state (); clone.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); - clone.set_easing_duration (is_cancel_animation ? 0 : ANIMATION_DURATION); + clone.set_easing_duration ((!is_cancel_animation && wm.enable_animations) ? ANIMATION_DURATION : 0); clone.y = target_y; clone.restore_easing_state (); }; - if (!with_gesture) { - on_animation_begin (0); + if (!with_gesture || !wm.enable_animations) { on_animation_end (1, false, 0); } else { - multitasking_gesture_tracker.connect_handlers ((owned) on_animation_begin, (owned) on_animation_update, (owned) on_animation_end); + multitasking_gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end); } } } @@ -810,10 +822,6 @@ namespace Gala { var initial_y = dock.y; var target_y = dock.source.y; - GestureTracker.OnBegin on_animation_begin = () => { - dock.set_easing_duration (0); - }; - GestureTracker.OnUpdate on_animation_update = (percentage) => { var y = GestureTracker.animation_value (initial_y, target_y, percentage); dock.y = y; @@ -825,16 +833,16 @@ namespace Gala { } dock.save_easing_state (); - dock.set_easing_duration (ANIMATION_DURATION); dock.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); + dock.set_easing_duration (wm.enable_animations ? ANIMATION_DURATION : 0); dock.y = target_y; dock.restore_easing_state (); }; - if (!with_gesture) { + if (!with_gesture || !wm.enable_animations) { on_animation_end (1, false, 0); } else { - multitasking_gesture_tracker.connect_handlers ((owned) on_animation_begin, (owned) on_animation_update, (owned) on_animation_end); + multitasking_gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end); } } } From 10b875f36c16cca2b1a392f78ce3a1ec09f8f83d Mon Sep 17 00:00:00 2001 From: lenemter Date: Thu, 13 Apr 2023 20:53:04 +0900 Subject: [PATCH 4/7] IconGroup --- src/Widgets/IconGroup.vala | 31 +++++++++++++-------------- src/Widgets/IconGroupContainer.vala | 8 ++++--- src/Widgets/MonitorClone.vala | 1 - src/Widgets/MultitaskingView.vala | 2 +- src/Widgets/WindowClone.vala | 19 ++++++++-------- src/Widgets/WindowCloneContainer.vala | 1 - src/Widgets/WindowIconActor.vala | 25 ++++++--------------- src/Widgets/WorkspaceInsertThumb.vala | 12 ++++++++--- 8 files changed, 46 insertions(+), 53 deletions(-) diff --git a/src/Widgets/IconGroup.vala b/src/Widgets/IconGroup.vala index 40a48a436..d8e17055a 100644 --- a/src/Widgets/IconGroup.vala +++ b/src/Widgets/IconGroup.vala @@ -231,12 +231,8 @@ namespace Gala { * the group. */ public void add_window (Meta.Window window, bool no_redraw = false, bool temporary = false) { - var new_window = new WindowIconActor (window); - - new_window.save_easing_state (); - new_window.set_easing_duration (0); + var new_window = new WindowIconActor (wm, window); new_window.set_position (32, 32); - new_window.restore_easing_state (); new_window.temporary = temporary; icon_container.add_child (new_window); @@ -251,25 +247,28 @@ namespace Gala { * @param animate Whether to fade the icon out before removing it */ public void remove_window (Meta.Window window, bool animate = true) { - foreach (var child in icon_container.get_children ()) { - unowned WindowIconActor w = (WindowIconActor) child; - if (w.window == window) { + foreach (unowned var child in icon_container.get_children ()) { + unowned var icon = (WindowIconActor) child; + if (icon.window == window) { if (animate) { - w.set_easing_mode (Clutter.AnimationMode.LINEAR); - w.set_easing_duration (200); - w.opacity = 0; + icon.save_easing_state (); + icon.set_easing_mode (Clutter.AnimationMode.LINEAR); + icon.set_easing_duration (wm.enable_animations ? 200 : 0); + icon.opacity = 0; + icon.restore_easing_state (); - var transition = w.get_transition ("opacity"); + var transition = icon.get_transition ("opacity"); if (transition != null) { transition.completed.connect (() => { - w.destroy (); + icon.destroy (); }); } else { - w.destroy (); + icon.destroy (); } - } else - w.destroy (); + } else { + icon.destroy (); + } // don't break here! If people spam hover events and we animate // removal, we can actually multiple instances of the same window icon diff --git a/src/Widgets/IconGroupContainer.vala b/src/Widgets/IconGroupContainer.vala index 100a30e3d..f3ad1e9ce 100644 --- a/src/Widgets/IconGroupContainer.vala +++ b/src/Widgets/IconGroupContainer.vala @@ -25,6 +25,8 @@ namespace Gala { public const int SPACING = 48; public const int GROUP_WIDTH = 64; + public WindowManager wm { get; construct; } + public signal void request_reposition (bool animate); private float _scale_factor = 1.0f; @@ -40,8 +42,8 @@ namespace Gala { } } - public IconGroupContainer (float scale) { - Object (scale_factor: scale); + public IconGroupContainer (WindowManager wm, float scale) { + Object (wm: wm, scale_factor: scale); layout_manager = new Clutter.BoxLayout (); } @@ -60,7 +62,7 @@ namespace Gala { insert_child_at_index (group, index * 2); - var thumb = new WorkspaceInsertThumb (index, scale_factor); + var thumb = new WorkspaceInsertThumb (wm, index, scale_factor); thumb.notify["expanded"].connect_after (expanded_changed); insert_child_at_index (thumb, index * 2); diff --git a/src/Widgets/MonitorClone.vala b/src/Widgets/MonitorClone.vala index 8f9ecfc94..0b7e6bca2 100644 --- a/src/Widgets/MonitorClone.vala +++ b/src/Widgets/MonitorClone.vala @@ -42,7 +42,6 @@ namespace Gala { reactive = true; background = new BackgroundManager (display, monitor, false); - background.set_easing_duration (MultitaskingView.ANIMATION_DURATION); window_container = new WindowCloneContainer (wm, gesture_tracker); window_container.window_selected.connect ((w) => { window_selected (w); }); diff --git a/src/Widgets/MultitaskingView.vala b/src/Widgets/MultitaskingView.vala index 5019d0a01..ffd634c31 100644 --- a/src/Widgets/MultitaskingView.vala +++ b/src/Widgets/MultitaskingView.vala @@ -72,7 +72,7 @@ namespace Gala { workspaces = new Clutter.Actor (); workspaces.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); - icon_groups = new IconGroupContainer (display.get_monitor_scale (display.get_primary_monitor ())); + icon_groups = new IconGroupContainer (wm, display.get_monitor_scale (display.get_primary_monitor ())); dock_clones = new Clutter.Actor (); diff --git a/src/Widgets/WindowClone.vala b/src/Widgets/WindowClone.vala index 4d68077e6..27c740d14 100644 --- a/src/Widgets/WindowClone.vala +++ b/src/Widgets/WindowClone.vala @@ -517,7 +517,7 @@ public class Gala.WindowClone : Clutter.Actor { add_transition ("shadow-opacity", shadow_transition); } else { - shadow_opacity = 255; + shadow_opacity = show ? 255 : 0; } } @@ -599,10 +599,11 @@ public class Gala.WindowClone : Clutter.Actor { active_shape.hide (); var scale = window_icon.width / clone.width; + var duration = wm.enable_animations ? FADE_ANIMATION_DURATION : 0; clone.get_transformed_position (out abs_x, out abs_y); clone.save_easing_state (); - clone.set_easing_duration (FADE_ANIMATION_DURATION); + clone.set_easing_duration (duration); clone.set_easing_mode (Clutter.AnimationMode.EASE_IN_CUBIC); clone.set_scale (scale, scale); clone.opacity = 0; @@ -613,12 +614,10 @@ public class Gala.WindowClone : Clutter.Actor { get_transformed_position (out abs_x, out abs_y); - save_easing_state (); - set_easing_duration (0); set_position (abs_x + prev_parent_x, abs_y + prev_parent_y); window_icon.save_easing_state (); - window_icon.set_easing_duration (FADE_ANIMATION_DURATION); + window_icon.set_easing_duration (duration); window_icon.set_easing_mode (Clutter.AnimationMode.EASE_IN_OUT_CUBIC); window_icon.set_position (click_x - (abs_x + prev_parent_x) - window_icon.width / 2, click_y - (abs_y + prev_parent_y) - window_icon.height / 2); @@ -655,6 +654,7 @@ public class Gala.WindowClone : Clutter.Actor { var scale = hovered ? 0.4 : 1.0; var opacity = hovered ? 0 : 255; var duration = hovered && insert_thumb != null ? insert_thumb.delay : 100; + duration = wm.enable_animations ? duration : 0; window_icon.save_easing_state (); @@ -758,9 +758,11 @@ public class Gala.WindowClone : Clutter.Actor { get_parent ().remove_child (this); prev_parent.insert_child_at_index (this, prev_index); + var duration = wm.enable_animations ? MultitaskingView.ANIMATION_DURATION : 0; + clone.save_easing_state (); clone.set_pivot_point (0.0f, 0.0f); - clone.set_easing_duration (250); + clone.set_easing_duration (duration); clone.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); clone.set_scale (1, 1); clone.opacity = 255; @@ -768,11 +770,8 @@ public class Gala.WindowClone : Clutter.Actor { request_reposition (); - // pop 0 animation duration from drag_begin() - restore_easing_state (); - window_icon.save_easing_state (); - window_icon.set_easing_duration (250); + window_icon.set_easing_duration (duration); window_icon.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); set_window_icon_position (slot.width, slot.height); window_icon.restore_easing_state (); diff --git a/src/Widgets/WindowCloneContainer.vala b/src/Widgets/WindowCloneContainer.vala index 4ac7b3e24..051d6b2af 100644 --- a/src/Widgets/WindowCloneContainer.vala +++ b/src/Widgets/WindowCloneContainer.vala @@ -190,7 +190,6 @@ namespace Gala { foreach (var tilable in window_positions) { unowned var clone = (WindowClone) tilable.id; clone.take_slot (tilable.rect, with_gesture, is_cancel_animation); - clone.place_widgets (tilable.rect.width, tilable.rect.height); } } diff --git a/src/Widgets/WindowIconActor.vala b/src/Widgets/WindowIconActor.vala index 6df8d64b1..96b588399 100644 --- a/src/Widgets/WindowIconActor.vala +++ b/src/Widgets/WindowIconActor.vala @@ -23,6 +23,7 @@ namespace Gala { */ public class WindowIconActor : Clutter.Actor { public Meta.Window window { get; construct; } + public WindowManager wm { get; construct; } private float cur_icon_scale = 1.0f; private float desired_icon_scale = 1.0f; @@ -64,7 +65,7 @@ namespace Gala { set { if (_temporary && !value) { remove_transition ("pulse"); - } else if (!_temporary && value) { + } else if (!_temporary && value && wm.enable_animations) { var transition = new Clutter.TransitionGroup () { duration = 800, auto_reverse = true, @@ -98,19 +99,15 @@ namespace Gala { } } - private bool initial = true; - private WindowIcon? icon = null; private WindowIcon? old_icon = null; - public WindowIconActor (Meta.Window window) { - Object (window: window); + public WindowIconActor (WindowManager wm, Meta.Window window) { + Object (wm: wm, window: window); } construct { set_pivot_point (0.5f, 0.5f); - set_easing_mode (Clutter.AnimationMode.EASE_OUT_ELASTIC); - set_easing_duration (800); window.notify["on-all-workspaces"].connect (on_all_workspaces_changed); } @@ -133,19 +130,9 @@ namespace Gala { * @param size The size to which to animate to and display the icon in */ public void place (float x, float y, int size, float scale) { - if (initial) { - save_easing_state (); - set_easing_duration (10); - } - desired_icon_scale = scale; set_position (x, y); icon_size = size; - - if (initial) { - restore_easing_state (); - initial = false; - } } /** @@ -158,8 +145,10 @@ namespace Gala { add_child (new_icon); + new_icon.save_easing_state (); new_icon.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); - new_icon.set_easing_duration (500); + new_icon.set_easing_duration (wm.enable_animations ? 500 : 0); + new_icon.restore_easing_state (); if (icon == null) { icon = new_icon; diff --git a/src/Widgets/WorkspaceInsertThumb.vala b/src/Widgets/WorkspaceInsertThumb.vala index 14149bb3a..9ef9646a2 100644 --- a/src/Widgets/WorkspaceInsertThumb.vala +++ b/src/Widgets/WorkspaceInsertThumb.vala @@ -7,6 +7,8 @@ public class Gala.WorkspaceInsertThumb : Clutter.Actor { public const int EXPAND_DELAY = 300; + public WindowManager wm { get; construct; } + public int workspace_index { get; construct set; } public bool expanded { get; set; default = false; } public int delay { get; set; default = EXPAND_DELAY; } @@ -25,8 +27,8 @@ public class Gala.WorkspaceInsertThumb : Clutter.Actor { private uint expand_timeout = 0; - public WorkspaceInsertThumb (int workspace_index, float scale) { - Object (workspace_index: workspace_index, scale_factor: scale); + public WorkspaceInsertThumb (WindowManager wm, int workspace_index, float scale) { + Object (wm: wm, workspace_index: workspace_index, scale_factor: scale); reallocate (); opacity = 0; @@ -82,7 +84,7 @@ public class Gala.WorkspaceInsertThumb : Clutter.Actor { private new void transform (bool expand) { save_easing_state (); set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); - set_easing_duration (200); + set_easing_duration (wm.enable_animations ? 200 : 0); if (!expand) { remove_transition ("pulse"); @@ -100,6 +102,10 @@ public class Gala.WorkspaceInsertThumb : Clutter.Actor { } private void add_pulse_animation () { + if (!wm.enable_animations) { + return; + } + var transition = new Clutter.TransitionGroup () { duration = 800, auto_reverse = true, From c988911d4a9d7d2dacb6ef243ebb2d4bb4426927 Mon Sep 17 00:00:00 2001 From: lenemter Date: Thu, 13 Apr 2023 20:57:54 +0900 Subject: [PATCH 5/7] The last thing --- src/Widgets/WindowClone.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Widgets/WindowClone.vala b/src/Widgets/WindowClone.vala index 27c740d14..33357688c 100644 --- a/src/Widgets/WindowClone.vala +++ b/src/Widgets/WindowClone.vala @@ -602,12 +602,12 @@ public class Gala.WindowClone : Clutter.Actor { var duration = wm.enable_animations ? FADE_ANIMATION_DURATION : 0; clone.get_transformed_position (out abs_x, out abs_y); + clone.set_pivot_point ((click_x - abs_x) / clone.width, (click_y - abs_y) / clone.height); clone.save_easing_state (); clone.set_easing_duration (duration); clone.set_easing_mode (Clutter.AnimationMode.EASE_IN_CUBIC); clone.set_scale (scale, scale); clone.opacity = 0; - clone.set_pivot_point ((click_x - abs_x) / clone.width, (click_y - abs_y) / clone.height); clone.restore_easing_state (); request_reposition (); @@ -760,8 +760,8 @@ public class Gala.WindowClone : Clutter.Actor { var duration = wm.enable_animations ? MultitaskingView.ANIMATION_DURATION : 0; - clone.save_easing_state (); clone.set_pivot_point (0.0f, 0.0f); + clone.save_easing_state (); clone.set_easing_duration (duration); clone.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD); clone.set_scale (1, 1); From e368e35cac44850a74e6e0fe19daa48d0253c604 Mon Sep 17 00:00:00 2001 From: lenemter Date: Thu, 13 Apr 2023 21:00:35 +0900 Subject: [PATCH 6/7] The very last thing --- src/Widgets/WindowClone.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Widgets/WindowClone.vala b/src/Widgets/WindowClone.vala index 33357688c..cd52278a8 100644 --- a/src/Widgets/WindowClone.vala +++ b/src/Widgets/WindowClone.vala @@ -602,10 +602,10 @@ public class Gala.WindowClone : Clutter.Actor { var duration = wm.enable_animations ? FADE_ANIMATION_DURATION : 0; clone.get_transformed_position (out abs_x, out abs_y); - clone.set_pivot_point ((click_x - abs_x) / clone.width, (click_y - abs_y) / clone.height); clone.save_easing_state (); clone.set_easing_duration (duration); clone.set_easing_mode (Clutter.AnimationMode.EASE_IN_CUBIC); + clone.set_pivot_point ((click_x - abs_x) / clone.width, (click_y - abs_y) / clone.height); clone.set_scale (scale, scale); clone.opacity = 0; clone.restore_easing_state (); From bafac202e556d66a3c9a5c40d25786cc15e8811e Mon Sep 17 00:00:00 2001 From: lenemter Date: Thu, 13 Apr 2023 21:03:10 +0900 Subject: [PATCH 7/7] Fix lint --- src/Widgets/MultitaskingView.vala | 6 +++--- src/Widgets/WindowClone.vala | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Widgets/MultitaskingView.vala b/src/Widgets/MultitaskingView.vala index ffd634c31..0b121efb4 100644 --- a/src/Widgets/MultitaskingView.vala +++ b/src/Widgets/MultitaskingView.vala @@ -363,7 +363,7 @@ namespace Gala { active_transition.set_from_value (active_icon_group.backdrop_opacity); active_transition.set_to_value (cancel_action ? 1.0f : 0.0f); active_icon_group.add_transition ("backdrop-opacity", active_transition); - + var target_transition = new Clutter.PropertyTransition ("backdrop-opacity") { duration = duration, remove_on_complete = true @@ -382,7 +382,7 @@ namespace Gala { if (transition != null) { transition.completed.connect (() => { workspace_gesture_tracker.enabled = true; - + if (!is_nudge_animation && !cancel_action) { manager.get_workspace_by_index (target_workspace_index).activate (display.get_current_time ()); update_positions (false); @@ -390,7 +390,7 @@ namespace Gala { }); } else { workspace_gesture_tracker.enabled = true; - + if (!is_nudge_animation && !cancel_action) { manager.get_workspace_by_index (target_workspace_index).activate (display.get_current_time ()); update_positions (false); diff --git a/src/Widgets/WindowClone.vala b/src/Widgets/WindowClone.vala index cd52278a8..a936a915b 100644 --- a/src/Widgets/WindowClone.vala +++ b/src/Widgets/WindowClone.vala @@ -514,7 +514,7 @@ public class Gala.WindowClone : Clutter.Actor { progress_mode = Clutter.AnimationMode.EASE_OUT_QUAD, interval = new Clutter.Interval (typeof (uint8), shadow_opacity, show ? 255 : 0) }; - + add_transition ("shadow-opacity", shadow_transition); } else { shadow_opacity = show ? 255 : 0;