Workspaces in multitasking view should not animate as if they are stacked (#1002)

This commit is contained in:
José Expósito 2020-12-29 23:07:44 +01:00 committed by GitHub
parent 0d0d4a5fd3
commit 9aee122c18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 68 additions and 4 deletions

View File

@ -300,7 +300,6 @@ namespace Gala {
* positions immediately.
*/
void update_positions (bool animate) {
var scale = InternalUtils.get_ui_scaling_factor ();
#if HAS_MUTTER330
unowned Meta.WorkspaceManager manager = display.get_workspace_manager ();
var active_index = manager.get_active_workspace ().index ();
@ -312,7 +311,7 @@ namespace Gala {
foreach (var child in workspaces.get_children ()) {
unowned WorkspaceClone workspace_clone = (WorkspaceClone) child;
var index = workspace_clone.workspace.index ();
var dest_x = index * (workspace_clone.width - (150 * scale));
var dest_x = workspace_clone.multitasking_view_x ();
if (index == active_index) {
active_x = dest_x;
@ -647,7 +646,9 @@ namespace Gala {
child.remove_all_transitions ();
}
update_positions (false);
if (!gesture_animation_director.canceling) {
update_positions (false);
}
foreach (var child in workspaces.get_children ()) {
unowned WorkspaceClone workspace = (WorkspaceClone) child;

View File

@ -128,6 +128,12 @@ namespace Gala {
*/
const int HOVER_ACTIVATE_DELAY = 400;
/**
* The MultitaskingView shows the workspaces overlapping them WorkspaceClone.X_OFFSET pixels
* making it possible to move windows to the next/previous workspace.
*/
public const int X_OFFSET = 150;
/**
* A window has been selected, the MultitaskingView should consider activating
* and closing the view.
@ -350,6 +356,35 @@ namespace Gala {
}
}
/**
* @return The position on the X axis of this workspace.
*/
public float multitasking_view_x () {
var scale_factor = InternalUtils.get_ui_scaling_factor ();
return workspace.index () * (width - (X_OFFSET * scale_factor));
}
/**
* @return The amount of pixels the workspace is overlapped in the X axis.
*/
float current_x_overlap () {
var scale_factor = InternalUtils.get_ui_scaling_factor ();
#if HAS_MUTTER330
var display = workspace.get_display ();
unowned Meta.WorkspaceManager manager = display.get_workspace_manager ();
var active_index = manager.get_active_workspace ().index ();
#else
var screen = workspace.get_screen ();
var active_index = screen.get_active_workspace ().index ();
#endif
if (workspace.index () == active_index) {
return 0;
} else {
var x_offset = X_OFFSET * scale_factor + WindowManagerGala.WORKSPACE_GAP;
return (workspace.index () < active_index) ? -x_offset : x_offset;
}
}
/**
* Utility function to shrink a MetaRectangle on all sides for the given amount.
* Negative amounts will scale it instead.
@ -387,16 +422,23 @@ namespace Gala {
var monitor = screen.get_monitor_geometry (screen.get_primary_monitor ());
#endif
var initial_x = gesture_animation_director.canceling ? x : x + current_x_overlap ();
var target_x = multitasking_view_x ();
var scale = (float)(monitor.height - TOP_OFFSET * scale_factor - BOTTOM_OFFSET * scale_factor) / monitor.height;
var pivotY = TOP_OFFSET * scale_factor / (monitor.height - monitor.height * scale);
update_size (monitor);
GestureAnimationDirector.OnBegin on_animation_begin = () => {
x = initial_x;
background.set_pivot_point (0.5f, pivotY);
};
GestureAnimationDirector.OnUpdate on_animation_update = (percentage) => {
var x = GestureAnimationDirector.animation_value (initial_x, target_x, percentage);
set_x (x);
double update_scale = (double)GestureAnimationDirector.animation_value (1.0f, (float)scale, percentage);
background.set_scale (update_scale, update_scale);
};
@ -406,6 +448,12 @@ namespace Gala {
return;
}
save_easing_state ();
set_easing_duration (MultitaskingView.ANIMATION_DURATION);
set_easing_mode (MultitaskingView.ANIMATION_MODE);
set_x (target_x);
restore_easing_state ();
background.save_easing_state ();
background.set_easing_duration (MultitaskingView.ANIMATION_DURATION);
background.set_easing_mode (MultitaskingView.ANIMATION_MODE);
@ -453,10 +501,16 @@ namespace Gala {
opened = false;
var initial_x = gesture_animation_director.canceling ? x : multitasking_view_x ();
var target_x = multitasking_view_x () + current_x_overlap ();
double initial_scale_x, initial_scale_y;
background.get_scale (out initial_scale_x, out initial_scale_y);
GestureAnimationDirector.OnUpdate on_animation_update = (percentage) => {
var x = GestureAnimationDirector.animation_value (initial_x, target_x, percentage);
set_x (x);
double scale_x = (double) GestureAnimationDirector.animation_value ((float) initial_scale_x, 1.0f, percentage);
double scale_y = (double) GestureAnimationDirector.animation_value ((float) initial_scale_y, 1.0f, percentage);
background.set_scale (scale_x, scale_y);
@ -467,6 +521,12 @@ namespace Gala {
return;
}
save_easing_state ();
set_easing_duration (MultitaskingView.ANIMATION_DURATION);
set_easing_mode (MultitaskingView.ANIMATION_MODE);
set_x (target_x);
restore_easing_state ();
background.save_easing_state ();
background.set_easing_duration (MultitaskingView.ANIMATION_DURATION);
background.set_easing_mode (MultitaskingView.ANIMATION_MODE);

View File

@ -102,7 +102,10 @@ namespace Gala {
private bool animating_switch_workspace = false;
private GestureAnimationDirector gesture_animation_director;
private const int WORKSPACE_GAP = 24;
/**
* Gap to show between workspaces while switching between them.
*/
public const int WORKSPACE_GAP = 24;
construct {
gesture_animation_director = new GestureAnimationDirector ();