mirror of
https://github.com/elementary/gala.git
synced 2024-09-11 07:05:30 +03:00
Multitasking view animation use GestureTracker
This commit is contained in:
parent
104f819e76
commit
5bba638ccf
@ -31,13 +31,13 @@ namespace Gala {
|
|||||||
|
|
||||||
public Meta.Display display { get; construct; }
|
public Meta.Display display { get; construct; }
|
||||||
public int monitor { get; construct; }
|
public int monitor { get; construct; }
|
||||||
public GestureAnimationDirector gesture_animation_director { get; construct; }
|
public GestureTracker gesture_tracker { get; construct; }
|
||||||
|
|
||||||
WindowCloneContainer window_container;
|
WindowCloneContainer window_container;
|
||||||
BackgroundManager background;
|
BackgroundManager background;
|
||||||
|
|
||||||
public MonitorClone (Meta.Display display, int monitor, GestureAnimationDirector gesture_animation_director) {
|
public MonitorClone (Meta.Display display, int monitor, GestureTracker gesture_tracker) {
|
||||||
Object (display: display, monitor: monitor, gesture_animation_director: gesture_animation_director);
|
Object (display: display, monitor: monitor, gesture_tracker: gesture_tracker);
|
||||||
}
|
}
|
||||||
|
|
||||||
construct {
|
construct {
|
||||||
@ -46,7 +46,7 @@ namespace Gala {
|
|||||||
background = new BackgroundManager (display, monitor, false);
|
background = new BackgroundManager (display, monitor, false);
|
||||||
background.set_easing_duration (MultitaskingView.ANIMATION_DURATION);
|
background.set_easing_duration (MultitaskingView.ANIMATION_DURATION);
|
||||||
|
|
||||||
window_container = new WindowCloneContainer (gesture_animation_director);
|
window_container = new WindowCloneContainer (gesture_tracker);
|
||||||
window_container.window_selected.connect ((w) => { window_selected (w); });
|
window_container.window_selected.connect ((w) => { window_selected (w); });
|
||||||
display.restacked.connect (window_container.restack_windows);
|
display.restacked.connect (window_container.restack_windows);
|
||||||
|
|
||||||
@ -93,16 +93,16 @@ namespace Gala {
|
|||||||
/**
|
/**
|
||||||
* Animate the windows from their old location to a tiled layout
|
* Animate the windows from their old location to a tiled layout
|
||||||
*/
|
*/
|
||||||
public void open () {
|
public void open (bool with_gesture = false, bool is_cancel_animation = false) {
|
||||||
window_container.open ();
|
window_container.open (null, with_gesture, is_cancel_animation);
|
||||||
// background.opacity = 0; TODO consider this option
|
// background.opacity = 0; TODO consider this option
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Animate the windows back to their old location
|
* Animate the windows back to their old location
|
||||||
*/
|
*/
|
||||||
public void close () {
|
public void close (bool with_gesture = false, bool is_cancel_animation = false) {
|
||||||
window_container.close ();
|
window_container.close (with_gesture, is_cancel_animation);
|
||||||
background.opacity = 255;
|
background.opacity = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,8 +28,8 @@ namespace Gala {
|
|||||||
public const int ANIMATION_DURATION = 250;
|
public const int ANIMATION_DURATION = 250;
|
||||||
public const AnimationMode ANIMATION_MODE = AnimationMode.EASE_OUT_QUAD;
|
public const AnimationMode ANIMATION_MODE = AnimationMode.EASE_OUT_QUAD;
|
||||||
|
|
||||||
private GestureAnimationDirector gesture_animation_director;
|
private GestureTracker multitasking_gesture_tracker;
|
||||||
private GestureTracker gesture_tracker;
|
private GestureTracker workspace_gesture_tracker;
|
||||||
|
|
||||||
const int SMOOTH_SCROLL_DELAY = 500;
|
const int SMOOTH_SCROLL_DELAY = 500;
|
||||||
|
|
||||||
@ -58,12 +58,14 @@ namespace Gala {
|
|||||||
opened = false;
|
opened = false;
|
||||||
display = wm.get_display ();
|
display = wm.get_display ();
|
||||||
|
|
||||||
gesture_animation_director = new GestureAnimationDirector (ANIMATION_DURATION, ANIMATION_DURATION);
|
multitasking_gesture_tracker = new GestureTracker (ANIMATION_DURATION, ANIMATION_DURATION);
|
||||||
|
multitasking_gesture_tracker.enable_touchpad ();
|
||||||
|
multitasking_gesture_tracker.on_gesture_detected.connect (on_multitasking_gesture_detected);
|
||||||
|
|
||||||
gesture_tracker = new GestureTracker (AnimationDuration.WORKSPACE_SWITCH_MIN, AnimationDuration.WORKSPACE_SWITCH);
|
workspace_gesture_tracker = new GestureTracker (AnimationDuration.WORKSPACE_SWITCH_MIN, AnimationDuration.WORKSPACE_SWITCH);
|
||||||
gesture_tracker.enable_touchpad ();
|
workspace_gesture_tracker.enable_touchpad ();
|
||||||
gesture_tracker.enable_scroll (this, Clutter.Orientation.HORIZONTAL);
|
workspace_gesture_tracker.enable_scroll (this, Clutter.Orientation.HORIZONTAL);
|
||||||
gesture_tracker.on_gesture_detected.connect (on_gesture_detected);
|
workspace_gesture_tracker.on_gesture_detected.connect (on_workspace_gesture_detected);
|
||||||
|
|
||||||
workspaces = new Actor ();
|
workspaces = new Actor ();
|
||||||
workspaces.set_easing_mode (AnimationMode.EASE_OUT_QUAD);
|
workspaces.set_easing_mode (AnimationMode.EASE_OUT_QUAD);
|
||||||
@ -143,7 +145,7 @@ namespace Gala {
|
|||||||
if (monitor == primary)
|
if (monitor == primary)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var monitor_clone = new MonitorClone (display, monitor, gesture_animation_director);
|
var monitor_clone = new MonitorClone (display, monitor, multitasking_gesture_tracker);
|
||||||
monitor_clone.window_selected.connect (window_selected);
|
monitor_clone.window_selected.connect (window_selected);
|
||||||
monitor_clone.visible = opened;
|
monitor_clone.visible = opened;
|
||||||
|
|
||||||
@ -204,13 +206,33 @@ namespace Gala {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void on_gesture_detected (Gesture gesture) {
|
private void on_multitasking_gesture_detected (Gesture gesture) {
|
||||||
|
var enabled = workspace_gesture_tracker.settings.is_gesture_enabled (GestureSettings.MULTITASKING_ENABLED);
|
||||||
|
var fingers = workspace_gesture_tracker.settings.gesture_fingers (GestureSettings.MULTITASKING_FINGERS);
|
||||||
|
|
||||||
|
bool up = gesture.direction == GestureDirection.UP;
|
||||||
|
bool down = gesture.direction == GestureDirection.DOWN;
|
||||||
|
bool can_handle_swipe = gesture.type == Gdk.EventType.TOUCHPAD_SWIPE
|
||||||
|
&& (up || down)
|
||||||
|
&& gesture.fingers == fingers;
|
||||||
|
bool can_handle_gesture = enabled && can_handle_swipe;
|
||||||
|
|
||||||
|
if (can_handle_gesture) {
|
||||||
|
if (up && !opened) {
|
||||||
|
toggle (true, false);
|
||||||
|
} else if (down && opened) {
|
||||||
|
toggle (true, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void on_workspace_gesture_detected (Gesture gesture) {
|
||||||
if (!opened) {
|
if (!opened) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var enabled = gesture_tracker.settings.is_gesture_enabled (GestureSettings.WORKSPACE_ENABLED);
|
var enabled = workspace_gesture_tracker.settings.is_gesture_enabled (GestureSettings.WORKSPACE_ENABLED);
|
||||||
var fingers = gesture_tracker.settings.gesture_fingers (GestureSettings.WORKSPACE_FINGERS);
|
var fingers = workspace_gesture_tracker.settings.gesture_fingers (GestureSettings.WORKSPACE_FINGERS);
|
||||||
|
|
||||||
bool can_handle_scroll = gesture.type == Gdk.EventType.SCROLL;
|
bool can_handle_scroll = gesture.type == Gdk.EventType.SCROLL;
|
||||||
bool can_handle_swipe = gesture.type == Gdk.EventType.TOUCHPAD_SWIPE
|
bool can_handle_swipe = gesture.type == Gdk.EventType.TOUCHPAD_SWIPE
|
||||||
@ -219,7 +241,7 @@ namespace Gala {
|
|||||||
bool can_handle_gesture = enabled && (can_handle_scroll || can_handle_swipe);
|
bool can_handle_gesture = enabled && (can_handle_scroll || can_handle_swipe);
|
||||||
|
|
||||||
if (can_handle_gesture) {
|
if (can_handle_gesture) {
|
||||||
var direction = gesture_tracker.settings.get_natural_scroll_direction (gesture);
|
var direction = workspace_gesture_tracker.settings.get_natural_scroll_direction (gesture);
|
||||||
switch_workspace_with_gesture (direction);
|
switch_workspace_with_gesture (direction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -260,20 +282,20 @@ namespace Gala {
|
|||||||
debug ("Initial X: %f", initial_x);
|
debug ("Initial X: %f", initial_x);
|
||||||
debug ("Target X: %f", target_x);
|
debug ("Target X: %f", target_x);
|
||||||
|
|
||||||
GestureAnimationDirector.OnUpdate on_animation_update = (percentage) => {
|
GestureTracker.OnUpdate on_animation_update = (percentage) => {
|
||||||
var x = GestureTracker.animation_value (initial_x, target_x, percentage, true);
|
var x = GestureTracker.animation_value (initial_x, target_x, percentage, true);
|
||||||
workspaces.x = x;
|
workspaces.x = x;
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnEnd on_animation_end = (percentage, cancel_action, calculated_duration) => {
|
GestureTracker.OnEnd on_animation_end = (percentage, cancel_action, calculated_duration) => {
|
||||||
gesture_tracker.enabled = false;
|
workspace_gesture_tracker.enabled = false;
|
||||||
|
|
||||||
var duration = is_nudge_animation ? (AnimationDuration.NUDGE / 2) : calculated_duration;
|
var duration = is_nudge_animation ? (AnimationDuration.NUDGE / 2) : calculated_duration;
|
||||||
workspaces.set_easing_duration (duration);
|
workspaces.set_easing_duration (duration);
|
||||||
workspaces.x = (is_nudge_animation || cancel_action) ? initial_x : target_x;
|
workspaces.x = (is_nudge_animation || cancel_action) ? initial_x : target_x;
|
||||||
|
|
||||||
workspaces.get_transition ("x").completed.connect (() => {
|
workspaces.get_transition ("x").completed.connect (() => {
|
||||||
gesture_tracker.enabled = true;
|
workspace_gesture_tracker.enabled = true;
|
||||||
|
|
||||||
if (!is_nudge_animation && !cancel_action) {
|
if (!is_nudge_animation && !cancel_action) {
|
||||||
manager.get_workspace_by_index (target_workspace_index).activate (display.get_current_time ());
|
manager.get_workspace_by_index (target_workspace_index).activate (display.get_current_time ());
|
||||||
@ -282,7 +304,7 @@ namespace Gala {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end);
|
workspace_gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -346,7 +368,7 @@ namespace Gala {
|
|||||||
|
|
||||||
void add_workspace (int num) {
|
void add_workspace (int num) {
|
||||||
unowned Meta.WorkspaceManager manager = display.get_workspace_manager ();
|
unowned Meta.WorkspaceManager manager = display.get_workspace_manager ();
|
||||||
var workspace = new WorkspaceClone (manager.get_workspace_by_index (num), gesture_animation_director);
|
var workspace = new WorkspaceClone (manager.get_workspace_by_index (num), multitasking_gesture_tracker);
|
||||||
workspace.window_selected.connect (window_selected);
|
workspace.window_selected.connect (window_selected);
|
||||||
workspace.selected.connect (activate_workspace);
|
workspace.selected.connect (activate_workspace);
|
||||||
|
|
||||||
@ -497,40 +519,18 @@ namespace Gala {
|
|||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public void open (HashTable<string,Variant>? hints = null) {
|
public void open (HashTable<string,Variant>? hints = null) {
|
||||||
bool manual_animation = hints != null && hints.get ("manual_animation").get_boolean ();
|
|
||||||
|
|
||||||
if (!opened) {
|
if (!opened) {
|
||||||
if (manual_animation && !animating) {
|
|
||||||
debug ("Starting MultitaskingView manual open animation");
|
|
||||||
gesture_animation_director.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle ();
|
toggle ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opened && manual_animation && gesture_animation_director.running) {
|
|
||||||
gesture_animation_director.update_animation (hints);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public void close (HashTable<string,Variant>? hints = null) {
|
public void close (HashTable<string,Variant>? hints = null) {
|
||||||
bool manual_animation = hints != null && hints.get ("manual_animation").get_boolean ();
|
|
||||||
|
|
||||||
if (opened) {
|
if (opened) {
|
||||||
if (manual_animation && !animating) {
|
|
||||||
debug ("Starting MultitaskingView manual close animation");
|
|
||||||
gesture_animation_director.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle ();
|
toggle ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!opened && manual_animation && gesture_animation_director.running) {
|
|
||||||
gesture_animation_director.update_animation (hints);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -538,7 +538,7 @@ namespace Gala {
|
|||||||
* starting the modal mode and hiding the WindowGroup. Finally tells all components
|
* starting the modal mode and hiding the WindowGroup. Finally tells all components
|
||||||
* to animate to their positions.
|
* to animate to their positions.
|
||||||
*/
|
*/
|
||||||
void toggle () {
|
void toggle (bool with_gesture = false, bool is_cancel_animation = false) {
|
||||||
if (animating) {
|
if (animating) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -551,9 +551,9 @@ namespace Gala {
|
|||||||
foreach (var container in window_containers_monitors) {
|
foreach (var container in window_containers_monitors) {
|
||||||
if (opening) {
|
if (opening) {
|
||||||
container.visible = true;
|
container.visible = true;
|
||||||
container.open ();
|
container.open (with_gesture, is_cancel_animation);
|
||||||
} else {
|
} else {
|
||||||
container.close ();
|
container.close (with_gesture, is_cancel_animation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -592,26 +592,26 @@ namespace Gala {
|
|||||||
child.remove_all_transitions ();
|
child.remove_all_transitions ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gesture_animation_director.canceling) {
|
if (!is_cancel_animation) {
|
||||||
update_positions (false);
|
update_positions (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var child in workspaces.get_children ()) {
|
foreach (var child in workspaces.get_children ()) {
|
||||||
unowned WorkspaceClone workspace = (WorkspaceClone) child;
|
unowned WorkspaceClone workspace = (WorkspaceClone) child;
|
||||||
if (opening) {
|
if (opening) {
|
||||||
workspace.open ();
|
workspace.open (with_gesture, is_cancel_animation);
|
||||||
} else {
|
} else {
|
||||||
workspace.close ();
|
workspace.close (with_gesture, is_cancel_animation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opening) {
|
if (opening) {
|
||||||
show_docks ();
|
show_docks (with_gesture, is_cancel_animation);
|
||||||
} else {
|
} else {
|
||||||
hide_docks ();
|
hide_docks (with_gesture, is_cancel_animation);
|
||||||
}
|
}
|
||||||
|
|
||||||
GestureAnimationDirector.OnEnd on_animation_end = (percentage, cancel_action) => {
|
GestureTracker.OnEnd on_animation_end = (percentage, cancel_action) => {
|
||||||
var animation_duration = cancel_action ? 0 : ANIMATION_DURATION;
|
var animation_duration = cancel_action ? 0 : ANIMATION_DURATION;
|
||||||
Timeout.add (animation_duration, () => {
|
Timeout.add (animation_duration, () => {
|
||||||
if (!opening) {
|
if (!opening) {
|
||||||
@ -631,26 +631,23 @@ namespace Gala {
|
|||||||
}
|
}
|
||||||
|
|
||||||
animating = false;
|
animating = false;
|
||||||
gesture_animation_director.disconnect_all_handlers ();
|
|
||||||
gesture_animation_director.running = false;
|
|
||||||
gesture_animation_director.canceling = cancel_action;
|
|
||||||
|
|
||||||
if (cancel_action) {
|
if (cancel_action) {
|
||||||
toggle ();
|
toggle (false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!gesture_animation_director.running) {
|
if (!with_gesture) {
|
||||||
on_animation_end (100, false, 0);
|
on_animation_end (1, false, 0);
|
||||||
} else {
|
} else {
|
||||||
gesture_animation_director.connect_handlers (null, null, (owned) on_animation_end);
|
multitasking_gesture_tracker.connect_handlers (null, null, (owned) on_animation_end);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_docks () {
|
void show_docks (bool with_gesture, bool is_cancel_animation) {
|
||||||
float clone_offset_x, clone_offset_y;
|
float clone_offset_x, clone_offset_y;
|
||||||
dock_clones.get_transformed_position (out clone_offset_x, out clone_offset_y);
|
dock_clones.get_transformed_position (out clone_offset_x, out clone_offset_y);
|
||||||
|
|
||||||
@ -688,37 +685,37 @@ namespace Gala {
|
|||||||
var clone = new SafeWindowClone (window, true);
|
var clone = new SafeWindowClone (window, true);
|
||||||
dock_clones.add_child (clone);
|
dock_clones.add_child (clone);
|
||||||
|
|
||||||
GestureAnimationDirector.OnBegin on_animation_begin = () => {
|
GestureTracker.OnBegin on_animation_begin = () => {
|
||||||
clone.set_position (initial_x, initial_y);
|
clone.set_position (initial_x, initial_y);
|
||||||
clone.set_easing_mode (0);
|
clone.set_easing_mode (0);
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnUpdate on_animation_update = (percentage) => {
|
GestureTracker.OnUpdate on_animation_update = (percentage) => {
|
||||||
var y = GestureAnimationDirector.animation_value (initial_y, target_y, percentage);
|
var y = GestureTracker.animation_value (initial_y, target_y, percentage);
|
||||||
clone.y = y;
|
clone.y = y;
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnEnd on_animation_end = (percentage, cancel_action) => {
|
GestureTracker.OnEnd on_animation_end = (percentage, cancel_action) => {
|
||||||
clone.set_easing_mode (ANIMATION_MODE);
|
clone.set_easing_mode (ANIMATION_MODE);
|
||||||
|
|
||||||
if (cancel_action) {
|
if (cancel_action) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
clone.set_easing_duration (gesture_animation_director.canceling ? 0 : ANIMATION_DURATION);
|
clone.set_easing_duration (is_cancel_animation ? 0 : ANIMATION_DURATION);
|
||||||
clone.y = target_y;
|
clone.y = target_y;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!gesture_animation_director.running) {
|
if (!with_gesture) {
|
||||||
on_animation_begin (0);
|
on_animation_begin (0);
|
||||||
on_animation_end (100, false, 0);
|
on_animation_end (1, false, 0);
|
||||||
} else {
|
} else {
|
||||||
gesture_animation_director.connect_handlers ((owned) on_animation_begin, (owned) on_animation_update, (owned) on_animation_end);
|
multitasking_gesture_tracker.connect_handlers ((owned) on_animation_begin, (owned) on_animation_update, (owned) on_animation_end);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void hide_docks () {
|
void hide_docks (bool with_gesture, bool is_cancel_animation) {
|
||||||
float clone_offset_x, clone_offset_y;
|
float clone_offset_x, clone_offset_y;
|
||||||
dock_clones.get_transformed_position (out clone_offset_x, out clone_offset_y);
|
dock_clones.get_transformed_position (out clone_offset_x, out clone_offset_y);
|
||||||
|
|
||||||
@ -727,12 +724,12 @@ namespace Gala {
|
|||||||
var initial_y = dock.y;
|
var initial_y = dock.y;
|
||||||
var target_y = dock.source.y - clone_offset_y;
|
var target_y = dock.source.y - clone_offset_y;
|
||||||
|
|
||||||
GestureAnimationDirector.OnUpdate on_animation_update = (percentage) => {
|
GestureTracker.OnUpdate on_animation_update = (percentage) => {
|
||||||
var y = GestureAnimationDirector.animation_value (initial_y, target_y, percentage);
|
var y = GestureTracker.animation_value (initial_y, target_y, percentage);
|
||||||
dock.y = y;
|
dock.y = y;
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnEnd on_animation_end = (percentage, cancel_action) => {
|
GestureTracker.OnEnd on_animation_end = (percentage, cancel_action) => {
|
||||||
if (cancel_action) {
|
if (cancel_action) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -742,10 +739,10 @@ namespace Gala {
|
|||||||
dock.y = target_y;
|
dock.y = target_y;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!gesture_animation_director.running) {
|
if (!with_gesture) {
|
||||||
on_animation_end (100, false, 0);
|
on_animation_end (1, false, 0);
|
||||||
} else {
|
} else {
|
||||||
gesture_animation_director.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end);
|
multitasking_gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ namespace Gala {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public bool overview_mode { get; construct; }
|
public bool overview_mode { get; construct; }
|
||||||
public GestureAnimationDirector? gesture_animation_director { get; construct; }
|
public GestureTracker? gesture_tracker { get; construct; }
|
||||||
|
|
||||||
[CCode (notify = false)]
|
[CCode (notify = false)]
|
||||||
public uint8 shadow_opacity {
|
public uint8 shadow_opacity {
|
||||||
@ -121,8 +121,8 @@ namespace Gala {
|
|||||||
Actor active_shape;
|
Actor active_shape;
|
||||||
Actor window_icon;
|
Actor window_icon;
|
||||||
|
|
||||||
public WindowClone (Meta.Window window, GestureAnimationDirector? gesture_animation_director, bool overview_mode = false) {
|
public WindowClone (Meta.Window window, GestureTracker? gesture_tracker, bool overview_mode = false) {
|
||||||
Object (window: window, gesture_animation_director: gesture_animation_director, overview_mode: overview_mode);
|
Object (window: window, gesture_tracker: gesture_tracker, overview_mode: overview_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
construct {
|
construct {
|
||||||
@ -280,7 +280,7 @@ namespace Gala {
|
|||||||
*
|
*
|
||||||
* @param animate Animate the transformation of the placement
|
* @param animate Animate the transformation of the placement
|
||||||
*/
|
*/
|
||||||
public void transition_to_original_state (bool animate) {
|
public void transition_to_original_state (bool animate, bool with_gesture = false, bool is_cancel_animation = false) {
|
||||||
var outer_rect = window.get_frame_rect ();
|
var outer_rect = window.get_frame_rect ();
|
||||||
|
|
||||||
var monitor_geom = window.get_display ().get_monitor_geometry (window.get_monitor ());
|
var monitor_geom = window.get_display ().get_monitor_geometry (window.get_monitor ());
|
||||||
@ -295,16 +295,16 @@ namespace Gala {
|
|||||||
var target_x = outer_rect.x - offset_x;
|
var target_x = outer_rect.x - offset_x;
|
||||||
var target_y = outer_rect.y - offset_y;
|
var target_y = outer_rect.y - offset_y;
|
||||||
|
|
||||||
GestureAnimationDirector.OnBegin on_animation_begin = () => {
|
GestureTracker.OnBegin on_animation_begin = () => {
|
||||||
window_icon.set_easing_duration (0);
|
window_icon.set_easing_duration (0);
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnUpdate on_animation_update = (percentage) => {
|
GestureTracker.OnUpdate on_animation_update = (percentage) => {
|
||||||
var x = GestureAnimationDirector.animation_value (initial_x, target_x, percentage);
|
var x = GestureTracker.animation_value (initial_x, target_x, percentage);
|
||||||
var y = GestureAnimationDirector.animation_value (initial_y, target_y, percentage);
|
var y = GestureTracker.animation_value (initial_y, target_y, percentage);
|
||||||
var width = GestureAnimationDirector.animation_value (initial_width, outer_rect.width, percentage);
|
var width = GestureTracker.animation_value (initial_width, outer_rect.width, percentage);
|
||||||
var height = GestureAnimationDirector.animation_value (initial_height, outer_rect.height, percentage);
|
var height = GestureTracker.animation_value (initial_height, outer_rect.height, percentage);
|
||||||
var opacity = GestureAnimationDirector.animation_value (255f, 0f, percentage);
|
var opacity = GestureTracker.animation_value (255f, 0f, percentage);
|
||||||
|
|
||||||
set_size (width, height);
|
set_size (width, height);
|
||||||
set_position (x, y);
|
set_position (x, y);
|
||||||
@ -313,7 +313,7 @@ namespace Gala {
|
|||||||
height - (WINDOW_ICON_SIZE * scale_factor) * 0.75f);
|
height - (WINDOW_ICON_SIZE * scale_factor) * 0.75f);
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnEnd on_animation_end = (percentage, cancel_action) => {
|
GestureTracker.OnEnd on_animation_end = (percentage, cancel_action) => {
|
||||||
window_icon.set_easing_duration (MultitaskingView.ANIMATION_DURATION);
|
window_icon.set_easing_duration (MultitaskingView.ANIMATION_DURATION);
|
||||||
|
|
||||||
if (cancel_action) {
|
if (cancel_action) {
|
||||||
@ -342,35 +342,35 @@ namespace Gala {
|
|||||||
close_button.opacity = 0;
|
close_button.opacity = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!animate || gesture_animation_director == null || !gesture_animation_director.running) {
|
if (!animate || gesture_tracker == null || !with_gesture) {
|
||||||
on_animation_begin (0);
|
on_animation_begin (0);
|
||||||
on_animation_end (100, false, 0);
|
on_animation_end (1, false, 0);
|
||||||
} else {
|
} else {
|
||||||
gesture_animation_director.connect_handlers ((owned) on_animation_begin, (owned) on_animation_update, (owned) on_animation_end);
|
gesture_tracker.connect_handlers ((owned) on_animation_begin, (owned) on_animation_update, (owned) on_animation_end);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Animate the window to the given slot
|
* Animate the window to the given slot
|
||||||
*/
|
*/
|
||||||
public void take_slot (Meta.Rectangle rect) {
|
public void take_slot (Meta.Rectangle rect, bool with_gesture = false, bool is_cancel_animation = false) {
|
||||||
slot = rect;
|
slot = rect;
|
||||||
var initial_x = x;
|
var initial_x = x;
|
||||||
var initial_y = y;
|
var initial_y = y;
|
||||||
var initial_width = width;
|
var initial_width = width;
|
||||||
var initial_height = height;
|
var initial_height = height;
|
||||||
|
|
||||||
GestureAnimationDirector.OnBegin on_animation_begin = () => {
|
GestureTracker.OnBegin on_animation_begin = () => {
|
||||||
window_icon.opacity = 0;
|
window_icon.opacity = 0;
|
||||||
window_icon.set_easing_duration (0);
|
window_icon.set_easing_duration (0);
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnUpdate on_animation_update = (percentage) => {
|
GestureTracker.OnUpdate on_animation_update = (percentage) => {
|
||||||
var x = GestureAnimationDirector.animation_value (initial_x, rect.x, percentage);
|
var x = GestureTracker.animation_value (initial_x, rect.x, percentage);
|
||||||
var y = GestureAnimationDirector.animation_value (initial_y, rect.y, percentage);
|
var y = GestureTracker.animation_value (initial_y, rect.y, percentage);
|
||||||
var width = GestureAnimationDirector.animation_value (initial_width, rect.width, percentage);
|
var width = GestureTracker.animation_value (initial_width, rect.width, percentage);
|
||||||
var height = GestureAnimationDirector.animation_value (initial_height, rect.height, percentage);
|
var height = GestureTracker.animation_value (initial_height, rect.height, percentage);
|
||||||
var opacity = GestureAnimationDirector.animation_value (0f, 255f, percentage);
|
var opacity = GestureTracker.animation_value (0f, 255f, percentage);
|
||||||
|
|
||||||
set_size (width, height);
|
set_size (width, height);
|
||||||
set_position (x, y);
|
set_position (x, y);
|
||||||
@ -379,7 +379,7 @@ namespace Gala {
|
|||||||
height - (WINDOW_ICON_SIZE * scale_factor) * 0.75f);
|
height - (WINDOW_ICON_SIZE * scale_factor) * 0.75f);
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnEnd on_animation_end = (percentage, cancel_action) => {
|
GestureTracker.OnEnd on_animation_end = (percentage, cancel_action) => {
|
||||||
window_icon.set_easing_duration (MultitaskingView.ANIMATION_DURATION);
|
window_icon.set_easing_duration (MultitaskingView.ANIMATION_DURATION);
|
||||||
|
|
||||||
if (cancel_action) {
|
if (cancel_action) {
|
||||||
@ -411,11 +411,11 @@ namespace Gala {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (gesture_animation_director == null || !gesture_animation_director.running) {
|
if (gesture_tracker == null || !with_gesture) {
|
||||||
on_animation_begin (0);
|
on_animation_begin (0);
|
||||||
on_animation_end (100, false, 0);
|
on_animation_end (1, false, 0);
|
||||||
} else {
|
} else {
|
||||||
gesture_animation_director.connect_handlers ((owned) on_animation_begin, (owned) on_animation_update, (owned) on_animation_end);
|
gesture_tracker.connect_handlers ((owned) on_animation_begin, (owned) on_animation_update, (owned) on_animation_end);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ namespace Gala {
|
|||||||
public int padding_right { get; set; default = 12; }
|
public int padding_right { get; set; default = 12; }
|
||||||
public int padding_bottom { get; set; default = 12; }
|
public int padding_bottom { get; set; default = 12; }
|
||||||
|
|
||||||
public GestureAnimationDirector? gesture_animation_director { get; construct; }
|
public GestureTracker? gesture_tracker { get; construct; }
|
||||||
public bool overview_mode { get; construct; }
|
public bool overview_mode { get; construct; }
|
||||||
|
|
||||||
bool opened;
|
bool opened;
|
||||||
@ -41,8 +41,8 @@ namespace Gala {
|
|||||||
*/
|
*/
|
||||||
WindowClone? current_window;
|
WindowClone? current_window;
|
||||||
|
|
||||||
public WindowCloneContainer (GestureAnimationDirector? gesture_animation_director, bool overview_mode = false) {
|
public WindowCloneContainer (GestureTracker? gesture_tracker, bool overview_mode = false) {
|
||||||
Object (gesture_animation_director: gesture_animation_director, overview_mode: overview_mode);
|
Object (gesture_tracker: gesture_tracker, overview_mode: overview_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
construct {
|
construct {
|
||||||
@ -69,11 +69,11 @@ namespace Gala {
|
|||||||
|
|
||||||
var windows_ordered = display.sort_windows_by_stacking (windows);
|
var windows_ordered = display.sort_windows_by_stacking (windows);
|
||||||
|
|
||||||
var new_window = new WindowClone (window, gesture_animation_director, overview_mode);
|
var new_window = new WindowClone (window, gesture_tracker, overview_mode);
|
||||||
|
|
||||||
new_window.selected.connect (window_selected_cb);
|
new_window.selected.connect (window_selected_cb);
|
||||||
new_window.destroy.connect (window_destroyed);
|
new_window.destroy.connect (window_destroyed);
|
||||||
new_window.request_reposition.connect (reflow);
|
new_window.request_reposition.connect (() => reflow ());
|
||||||
|
|
||||||
var added = false;
|
var added = false;
|
||||||
unowned Meta.Window? target = null;
|
unowned Meta.Window? target = null;
|
||||||
@ -166,7 +166,7 @@ namespace Gala {
|
|||||||
* Recalculate the tiling positions of the windows and animate them to
|
* Recalculate the tiling positions of the windows and animate them to
|
||||||
* the resulting spots.
|
* the resulting spots.
|
||||||
*/
|
*/
|
||||||
public void reflow () {
|
public void reflow (bool with_gesture = false, bool is_cancel_animation = false) {
|
||||||
if (!opened)
|
if (!opened)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -199,7 +199,7 @@ namespace Gala {
|
|||||||
|
|
||||||
foreach (var tilable in window_positions) {
|
foreach (var tilable in window_positions) {
|
||||||
unowned WindowClone window = (WindowClone) tilable.id;
|
unowned WindowClone window = (WindowClone) tilable.id;
|
||||||
window.take_slot (tilable.rect);
|
window.take_slot (tilable.rect, with_gesture, is_cancel_animation);
|
||||||
window.place_widgets (tilable.rect.width, tilable.rect.height);
|
window.place_widgets (tilable.rect.width, tilable.rect.height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -309,7 +309,7 @@ namespace Gala {
|
|||||||
/**
|
/**
|
||||||
* When opened the WindowClones are animated to a tiled layout
|
* When opened the WindowClones are animated to a tiled layout
|
||||||
*/
|
*/
|
||||||
public void open (Window? selected_window = null) {
|
public void open (Window? selected_window = null, bool with_gesture = false, bool is_cancel_animation = false) {
|
||||||
if (opened) {
|
if (opened) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -335,20 +335,20 @@ namespace Gala {
|
|||||||
|
|
||||||
// make sure our windows are where they belong in case they were moved
|
// make sure our windows are where they belong in case they were moved
|
||||||
// while were closed.
|
// while were closed.
|
||||||
if (gesture_animation_director == null || !gesture_animation_director.canceling) {
|
if (gesture_tracker == null || !is_cancel_animation) {
|
||||||
foreach (var window in get_children ()) {
|
foreach (var window in get_children ()) {
|
||||||
((WindowClone) window).transition_to_original_state (false);
|
((WindowClone) window).transition_to_original_state (false, with_gesture, is_cancel_animation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reflow ();
|
reflow (with_gesture, is_cancel_animation);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calls the transition_to_original_state() function on each child
|
* Calls the transition_to_original_state() function on each child
|
||||||
* to make them take their original locations again.
|
* to make them take their original locations again.
|
||||||
*/
|
*/
|
||||||
public void close () {
|
public void close (bool with_gesture = false, bool is_cancel_animation = false) {
|
||||||
if (!opened) {
|
if (!opened) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -356,7 +356,7 @@ namespace Gala {
|
|||||||
opened = false;
|
opened = false;
|
||||||
|
|
||||||
foreach (var window in get_children ()) {
|
foreach (var window in get_children ()) {
|
||||||
((WindowClone) window).transition_to_original_state (true);
|
((WindowClone) window).transition_to_original_state (true, with_gesture, is_cancel_animation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ namespace Gala {
|
|||||||
public signal void selected (bool close_view);
|
public signal void selected (bool close_view);
|
||||||
|
|
||||||
public Workspace workspace { get; construct; }
|
public Workspace workspace { get; construct; }
|
||||||
public GestureAnimationDirector gesture_animation_director { get; construct; }
|
public GestureTracker gesture_tracker { get; construct; }
|
||||||
public IconGroup icon_group { get; private set; }
|
public IconGroup icon_group { get; private set; }
|
||||||
public WindowCloneContainer window_container { get; private set; }
|
public WindowCloneContainer window_container { get; private set; }
|
||||||
|
|
||||||
@ -145,8 +145,8 @@ namespace Gala {
|
|||||||
|
|
||||||
uint hover_activate_timeout = 0;
|
uint hover_activate_timeout = 0;
|
||||||
|
|
||||||
public WorkspaceClone (Workspace workspace, GestureAnimationDirector gesture_animation_director) {
|
public WorkspaceClone (Workspace workspace, GestureTracker gesture_tracker) {
|
||||||
Object (workspace: workspace, gesture_animation_director: gesture_animation_director);
|
Object (workspace: workspace, gesture_tracker: gesture_tracker);
|
||||||
}
|
}
|
||||||
|
|
||||||
construct {
|
construct {
|
||||||
@ -162,7 +162,7 @@ namespace Gala {
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
window_container = new WindowCloneContainer (gesture_animation_director);
|
window_container = new WindowCloneContainer (gesture_tracker);
|
||||||
window_container.window_selected.connect ((w) => { window_selected (w); });
|
window_container.window_selected.connect ((w) => { window_selected (w); });
|
||||||
window_container.set_size (monitor_geometry.width, monitor_geometry.height);
|
window_container.set_size (monitor_geometry.width, monitor_geometry.height);
|
||||||
display.restacked.connect (window_container.restack_windows);
|
display.restacked.connect (window_container.restack_windows);
|
||||||
@ -316,7 +316,7 @@ namespace Gala {
|
|||||||
* Also sets the current_window of the WindowCloneContainer to the active window
|
* Also sets the current_window of the WindowCloneContainer to the active window
|
||||||
* if it belongs to this workspace.
|
* if it belongs to this workspace.
|
||||||
*/
|
*/
|
||||||
public void open () {
|
public void open (bool with_gesture = false, bool is_cancel_animation = false) {
|
||||||
if (opened) {
|
if (opened) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -327,7 +327,7 @@ namespace Gala {
|
|||||||
var display = workspace.get_display ();
|
var display = workspace.get_display ();
|
||||||
|
|
||||||
var monitor = display.get_monitor_geometry (display.get_primary_monitor ());
|
var monitor = display.get_monitor_geometry (display.get_primary_monitor ());
|
||||||
var initial_x = gesture_animation_director.canceling ? x : x + current_x_overlap ();
|
var initial_x = is_cancel_animation ? x : x + current_x_overlap ();
|
||||||
var target_x = multitasking_view_x ();
|
var target_x = multitasking_view_x ();
|
||||||
|
|
||||||
var scale = (float)(monitor.height - TOP_OFFSET * scale_factor - BOTTOM_OFFSET * scale_factor) / monitor.height;
|
var scale = (float)(monitor.height - TOP_OFFSET * scale_factor - BOTTOM_OFFSET * scale_factor) / monitor.height;
|
||||||
@ -335,20 +335,20 @@ namespace Gala {
|
|||||||
|
|
||||||
update_size (monitor);
|
update_size (monitor);
|
||||||
|
|
||||||
GestureAnimationDirector.OnBegin on_animation_begin = () => {
|
GestureTracker.OnBegin on_animation_begin = () => {
|
||||||
x = initial_x;
|
x = initial_x;
|
||||||
background.set_pivot_point (0.5f, pivotY);
|
background.set_pivot_point (0.5f, pivotY);
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnUpdate on_animation_update = (percentage) => {
|
GestureTracker.OnUpdate on_animation_update = (percentage) => {
|
||||||
var x = GestureAnimationDirector.animation_value (initial_x, target_x, percentage);
|
var x = GestureTracker.animation_value (initial_x, target_x, percentage);
|
||||||
set_x (x);
|
set_x (x);
|
||||||
|
|
||||||
double update_scale = (double)GestureAnimationDirector.animation_value (1.0f, (float)scale, percentage);
|
double update_scale = (double) GestureTracker.animation_value (1.0f, (float)scale, percentage);
|
||||||
background.set_scale (update_scale, update_scale);
|
background.set_scale (update_scale, update_scale);
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnEnd on_animation_end = (percentage, cancel_action) => {
|
GestureTracker.OnEnd on_animation_end = (percentage, cancel_action) => {
|
||||||
if (cancel_action) {
|
if (cancel_action) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -366,11 +366,11 @@ namespace Gala {
|
|||||||
background.restore_easing_state ();
|
background.restore_easing_state ();
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!gesture_animation_director.running) {
|
if (!with_gesture) {
|
||||||
on_animation_begin (0);
|
on_animation_begin (0);
|
||||||
on_animation_end (100, false, 0);
|
on_animation_end (1, false, 0);
|
||||||
} else {
|
} else {
|
||||||
gesture_animation_director.connect_handlers ((owned) on_animation_begin, (owned) on_animation_update, (owned)on_animation_end);
|
gesture_tracker.connect_handlers ((owned) on_animation_begin, (owned) on_animation_update, (owned)on_animation_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
Meta.Rectangle area = {
|
Meta.Rectangle area = {
|
||||||
@ -388,36 +388,37 @@ namespace Gala {
|
|||||||
|
|
||||||
icon_group.redraw ();
|
icon_group.redraw ();
|
||||||
|
|
||||||
window_container.open (display.get_workspace_manager ().get_active_workspace () == workspace ? display.get_focus_window () : null);
|
Window? selected_window = display.get_workspace_manager ().get_active_workspace () == workspace ? display.get_focus_window () : null;
|
||||||
|
window_container.open (selected_window, with_gesture, is_cancel_animation);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the view again by animating the background back to its scale and
|
* Close the view again by animating the background back to its scale and
|
||||||
* the windows back to their old locations.
|
* the windows back to their old locations.
|
||||||
*/
|
*/
|
||||||
public void close () {
|
public void close (bool with_gesture = false, bool is_cancel_animation = false) {
|
||||||
if (!opened) {
|
if (!opened) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
opened = false;
|
opened = false;
|
||||||
|
|
||||||
var initial_x = gesture_animation_director.canceling ? x : multitasking_view_x ();
|
var initial_x = is_cancel_animation ? x : multitasking_view_x ();
|
||||||
var target_x = multitasking_view_x () + current_x_overlap ();
|
var target_x = multitasking_view_x () + current_x_overlap ();
|
||||||
|
|
||||||
double initial_scale_x, initial_scale_y;
|
double initial_scale_x, initial_scale_y;
|
||||||
background.get_scale (out initial_scale_x, out initial_scale_y);
|
background.get_scale (out initial_scale_x, out initial_scale_y);
|
||||||
|
|
||||||
GestureAnimationDirector.OnUpdate on_animation_update = (percentage) => {
|
GestureTracker.OnUpdate on_animation_update = (percentage) => {
|
||||||
var x = GestureAnimationDirector.animation_value (initial_x, target_x, percentage);
|
var x = GestureTracker.animation_value (initial_x, target_x, percentage);
|
||||||
set_x (x);
|
set_x (x);
|
||||||
|
|
||||||
double scale_x = (double) GestureAnimationDirector.animation_value ((float) initial_scale_x, 1.0f, percentage);
|
double scale_x = (double) GestureTracker.animation_value ((float) initial_scale_x, 1.0f, percentage);
|
||||||
double scale_y = (double) GestureAnimationDirector.animation_value ((float) initial_scale_y, 1.0f, percentage);
|
double scale_y = (double) GestureTracker.animation_value ((float) initial_scale_y, 1.0f, percentage);
|
||||||
background.set_scale (scale_x, scale_y);
|
background.set_scale (scale_x, scale_y);
|
||||||
};
|
};
|
||||||
|
|
||||||
GestureAnimationDirector.OnEnd on_animation_end = (percentage, cancel_action) => {
|
GestureTracker.OnEnd on_animation_end = (percentage, cancel_action) => {
|
||||||
if (cancel_action) {
|
if (cancel_action) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -435,13 +436,13 @@ namespace Gala {
|
|||||||
background.restore_easing_state ();
|
background.restore_easing_state ();
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!gesture_animation_director.running) {
|
if (!with_gesture) {
|
||||||
on_animation_end (100, false, 0);
|
on_animation_end (1, false, 0);
|
||||||
} else {
|
} else {
|
||||||
gesture_animation_director.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end);
|
gesture_tracker.connect_handlers (null, (owned) on_animation_update, (owned) on_animation_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
window_container.close ();
|
window_container.close (with_gesture, is_cancel_animation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user