2011-09-28 09:16:26 -04:00
|
|
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
2019-07-16 05:24:13 -04:00
|
|
|
/* exported WorkspacesView, WorkspacesDisplay */
|
2010-01-21 21:33:48 -05:00
|
|
|
|
2019-10-16 01:39:48 -04:00
|
|
|
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
2010-01-21 21:33:48 -05:00
|
|
|
|
|
|
|
const Main = imports.ui.main;
|
2019-07-08 04:47:04 -04:00
|
|
|
const SwipeTracker = imports.ui.swipeTracker;
|
2010-01-21 21:33:48 -05:00
|
|
|
const Workspace = imports.ui.workspace;
|
|
|
|
|
2020-06-25 13:54:54 -04:00
|
|
|
var { ANIMATION_TIME } = imports.ui.overview;
|
2019-08-01 19:13:10 -04:00
|
|
|
var WORKSPACE_SWITCH_TIME = 250;
|
2020-05-09 10:27:00 -04:00
|
|
|
var SCROLL_TIMEOUT_TIME = 150;
|
2010-01-21 21:33:48 -05:00
|
|
|
|
2017-07-18 13:47:27 -04:00
|
|
|
var AnimationType = {
|
2014-07-14 13:06:08 -04:00
|
|
|
ZOOM: 0,
|
2019-08-20 17:43:54 -04:00
|
|
|
FADE: 1,
|
2014-07-14 13:06:08 -04:00
|
|
|
};
|
|
|
|
|
2018-11-08 04:47:25 -05:00
|
|
|
const MUTTER_SCHEMA = 'org.gnome.mutter';
|
2010-03-16 11:51:24 -04:00
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
var WorkspacesViewBase = GObject.registerClass({
|
2019-08-20 17:43:54 -04:00
|
|
|
GTypeFlags: GObject.TypeFlags.ABSTRACT,
|
2019-07-16 05:24:13 -04:00
|
|
|
}, class WorkspacesViewBase extends St.Widget {
|
|
|
|
_init(monitorIndex) {
|
2020-06-25 19:15:33 -04:00
|
|
|
const { x, y, width, height } =
|
2020-06-25 19:08:29 -04:00
|
|
|
Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
|
2020-06-25 19:15:33 -04:00
|
|
|
|
|
|
|
super._init({
|
|
|
|
style_class: 'workspaces-view',
|
|
|
|
x, y, width, height,
|
|
|
|
});
|
2019-07-16 05:24:13 -04:00
|
|
|
this.connect('destroy', this._onDestroy.bind(this));
|
|
|
|
global.focus_manager.add_group(this);
|
2010-01-21 21:33:48 -05:00
|
|
|
|
2013-09-11 12:12:42 -04:00
|
|
|
this._monitorIndex = monitorIndex;
|
2010-02-18 10:43:58 -05:00
|
|
|
|
2013-09-11 12:12:42 -04:00
|
|
|
this._inDrag = false;
|
2017-12-01 19:27:35 -05:00
|
|
|
this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._dragBegin.bind(this));
|
|
|
|
this._windowDragEndId = Main.overview.connect('window-drag-end', this._dragEnd.bind(this));
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-09-11 12:12:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onDestroy() {
|
2013-09-11 12:12:42 -04:00
|
|
|
this._dragEnd();
|
|
|
|
|
|
|
|
if (this._windowDragBeginId > 0) {
|
|
|
|
Main.overview.disconnect(this._windowDragBeginId);
|
|
|
|
this._windowDragBeginId = 0;
|
|
|
|
}
|
|
|
|
if (this._windowDragEndId > 0) {
|
|
|
|
Main.overview.disconnect(this._windowDragEndId);
|
|
|
|
this._windowDragEndId = 0;
|
|
|
|
}
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-09-11 12:12:42 -04:00
|
|
|
|
2020-06-02 20:22:40 -04:00
|
|
|
_dragBegin() {
|
2013-09-11 12:12:42 -04:00
|
|
|
this._inDrag = true;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-09-11 12:12:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_dragEnd() {
|
2013-09-11 12:12:42 -04:00
|
|
|
this._inDrag = false;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-09-11 12:12:42 -04:00
|
|
|
|
2020-06-03 12:17:54 -04:00
|
|
|
vfunc_allocate(box) {
|
|
|
|
this.set_allocation(box);
|
|
|
|
|
|
|
|
for (const child of this)
|
|
|
|
child.allocate_available_size(0, 0, box.get_width(), box.get_height());
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2019-07-16 05:24:13 -04:00
|
|
|
});
|
2013-09-11 12:12:42 -04:00
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
var WorkspacesView = GObject.registerClass(
|
|
|
|
class WorkspacesView extends WorkspacesViewBase {
|
2019-07-07 13:51:55 -04:00
|
|
|
_init(monitorIndex, scrollAdjustment) {
|
2018-01-03 02:55:38 -05:00
|
|
|
let workspaceManager = global.workspace_manager;
|
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
super._init(monitorIndex);
|
2020-08-31 15:11:18 -04:00
|
|
|
this.clip_to_allocation = true;
|
2013-09-11 10:09:13 -04:00
|
|
|
|
2010-11-12 04:28:28 -05:00
|
|
|
this._animating = false; // tweening
|
2019-03-20 13:19:01 -04:00
|
|
|
this._gestureActive = false; // touch(pad) gestures
|
2010-01-21 21:33:48 -05:00
|
|
|
|
2019-07-07 13:51:55 -04:00
|
|
|
this._scrollAdjustment = scrollAdjustment;
|
2020-06-26 10:04:44 -04:00
|
|
|
this._onScrollId = this._scrollAdjustment.connect('notify::value',
|
2020-12-18 10:21:58 -05:00
|
|
|
this._onScrollAdjustmentChanged.bind(this));
|
2010-01-21 21:33:48 -05:00
|
|
|
|
2013-09-11 10:09:13 -04:00
|
|
|
this._workspaces = [];
|
|
|
|
this._updateWorkspaces();
|
2018-01-03 02:55:38 -05:00
|
|
|
this._updateWorkspacesId =
|
|
|
|
workspaceManager.connect('notify::n-workspaces',
|
|
|
|
this._updateWorkspaces.bind(this));
|
2019-07-09 08:03:22 -04:00
|
|
|
this._reorderWorkspacesId =
|
|
|
|
workspaceManager.connect('workspaces-reordered', () => {
|
|
|
|
this._workspaces.sort((a, b) => {
|
|
|
|
return a.metaWorkspace.index() - b.metaWorkspace.index();
|
|
|
|
});
|
2020-06-26 10:04:44 -04:00
|
|
|
this._workspaces.forEach(
|
|
|
|
(ws, i) => this.set_child_at_index(ws, i));
|
2019-07-09 08:03:22 -04:00
|
|
|
});
|
|
|
|
|
2010-01-21 21:33:48 -05:00
|
|
|
this._switchWorkspaceNotifyId =
|
|
|
|
global.window_manager.connect('switch-workspace',
|
2017-12-01 19:27:35 -05:00
|
|
|
this._activeWorkspaceChanged.bind(this));
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-11-25 09:44:17 -05:00
|
|
|
|
2020-06-26 10:04:44 -04:00
|
|
|
vfunc_allocate(box) {
|
|
|
|
this.set_allocation(box);
|
|
|
|
|
|
|
|
if (this.get_n_children() === 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
const { workspaceManager } = global;
|
|
|
|
const { nWorkspaces } = workspaceManager;
|
|
|
|
|
|
|
|
const vertical = workspaceManager.layout_rows === -1;
|
|
|
|
const rtl = this.text_direction === Clutter.TextDirection.RTL;
|
|
|
|
|
2020-12-11 13:57:49 -05:00
|
|
|
const [width, height] = box.get_size();
|
|
|
|
const childBox = box.copy();
|
|
|
|
|
2020-06-26 10:04:44 -04:00
|
|
|
this._workspaces.forEach((child, index) => {
|
|
|
|
if (rtl && !vertical)
|
|
|
|
index = nWorkspaces - index - 1;
|
|
|
|
|
2020-12-11 13:57:49 -05:00
|
|
|
childBox.set_origin(
|
|
|
|
vertical ? 0 : index * width,
|
|
|
|
vertical ? index * height : 0);
|
|
|
|
child.allocate_align_fill(childBox, 0.5, 0.5, false, false);
|
2020-06-26 10:04:44 -04:00
|
|
|
});
|
|
|
|
|
2020-12-18 10:21:58 -05:00
|
|
|
this._updateScrollPosition();
|
2020-06-26 10:04:44 -04:00
|
|
|
}
|
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
getActiveWorkspace() {
|
2018-01-03 02:55:38 -05:00
|
|
|
let workspaceManager = global.workspace_manager;
|
|
|
|
let active = workspaceManager.get_active_workspace_index();
|
2010-07-15 10:21:32 -04:00
|
|
|
return this._workspaces[active];
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-07-15 10:21:32 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
animateToOverview(animationType) {
|
2014-07-14 13:06:08 -04:00
|
|
|
for (let w = 0; w < this._workspaces.length; w++) {
|
|
|
|
if (animationType == AnimationType.ZOOM)
|
|
|
|
this._workspaces[w].zoomToOverview();
|
|
|
|
else
|
|
|
|
this._workspaces[w].fadeToOverview();
|
|
|
|
}
|
2020-06-26 10:04:44 -04:00
|
|
|
this._updateScrollPosition();
|
2020-10-02 13:26:46 -04:00
|
|
|
this._updateVisibility();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-01-21 21:33:48 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
animateFromOverview(animationType) {
|
2014-07-14 13:06:08 -04:00
|
|
|
for (let w = 0; w < this._workspaces.length; w++) {
|
|
|
|
if (animationType == AnimationType.ZOOM)
|
|
|
|
this._workspaces[w].zoomFromOverview();
|
|
|
|
else
|
|
|
|
this._workspaces[w].fadeFromOverview();
|
|
|
|
}
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-02-18 10:43:58 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
syncStacking(stackIndices) {
|
2010-01-21 21:33:48 -05:00
|
|
|
for (let i = 0; i < this._workspaces.length; i++)
|
|
|
|
this._workspaces[i].syncStacking(stackIndices);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-01-21 21:33:48 -05:00
|
|
|
|
2020-06-26 10:04:44 -04:00
|
|
|
_scrollToActive() {
|
|
|
|
const { workspaceManager } = global;
|
|
|
|
const active = workspaceManager.get_active_workspace_index();
|
2010-03-22 19:01:44 -04:00
|
|
|
|
2020-06-26 10:04:44 -04:00
|
|
|
this._animating = true;
|
|
|
|
this._updateVisibility();
|
2010-02-10 00:56:36 -05:00
|
|
|
|
2020-06-26 10:04:44 -04:00
|
|
|
this._scrollAdjustment.remove_transition('value');
|
|
|
|
this._scrollAdjustment.ease(active, {
|
|
|
|
duration: WORKSPACE_SWITCH_TIME,
|
|
|
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
|
|
|
onComplete: () => {
|
|
|
|
this._animating = false;
|
|
|
|
this._updateVisibility();
|
|
|
|
},
|
|
|
|
});
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-02-11 09:52:49 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_updateVisibility() {
|
2018-01-03 02:55:38 -05:00
|
|
|
let workspaceManager = global.workspace_manager;
|
|
|
|
let active = workspaceManager.get_active_workspace_index();
|
2010-02-11 09:52:49 -05:00
|
|
|
|
2010-03-22 19:01:44 -04:00
|
|
|
for (let w = 0; w < this._workspaces.length; w++) {
|
|
|
|
let workspace = this._workspaces[w];
|
2019-08-19 22:10:46 -04:00
|
|
|
|
2019-07-08 04:47:04 -04:00
|
|
|
if (this._animating || this._gestureActive)
|
2019-07-16 05:24:13 -04:00
|
|
|
workspace.show();
|
2019-08-19 22:10:46 -04:00
|
|
|
else if (this._inDrag)
|
2019-08-19 15:38:51 -04:00
|
|
|
workspace.visible = Math.abs(w - active) <= 1;
|
2019-08-19 22:10:46 -04:00
|
|
|
else
|
2019-08-19 15:38:51 -04:00
|
|
|
workspace.visible = w == active;
|
2010-02-11 09:52:49 -05:00
|
|
|
}
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-02-11 09:52:49 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_updateWorkspaces() {
|
2018-01-03 02:55:38 -05:00
|
|
|
let workspaceManager = global.workspace_manager;
|
|
|
|
let newNumWorkspaces = workspaceManager.n_workspaces;
|
2013-09-11 10:09:13 -04:00
|
|
|
|
2014-01-03 13:04:06 -05:00
|
|
|
for (let j = 0; j < newNumWorkspaces; j++) {
|
2018-01-03 02:55:38 -05:00
|
|
|
let metaWorkspace = workspaceManager.get_workspace_by_index(j);
|
2014-01-03 13:04:06 -05:00
|
|
|
let workspace;
|
|
|
|
|
|
|
|
if (j >= this._workspaces.length) { /* added */
|
|
|
|
workspace = new Workspace.Workspace(metaWorkspace, this._monitorIndex);
|
2019-07-16 05:24:13 -04:00
|
|
|
this.add_actor(workspace);
|
2014-01-03 13:04:06 -05:00
|
|
|
this._workspaces[j] = workspace;
|
|
|
|
} else {
|
|
|
|
workspace = this._workspaces[j];
|
|
|
|
|
|
|
|
if (workspace.metaWorkspace != metaWorkspace) { /* removed */
|
|
|
|
workspace.destroy();
|
|
|
|
this._workspaces.splice(j, 1);
|
|
|
|
} /* else kept */
|
2011-06-01 08:47:51 -04:00
|
|
|
}
|
2010-01-21 21:33:48 -05:00
|
|
|
}
|
2013-09-11 10:09:13 -04:00
|
|
|
|
2020-09-29 12:38:40 -04:00
|
|
|
for (let j = this._workspaces.length - 1; j >= newNumWorkspaces; j--) {
|
|
|
|
this._workspaces[j].destroy();
|
|
|
|
this._workspaces.splice(j, 1);
|
|
|
|
}
|
|
|
|
|
2020-06-26 10:04:44 -04:00
|
|
|
this._updateScrollPosition();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-01-21 21:33:48 -05:00
|
|
|
|
2019-01-31 09:08:10 -05:00
|
|
|
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
|
2010-02-10 00:56:36 -05:00
|
|
|
if (this._scrolling)
|
|
|
|
return;
|
|
|
|
|
2020-06-26 10:04:44 -04:00
|
|
|
this._scrollToActive();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-01-21 21:33:48 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onDestroy() {
|
2017-10-30 21:19:44 -04:00
|
|
|
super._onDestroy();
|
2013-09-11 12:12:42 -04:00
|
|
|
|
2019-07-07 13:51:55 -04:00
|
|
|
this._scrollAdjustment.disconnect(this._onScrollId);
|
2010-11-12 04:28:28 -05:00
|
|
|
global.window_manager.disconnect(this._switchWorkspaceNotifyId);
|
2018-01-03 02:55:38 -05:00
|
|
|
let workspaceManager = global.workspace_manager;
|
|
|
|
workspaceManager.disconnect(this._updateWorkspacesId);
|
2019-07-09 08:03:22 -04:00
|
|
|
workspaceManager.disconnect(this._reorderWorkspacesId);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-03-16 11:51:24 -04:00
|
|
|
|
2019-03-20 13:19:01 -04:00
|
|
|
startTouchGesture() {
|
|
|
|
this._gestureActive = true;
|
2020-07-10 09:41:09 -04:00
|
|
|
|
|
|
|
this._updateVisibility();
|
2019-03-20 13:19:01 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
endTouchGesture() {
|
|
|
|
this._gestureActive = false;
|
|
|
|
|
|
|
|
// Make sure title captions etc are shown as necessary
|
2020-06-26 10:04:44 -04:00
|
|
|
this._scrollToActive();
|
2019-03-20 13:19:01 -04:00
|
|
|
this._updateVisibility();
|
|
|
|
}
|
|
|
|
|
2010-07-11 08:41:17 -04:00
|
|
|
// sync the workspaces' positions to the value of the scroll adjustment
|
2010-02-10 00:56:36 -05:00
|
|
|
// and change the active workspace if appropriate
|
2020-12-18 10:21:58 -05:00
|
|
|
_onScrollAdjustmentChanged() {
|
2020-06-26 10:04:44 -04:00
|
|
|
if (!this.has_allocation())
|
2010-02-10 00:56:36 -05:00
|
|
|
return;
|
|
|
|
|
2020-06-26 10:04:44 -04:00
|
|
|
const adj = this._scrollAdjustment;
|
|
|
|
const allowSwitch =
|
|
|
|
adj.get_transition('value') === null && !this._gestureActive;
|
|
|
|
|
2018-01-03 02:55:38 -05:00
|
|
|
let workspaceManager = global.workspace_manager;
|
|
|
|
let active = workspaceManager.get_active_workspace_index();
|
2010-02-10 00:56:36 -05:00
|
|
|
let current = Math.round(adj.value);
|
|
|
|
|
2020-06-26 10:04:44 -04:00
|
|
|
if (allowSwitch && active !== current) {
|
2013-01-18 20:26:44 -05:00
|
|
|
if (!this._workspaces[current]) {
|
|
|
|
// The current workspace was destroyed. This could happen
|
|
|
|
// when you are on the last empty workspace, and consolidate
|
|
|
|
// windows using the thumbnail bar.
|
|
|
|
// In that case, the intended behavior is to stay on the empty
|
|
|
|
// workspace, which is the last one, so pick it.
|
|
|
|
current = this._workspaces.length - 1;
|
|
|
|
}
|
|
|
|
|
2010-02-14 18:32:57 -05:00
|
|
|
let metaWorkspace = this._workspaces[current].metaWorkspace;
|
2010-07-11 08:41:17 -04:00
|
|
|
metaWorkspace.activate(global.get_current_time());
|
2010-02-10 00:56:36 -05:00
|
|
|
}
|
|
|
|
|
2020-12-18 10:21:58 -05:00
|
|
|
this._updateScrollPosition();
|
|
|
|
}
|
|
|
|
|
|
|
|
_updateScrollPosition() {
|
|
|
|
if (!this.has_allocation())
|
|
|
|
return;
|
|
|
|
|
|
|
|
const adj = this._scrollAdjustment;
|
|
|
|
|
2010-02-10 00:56:36 -05:00
|
|
|
if (adj.upper == 1)
|
|
|
|
return;
|
|
|
|
|
2020-12-18 10:21:58 -05:00
|
|
|
const workspaceManager = global.workspace_manager;
|
2020-06-26 10:04:44 -04:00
|
|
|
const vertical = workspaceManager.layout_rows === -1;
|
|
|
|
const rtl = this.text_direction === Clutter.TextDirection.RTL;
|
|
|
|
const progress = vertical || !rtl
|
2021-01-07 20:14:42 -05:00
|
|
|
? adj.value : adj.upper - adj.value - 1;
|
2019-06-04 15:49:23 -04:00
|
|
|
|
2020-06-26 10:04:44 -04:00
|
|
|
for (const ws of this._workspaces) {
|
|
|
|
if (vertical)
|
|
|
|
ws.translation_y = -progress * this.height;
|
|
|
|
else
|
|
|
|
ws.translation_x = -progress * this.width;
|
2010-02-10 00:56:36 -05:00
|
|
|
}
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2019-07-16 05:24:13 -04:00
|
|
|
});
|
2010-10-04 10:42:11 -04:00
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
var ExtraWorkspaceView = GObject.registerClass(
|
|
|
|
class ExtraWorkspaceView extends WorkspacesViewBase {
|
|
|
|
_init(monitorIndex) {
|
|
|
|
super._init(monitorIndex);
|
2013-09-11 12:12:42 -04:00
|
|
|
this._workspace = new Workspace.Workspace(null, monitorIndex);
|
2019-07-16 05:24:13 -04:00
|
|
|
this.add_actor(this._workspace);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-09-11 12:12:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
getActiveWorkspace() {
|
2016-06-24 12:15:48 -04:00
|
|
|
return this._workspace;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2016-06-24 12:15:48 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
animateToOverview(animationType) {
|
2014-07-14 13:06:08 -04:00
|
|
|
if (animationType == AnimationType.ZOOM)
|
|
|
|
this._workspace.zoomToOverview();
|
|
|
|
else
|
|
|
|
this._workspace.fadeToOverview();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-09-11 12:12:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
animateFromOverview(animationType) {
|
2014-07-14 13:06:08 -04:00
|
|
|
if (animationType == AnimationType.ZOOM)
|
|
|
|
this._workspace.zoomFromOverview();
|
|
|
|
else
|
|
|
|
this._workspace.fadeFromOverview();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-09-11 12:12:42 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
syncStacking(stackIndices) {
|
2013-09-11 12:12:42 -04:00
|
|
|
this._workspace.syncStacking(stackIndices);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-09-11 12:12:42 -04:00
|
|
|
|
2019-03-20 13:19:01 -04:00
|
|
|
startTouchGesture() {
|
|
|
|
}
|
|
|
|
|
|
|
|
endTouchGesture() {
|
|
|
|
}
|
2013-11-04 17:23:44 -05:00
|
|
|
});
|
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
var WorkspacesDisplay = GObject.registerClass(
|
|
|
|
class WorkspacesDisplay extends St.Widget {
|
2019-07-08 04:03:20 -04:00
|
|
|
_init(scrollAdjustment) {
|
2020-06-02 13:15:45 -04:00
|
|
|
super._init({
|
|
|
|
visible: false,
|
|
|
|
clip_to_allocation: true,
|
|
|
|
});
|
2019-07-16 05:24:13 -04:00
|
|
|
this.connect('notify::allocation', this._updateWorkspacesActualGeometry.bind(this));
|
2012-12-13 14:19:44 -05:00
|
|
|
|
2020-10-03 04:12:13 -04:00
|
|
|
Main.overview.connect('relayout',
|
|
|
|
() => this._updateWorkspacesActualGeometry());
|
|
|
|
|
2019-07-07 13:51:55 -04:00
|
|
|
let workspaceManager = global.workspace_manager;
|
2019-07-08 04:03:20 -04:00
|
|
|
this._scrollAdjustment = scrollAdjustment;
|
2019-07-07 13:51:55 -04:00
|
|
|
|
|
|
|
this._switchWorkspaceId =
|
|
|
|
global.window_manager.connect('switch-workspace',
|
|
|
|
this._activeWorkspaceChanged.bind(this));
|
|
|
|
|
|
|
|
this._reorderWorkspacesdId =
|
|
|
|
workspaceManager.connect('workspaces-reordered',
|
|
|
|
this._workspacesReordered.bind(this));
|
|
|
|
|
2019-07-08 04:47:04 -04:00
|
|
|
this._swipeTracker = new SwipeTracker.SwipeTracker(
|
|
|
|
Main.layoutManager.overviewGroup, Shell.ActionMode.OVERVIEW);
|
|
|
|
this._swipeTracker.connect('begin', this._switchWorkspaceBegin.bind(this));
|
|
|
|
this._swipeTracker.connect('update', this._switchWorkspaceUpdate.bind(this));
|
|
|
|
this._swipeTracker.connect('end', this._switchWorkspaceEnd.bind(this));
|
2020-01-28 14:08:32 -05:00
|
|
|
this.connect('notify::mapped', this._updateSwipeTracker.bind(this));
|
|
|
|
|
|
|
|
this._windowDragBeginId =
|
|
|
|
Main.overview.connect('window-drag-begin',
|
|
|
|
this._windowDragBegin.bind(this));
|
|
|
|
this._windowDragEndId =
|
2020-12-27 14:33:34 -05:00
|
|
|
Main.overview.connect('window-drag-end',
|
2020-01-28 14:08:32 -05:00
|
|
|
this._windowDragEnd.bind(this));
|
2020-07-11 12:19:27 -04:00
|
|
|
this._overviewShownId = Main.overview.connect('shown', () => {
|
|
|
|
this._inWindowFade = false;
|
|
|
|
this._syncWorkspacesActualGeometry();
|
|
|
|
});
|
2019-03-20 13:19:01 -04:00
|
|
|
|
2020-06-05 01:23:53 -04:00
|
|
|
this._primaryVisible = true;
|
2011-11-25 12:25:31 -05:00
|
|
|
this._primaryIndex = Main.layoutManager.primaryIndex;
|
2012-12-16 18:46:34 -05:00
|
|
|
this._workspacesViews = [];
|
2011-11-25 12:25:31 -05:00
|
|
|
|
2018-11-08 04:47:25 -05:00
|
|
|
this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
|
2011-11-25 12:25:31 -05:00
|
|
|
this._settings.connect('changed::workspaces-only-on-primary',
|
2017-12-01 19:27:35 -05:00
|
|
|
this._workspacesOnlyOnPrimaryChanged.bind(this));
|
2011-11-25 12:25:31 -05:00
|
|
|
this._workspacesOnlyOnPrimaryChanged();
|
2011-01-30 20:35:58 -05:00
|
|
|
|
2011-11-25 18:02:13 -05:00
|
|
|
this._notifyOpacityId = 0;
|
2018-09-25 18:00:53 -04:00
|
|
|
this._restackedNotifyId = 0;
|
2012-10-22 11:39:46 -04:00
|
|
|
this._scrollEventId = 0;
|
2015-03-26 11:17:35 -04:00
|
|
|
this._keyPressEventId = 0;
|
2019-10-16 01:39:48 -04:00
|
|
|
this._scrollTimeoutId = 0;
|
2020-06-03 12:17:54 -04:00
|
|
|
this._syncActualGeometryLater = 0;
|
2013-02-25 18:25:27 -05:00
|
|
|
|
2020-05-20 06:05:04 -04:00
|
|
|
this._actualGeometry = null;
|
2020-01-28 14:08:32 -05:00
|
|
|
this._inWindowDrag = false;
|
2020-07-11 12:19:27 -04:00
|
|
|
this._inWindowFade = false;
|
2021-01-13 17:24:49 -05:00
|
|
|
this._leavingOverview = false;
|
2019-08-12 10:25:48 -04:00
|
|
|
|
2019-07-07 13:51:55 -04:00
|
|
|
this._gestureActive = false; // touch(pad) gestures
|
2019-10-16 01:39:48 -04:00
|
|
|
this._canScroll = true; // limiting scrolling speed
|
2019-07-07 13:51:55 -04:00
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
this.connect('destroy', this._onDestroy.bind(this));
|
2019-08-12 10:25:48 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
_onDestroy() {
|
|
|
|
if (this._notifyOpacityId) {
|
2019-07-16 05:24:13 -04:00
|
|
|
let parent = this.get_parent();
|
2019-08-12 10:25:48 -04:00
|
|
|
if (parent)
|
|
|
|
parent.disconnect(this._notifyOpacityId);
|
|
|
|
this._notifyOpacityId = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this._parentSetLater) {
|
|
|
|
Meta.later_remove(this._parentSetLater);
|
|
|
|
this._parentSetLater = 0;
|
|
|
|
}
|
2019-07-07 13:51:55 -04:00
|
|
|
|
2020-06-03 12:17:54 -04:00
|
|
|
if (this._syncActualGeometryLater) {
|
|
|
|
Meta.later_remove(this._syncActualGeometryLater);
|
|
|
|
this._syncActualGeometryLater = 0;
|
|
|
|
}
|
|
|
|
|
2019-10-16 01:39:48 -04:00
|
|
|
if (this._scrollTimeoutId !== 0) {
|
|
|
|
GLib.source_remove(this._scrollTimeoutId);
|
|
|
|
this._scrollTimeoutId = 0;
|
|
|
|
}
|
|
|
|
|
2019-07-07 13:51:55 -04:00
|
|
|
global.window_manager.disconnect(this._switchWorkspaceId);
|
|
|
|
global.workspace_manager.disconnect(this._reorderWorkspacesdId);
|
2020-01-28 14:08:32 -05:00
|
|
|
Main.overview.disconnect(this._windowDragBeginId);
|
|
|
|
Main.overview.disconnect(this._windowDragEndId);
|
2020-07-07 07:25:47 -04:00
|
|
|
Main.overview.disconnect(this._overviewShownId);
|
2020-01-28 14:08:32 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
_windowDragBegin() {
|
|
|
|
this._inWindowDrag = true;
|
|
|
|
this._updateSwipeTracker();
|
|
|
|
}
|
|
|
|
|
|
|
|
_windowDragEnd() {
|
|
|
|
this._inWindowDrag = false;
|
|
|
|
this._updateSwipeTracker();
|
|
|
|
}
|
|
|
|
|
|
|
|
_updateSwipeTracker() {
|
2021-01-13 17:24:49 -05:00
|
|
|
this._swipeTracker.enabled =
|
|
|
|
this.mapped &&
|
|
|
|
!this._inWindowDrag &&
|
|
|
|
!this._leavingOverview;
|
2019-07-07 13:51:55 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
_workspacesReordered() {
|
|
|
|
let workspaceManager = global.workspace_manager;
|
|
|
|
|
|
|
|
this._scrollAdjustment.value =
|
|
|
|
workspaceManager.get_active_workspace_index();
|
|
|
|
}
|
|
|
|
|
2020-06-25 18:25:22 -04:00
|
|
|
_activeWorkspaceChanged(_wm, _from, to, _direction) {
|
2019-07-08 04:47:04 -04:00
|
|
|
if (this._gestureActive)
|
2019-07-07 13:51:55 -04:00
|
|
|
return;
|
|
|
|
|
2020-06-25 18:25:22 -04:00
|
|
|
this._scrollAdjustment.ease(to, {
|
2019-07-08 04:47:04 -04:00
|
|
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
2019-07-07 13:51:55 -04:00
|
|
|
duration: WORKSPACE_SWITCH_TIME,
|
|
|
|
});
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2012-10-19 07:55:18 -04:00
|
|
|
|
2019-07-08 04:47:04 -04:00
|
|
|
_directionForProgress(progress) {
|
|
|
|
if (global.workspace_manager.layout_rows === -1) {
|
|
|
|
return progress > 0
|
|
|
|
? Meta.MotionDirection.DOWN
|
|
|
|
: Meta.MotionDirection.UP;
|
|
|
|
} else if (this.text_direction === Clutter.TextDirection.RTL) {
|
|
|
|
return progress > 0
|
|
|
|
? Meta.MotionDirection.LEFT
|
|
|
|
: Meta.MotionDirection.RIGHT;
|
|
|
|
} else {
|
|
|
|
return progress > 0
|
|
|
|
? Meta.MotionDirection.RIGHT
|
|
|
|
: Meta.MotionDirection.LEFT;
|
|
|
|
}
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2012-11-25 23:40:48 -05:00
|
|
|
|
2019-07-08 04:47:04 -04:00
|
|
|
_switchWorkspaceBegin(tracker, monitor) {
|
|
|
|
if (this._workspacesOnlyOnPrimary && monitor !== this._primaryIndex)
|
|
|
|
return;
|
2019-03-20 13:19:01 -04:00
|
|
|
|
2019-07-08 04:47:04 -04:00
|
|
|
let workspaceManager = global.workspace_manager;
|
|
|
|
let adjustment = this._scrollAdjustment;
|
|
|
|
if (this._gestureActive)
|
|
|
|
adjustment.remove_transition('value');
|
|
|
|
|
|
|
|
tracker.orientation = workspaceManager.layout_rows !== -1
|
|
|
|
? Clutter.Orientation.HORIZONTAL
|
|
|
|
: Clutter.Orientation.VERTICAL;
|
2019-03-20 13:19:01 -04:00
|
|
|
|
|
|
|
for (let i = 0; i < this._workspacesViews.length; i++)
|
|
|
|
this._workspacesViews[i].startTouchGesture();
|
|
|
|
|
2019-07-08 04:47:04 -04:00
|
|
|
let distance = global.workspace_manager.layout_rows === -1
|
2020-06-27 11:25:25 -04:00
|
|
|
? this.height : this.width;
|
2019-03-20 13:19:01 -04:00
|
|
|
|
2019-07-08 04:47:04 -04:00
|
|
|
let progress = adjustment.value / adjustment.page_size;
|
|
|
|
let points = Array.from(
|
|
|
|
{ length: workspaceManager.n_workspaces }, (v, i) => i);
|
2019-03-20 13:19:01 -04:00
|
|
|
|
2019-07-08 04:47:04 -04:00
|
|
|
tracker.confirmSwipe(distance, points, progress, Math.round(progress));
|
|
|
|
|
|
|
|
this._gestureActive = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
_switchWorkspaceUpdate(tracker, progress) {
|
2019-03-20 13:19:01 -04:00
|
|
|
let adjustment = this._scrollAdjustment;
|
2019-07-08 04:47:04 -04:00
|
|
|
adjustment.value = progress * adjustment.page_size;
|
2019-03-20 13:19:01 -04:00
|
|
|
}
|
|
|
|
|
2019-07-08 04:47:04 -04:00
|
|
|
_switchWorkspaceEnd(tracker, duration, endProgress) {
|
2019-03-20 13:19:01 -04:00
|
|
|
let workspaceManager = global.workspace_manager;
|
2019-07-08 04:47:04 -04:00
|
|
|
let newWs = workspaceManager.get_workspace_by_index(endProgress);
|
|
|
|
|
|
|
|
this._scrollAdjustment.ease(endProgress, {
|
|
|
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
|
|
|
duration,
|
|
|
|
onComplete: () => {
|
2020-06-29 10:50:27 -04:00
|
|
|
if (!newWs.active)
|
2019-07-08 04:47:04 -04:00
|
|
|
newWs.activate(global.get_current_time());
|
|
|
|
this._endTouchGesture();
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
2019-03-20 13:19:01 -04:00
|
|
|
|
2019-07-08 04:47:04 -04:00
|
|
|
_endTouchGesture() {
|
|
|
|
for (let i = 0; i < this._workspacesViews.length; i++)
|
|
|
|
this._workspacesViews[i].endTouchGesture();
|
|
|
|
this._gestureActive = false;
|
2019-03-20 13:19:01 -04:00
|
|
|
}
|
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
vfunc_navigate_focus(from, direction) {
|
|
|
|
return this._getPrimaryView().navigate_focus(from, direction, false);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-11-04 17:23:44 -05:00
|
|
|
|
2020-06-05 01:23:53 -04:00
|
|
|
setPrimaryWorkspaceVisible(visible) {
|
|
|
|
if (this._primaryVisible === visible)
|
|
|
|
return;
|
|
|
|
|
|
|
|
this._primaryVisible = visible;
|
|
|
|
|
|
|
|
const primaryIndex = Main.layoutManager.primaryIndex;
|
|
|
|
const primaryWorkspace = this._workspacesViews[primaryIndex];
|
|
|
|
if (primaryWorkspace)
|
|
|
|
primaryWorkspace.visible = visible;
|
|
|
|
}
|
|
|
|
|
2020-06-01 11:20:44 -04:00
|
|
|
animateToOverview(fadeOnPrimary) {
|
2020-06-02 13:15:45 -04:00
|
|
|
this.show();
|
2011-11-25 12:25:31 -05:00
|
|
|
this._updateWorkspacesViews();
|
2020-05-20 07:39:11 -04:00
|
|
|
|
2020-07-11 12:10:18 -04:00
|
|
|
for (let i = 0; i < this._workspacesViews.length; i++) {
|
|
|
|
let animationType;
|
|
|
|
if (fadeOnPrimary && i == this._primaryIndex)
|
|
|
|
animationType = AnimationType.FADE;
|
|
|
|
else
|
|
|
|
animationType = AnimationType.ZOOM;
|
|
|
|
this._workspacesViews[i].animateToOverview(animationType);
|
2014-07-14 13:06:08 -04:00
|
|
|
}
|
2010-02-14 18:32:57 -05:00
|
|
|
|
2020-07-11 12:19:27 -04:00
|
|
|
this._inWindowFade = fadeOnPrimary;
|
|
|
|
|
2020-07-11 12:10:18 -04:00
|
|
|
if (this._actualGeometry && !fadeOnPrimary)
|
|
|
|
this._syncWorkspacesActualGeometry();
|
|
|
|
|
2011-01-30 20:44:05 -05:00
|
|
|
this._restackedNotifyId =
|
2012-12-13 11:00:30 -05:00
|
|
|
Main.overview.connect('windows-restacked',
|
2017-12-01 19:27:35 -05:00
|
|
|
this._onRestacked.bind(this));
|
2012-10-22 11:39:46 -04:00
|
|
|
if (this._scrollEventId == 0)
|
2017-12-01 19:27:35 -05:00
|
|
|
this._scrollEventId = Main.overview.connect('scroll-event', this._onScrollEvent.bind(this));
|
2015-03-26 11:17:35 -04:00
|
|
|
|
|
|
|
if (this._keyPressEventId == 0)
|
2017-12-01 19:27:35 -05:00
|
|
|
this._keyPressEventId = global.stage.connect('key-press-event', this._onKeyPressEvent.bind(this));
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-10-04 10:42:11 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
animateFromOverview(fadeOnPrimary) {
|
2014-07-14 13:06:08 -04:00
|
|
|
for (let i = 0; i < this._workspacesViews.length; i++) {
|
|
|
|
let animationType;
|
|
|
|
if (fadeOnPrimary && i == this._primaryIndex)
|
|
|
|
animationType = AnimationType.FADE;
|
|
|
|
else
|
|
|
|
animationType = AnimationType.ZOOM;
|
|
|
|
this._workspacesViews[i].animateFromOverview(animationType);
|
|
|
|
}
|
2020-07-07 07:06:29 -04:00
|
|
|
|
2020-07-11 12:19:27 -04:00
|
|
|
this._inWindowFade = fadeOnPrimary;
|
|
|
|
|
2021-01-13 17:24:49 -05:00
|
|
|
this._leavingOverview = true;
|
|
|
|
this._updateSwipeTracker();
|
|
|
|
|
2020-07-07 07:06:29 -04:00
|
|
|
const { primaryIndex } = Main.layoutManager;
|
|
|
|
const { x, y, width, height } =
|
|
|
|
Main.layoutManager.getWorkAreaForMonitor(primaryIndex);
|
|
|
|
this._getPrimaryView().ease({
|
|
|
|
x, y, width, height,
|
2020-07-07 06:57:51 -04:00
|
|
|
duration: fadeOnPrimary ? 0 : ANIMATION_TIME,
|
2020-07-07 07:06:29 -04:00
|
|
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
|
|
|
});
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-11-25 18:02:13 -05:00
|
|
|
|
2020-06-02 13:15:45 -04:00
|
|
|
vfunc_hide() {
|
2019-01-28 20:27:05 -05:00
|
|
|
if (this._restackedNotifyId > 0) {
|
2012-12-13 11:00:30 -05:00
|
|
|
Main.overview.disconnect(this._restackedNotifyId);
|
2011-01-30 20:44:05 -05:00
|
|
|
this._restackedNotifyId = 0;
|
|
|
|
}
|
2012-10-22 11:39:46 -04:00
|
|
|
if (this._scrollEventId > 0) {
|
|
|
|
Main.overview.disconnect(this._scrollEventId);
|
|
|
|
this._scrollEventId = 0;
|
|
|
|
}
|
2015-03-26 11:17:35 -04:00
|
|
|
if (this._keyPressEventId > 0) {
|
|
|
|
global.stage.disconnect(this._keyPressEventId);
|
|
|
|
this._keyPressEventId = 0;
|
|
|
|
}
|
2011-11-25 12:25:31 -05:00
|
|
|
for (let i = 0; i < this._workspacesViews.length; i++)
|
|
|
|
this._workspacesViews[i].destroy();
|
2012-12-16 18:46:34 -05:00
|
|
|
this._workspacesViews = [];
|
2020-06-02 13:15:45 -04:00
|
|
|
|
2021-01-13 17:24:49 -05:00
|
|
|
this._leavingOverview = false;
|
|
|
|
|
2020-06-02 13:15:45 -04:00
|
|
|
super.vfunc_hide();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-11-25 12:25:31 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_workspacesOnlyOnPrimaryChanged() {
|
2011-11-25 12:25:31 -05:00
|
|
|
this._workspacesOnlyOnPrimary = this._settings.get_boolean('workspaces-only-on-primary');
|
|
|
|
|
|
|
|
if (!Main.overview.visible)
|
|
|
|
return;
|
|
|
|
|
|
|
|
this._updateWorkspacesViews();
|
2020-07-07 07:23:50 -04:00
|
|
|
this._syncWorkspacesActualGeometry();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-11-25 12:25:31 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_updateWorkspacesViews() {
|
2012-12-16 18:46:34 -05:00
|
|
|
for (let i = 0; i < this._workspacesViews.length; i++)
|
|
|
|
this._workspacesViews[i].destroy();
|
2011-11-25 12:25:31 -05:00
|
|
|
|
2015-02-04 09:35:34 -05:00
|
|
|
this._primaryIndex = Main.layoutManager.primaryIndex;
|
2011-11-25 12:25:31 -05:00
|
|
|
this._workspacesViews = [];
|
|
|
|
let monitors = Main.layoutManager.monitors;
|
|
|
|
for (let i = 0; i < monitors.length; i++) {
|
2013-09-11 12:12:42 -04:00
|
|
|
let view;
|
2011-11-25 12:25:31 -05:00
|
|
|
if (this._workspacesOnlyOnPrimary && i != this._primaryIndex)
|
2013-09-11 12:12:42 -04:00
|
|
|
view = new ExtraWorkspaceView(i);
|
|
|
|
else
|
2019-07-07 13:51:55 -04:00
|
|
|
view = new WorkspacesView(i, this._scrollAdjustment);
|
2011-11-25 12:25:31 -05:00
|
|
|
|
2011-11-28 11:51:53 -05:00
|
|
|
this._workspacesViews.push(view);
|
2019-07-16 05:24:13 -04:00
|
|
|
Main.layoutManager.overviewGroup.add_actor(view);
|
2010-10-04 10:42:11 -04:00
|
|
|
}
|
2020-06-05 01:23:53 -04:00
|
|
|
|
|
|
|
this._workspacesViews[this._primaryIndex].visible = this._primaryVisible;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-11-25 12:25:31 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_getMonitorIndexForEvent(event) {
|
2016-06-24 12:15:48 -04:00
|
|
|
let [x, y] = event.get_coords();
|
2019-08-19 15:06:04 -04:00
|
|
|
let rect = new Meta.Rectangle({ x, y, width: 1, height: 1 });
|
2018-01-03 02:55:38 -05:00
|
|
|
return global.display.get_monitor_index_for_rect(rect);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2016-06-24 12:15:48 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_getPrimaryView() {
|
2012-12-16 18:46:34 -05:00
|
|
|
if (!this._workspacesViews.length)
|
2011-11-25 12:25:31 -05:00
|
|
|
return null;
|
2013-09-11 12:12:42 -04:00
|
|
|
return this._workspacesViews[this._primaryIndex];
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2010-02-14 18:32:57 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
activeWorkspaceHasMaximizedWindows() {
|
2011-11-25 12:25:31 -05:00
|
|
|
return this._getPrimaryView().getActiveWorkspace().hasMaximizedWindows();
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-11-25 18:02:13 -05:00
|
|
|
|
2019-09-10 01:42:48 -04:00
|
|
|
vfunc_parent_set(oldParent) {
|
2011-11-25 18:02:13 -05:00
|
|
|
if (oldParent && this._notifyOpacityId)
|
|
|
|
oldParent.disconnect(this._notifyOpacityId);
|
|
|
|
this._notifyOpacityId = 0;
|
|
|
|
|
2019-08-12 10:25:48 -04:00
|
|
|
if (this._parentSetLater)
|
|
|
|
return;
|
|
|
|
|
|
|
|
this._parentSetLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
|
|
|
this._parentSetLater = 0;
|
2019-07-16 05:24:13 -04:00
|
|
|
let newParent = this.get_parent();
|
2017-10-30 20:38:18 -04:00
|
|
|
if (!newParent)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// This is kinda hackish - we want the primary view to
|
2019-07-16 05:24:13 -04:00
|
|
|
// appear as parent of this, though in reality it
|
2017-10-30 20:38:18 -04:00
|
|
|
// is added directly to Main.layoutManager.overviewGroup
|
|
|
|
this._notifyOpacityId = newParent.connect('notify::opacity', () => {
|
2019-07-16 05:24:13 -04:00
|
|
|
let opacity = this.get_parent().opacity;
|
2017-10-30 20:38:18 -04:00
|
|
|
let primaryView = this._getPrimaryView();
|
|
|
|
if (!primaryView)
|
2011-11-25 18:02:13 -05:00
|
|
|
return;
|
2019-07-16 05:24:13 -04:00
|
|
|
primaryView.opacity = opacity;
|
|
|
|
primaryView.visible = opacity != 0;
|
2017-10-30 20:38:18 -04:00
|
|
|
});
|
|
|
|
});
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-11-25 18:02:13 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_updateWorkspacesActualGeometry() {
|
2020-05-20 06:05:04 -04:00
|
|
|
const [x, y] = this.get_transformed_position();
|
|
|
|
const width = this.allocation.get_width();
|
|
|
|
const height = this.allocation.get_height();
|
|
|
|
|
|
|
|
this._actualGeometry = { x, y, width, height };
|
2020-06-03 12:17:54 -04:00
|
|
|
|
|
|
|
if (this._syncActualGeometryLater > 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
this._syncActualGeometryLater =
|
|
|
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
|
|
|
this._syncWorkspacesActualGeometry();
|
|
|
|
|
|
|
|
this._syncActualGeometryLater = 0;
|
|
|
|
return GLib.SOURCE_REMOVE;
|
|
|
|
});
|
2020-05-20 06:05:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
_syncWorkspacesActualGeometry() {
|
2020-06-25 19:15:33 -04:00
|
|
|
const primaryView = this._getPrimaryView();
|
2020-07-11 12:19:27 -04:00
|
|
|
if (!primaryView || this._inWindowFade)
|
2013-02-25 18:34:17 -05:00
|
|
|
return;
|
|
|
|
|
2020-06-25 13:54:54 -04:00
|
|
|
primaryView.ease({
|
|
|
|
...this._actualGeometry,
|
|
|
|
duration: Main.overview.animationInProgress ? ANIMATION_TIME : 0,
|
|
|
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
|
|
|
});
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2013-02-25 18:34:17 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onRestacked(overview, stackIndices) {
|
2011-11-25 12:25:31 -05:00
|
|
|
for (let i = 0; i < this._workspacesViews.length; i++)
|
|
|
|
this._workspacesViews[i].syncStacking(stackIndices);
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2011-01-30 20:44:05 -05:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onScrollEvent(actor, event) {
|
2019-07-08 04:47:04 -04:00
|
|
|
if (this._swipeTracker.canHandleScrollEvent(event))
|
|
|
|
return Clutter.EVENT_PROPAGATE;
|
|
|
|
|
2019-07-16 05:24:13 -04:00
|
|
|
if (!this.mapped)
|
2013-11-29 13:17:34 -05:00
|
|
|
return Clutter.EVENT_PROPAGATE;
|
2016-05-26 12:51:30 -04:00
|
|
|
|
|
|
|
if (this._workspacesOnlyOnPrimary &&
|
|
|
|
this._getMonitorIndexForEvent(event) != this._primaryIndex)
|
|
|
|
return Clutter.EVENT_PROPAGATE;
|
|
|
|
|
2019-10-16 01:39:48 -04:00
|
|
|
if (!this._canScroll)
|
|
|
|
return Clutter.EVENT_PROPAGATE;
|
|
|
|
|
2021-01-06 14:38:44 -05:00
|
|
|
if (event.is_pointer_emulated())
|
|
|
|
return Clutter.EVENT_PROPAGATE;
|
|
|
|
|
2021-01-08 16:12:52 -05:00
|
|
|
let direction = event.get_scroll_direction();
|
|
|
|
if (direction === Clutter.ScrollDirection.SMOOTH) {
|
|
|
|
const [dx, dy] = event.get_scroll_delta();
|
|
|
|
if (Math.abs(dx) > Math.abs(dy)) {
|
|
|
|
direction = dx < 0
|
|
|
|
? Clutter.ScrollDirection.RIGHT
|
|
|
|
: Clutter.ScrollDirection.LEFT;
|
|
|
|
} else if (Math.abs(dy) > Math.abs(dx)) {
|
|
|
|
direction = dy < 0
|
|
|
|
? Clutter.ScrollDirection.UP
|
|
|
|
: Clutter.ScrollDirection.DOWN;
|
|
|
|
} else {
|
|
|
|
return Clutter.EVENT_PROPAGATE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-03 02:55:38 -05:00
|
|
|
let workspaceManager = global.workspace_manager;
|
2021-01-02 15:56:57 -05:00
|
|
|
const vertical = workspaceManager.layout_rows === -1;
|
2021-01-16 10:29:05 -05:00
|
|
|
const rtl = this.text_direction === Clutter.TextDirection.RTL;
|
2018-01-03 02:55:38 -05:00
|
|
|
let activeWs = workspaceManager.get_active_workspace();
|
2013-05-18 14:53:49 -04:00
|
|
|
let ws;
|
2021-01-08 16:12:52 -05:00
|
|
|
switch (direction) {
|
2012-10-22 11:39:46 -04:00
|
|
|
case Clutter.ScrollDirection.UP:
|
2021-01-02 15:56:57 -05:00
|
|
|
if (vertical)
|
|
|
|
ws = activeWs.get_neighbor(Meta.MotionDirection.UP);
|
2021-01-16 10:29:05 -05:00
|
|
|
else if (rtl)
|
|
|
|
ws = activeWs.get_neighbor(Meta.MotionDirection.RIGHT);
|
2021-01-02 15:56:57 -05:00
|
|
|
else
|
|
|
|
ws = activeWs.get_neighbor(Meta.MotionDirection.LEFT);
|
2013-05-18 14:53:49 -04:00
|
|
|
break;
|
2012-10-22 11:39:46 -04:00
|
|
|
case Clutter.ScrollDirection.DOWN:
|
2021-01-02 15:56:57 -05:00
|
|
|
if (vertical)
|
|
|
|
ws = activeWs.get_neighbor(Meta.MotionDirection.DOWN);
|
2021-01-16 10:29:05 -05:00
|
|
|
else if (rtl)
|
|
|
|
ws = activeWs.get_neighbor(Meta.MotionDirection.LEFT);
|
2021-01-02 15:56:57 -05:00
|
|
|
else
|
|
|
|
ws = activeWs.get_neighbor(Meta.MotionDirection.RIGHT);
|
2013-05-18 14:53:49 -04:00
|
|
|
break;
|
2019-06-04 15:49:23 -04:00
|
|
|
case Clutter.ScrollDirection.LEFT:
|
|
|
|
ws = activeWs.get_neighbor(Meta.MotionDirection.LEFT);
|
|
|
|
break;
|
|
|
|
case Clutter.ScrollDirection.RIGHT:
|
|
|
|
ws = activeWs.get_neighbor(Meta.MotionDirection.RIGHT);
|
|
|
|
break;
|
2013-05-18 14:53:49 -04:00
|
|
|
default:
|
2013-11-29 13:17:34 -05:00
|
|
|
return Clutter.EVENT_PROPAGATE;
|
2012-10-22 11:39:46 -04:00
|
|
|
}
|
2013-05-18 14:53:49 -04:00
|
|
|
Main.wm.actionMoveWorkspace(ws);
|
2019-10-16 01:39:48 -04:00
|
|
|
|
|
|
|
this._canScroll = false;
|
|
|
|
this._scrollTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
|
2020-05-09 10:27:00 -04:00
|
|
|
SCROLL_TIMEOUT_TIME, () => {
|
2019-10-16 01:39:48 -04:00
|
|
|
this._canScroll = true;
|
|
|
|
this._scrollTimeoutId = 0;
|
|
|
|
return GLib.SOURCE_REMOVE;
|
2020-04-03 19:52:29 -04:00
|
|
|
});
|
2019-10-16 01:39:48 -04:00
|
|
|
|
2013-11-29 13:17:34 -05:00
|
|
|
return Clutter.EVENT_STOP;
|
2017-10-30 21:19:44 -04:00
|
|
|
}
|
2015-03-26 11:17:35 -04:00
|
|
|
|
2017-10-30 20:03:21 -04:00
|
|
|
_onKeyPressEvent(actor, event) {
|
2019-07-16 05:24:13 -04:00
|
|
|
if (!this.mapped)
|
2015-03-26 11:17:35 -04:00
|
|
|
return Clutter.EVENT_PROPAGATE;
|
2018-01-03 02:55:38 -05:00
|
|
|
let workspaceManager = global.workspace_manager;
|
|
|
|
let activeWs = workspaceManager.get_active_workspace();
|
2015-03-26 11:17:35 -04:00
|
|
|
let ws;
|
|
|
|
switch (event.get_key_symbol()) {
|
|
|
|
case Clutter.KEY_Page_Up:
|
|
|
|
ws = activeWs.get_neighbor(Meta.MotionDirection.UP);
|
|
|
|
break;
|
|
|
|
case Clutter.KEY_Page_Down:
|
|
|
|
ws = activeWs.get_neighbor(Meta.MotionDirection.DOWN);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return Clutter.EVENT_PROPAGATE;
|
|
|
|
}
|
|
|
|
Main.wm.actionMoveWorkspace(ws);
|
|
|
|
return Clutter.EVENT_STOP;
|
2010-02-14 18:32:57 -05:00
|
|
|
}
|
2019-07-16 05:24:13 -04:00
|
|
|
});
|