b8a9eec14f
Make the width of the workspace switcher dynamic in order to make it have the same proportions as the actual screen. Call redraw after adding indicator to stage to avoid warning. https://bugzilla.gnome.org/show_bug.cgi?id=610049 Signed-off-by: Adel Gadllah <adel.gadllah@gmail.com>
105 lines
3.6 KiB
JavaScript
105 lines
3.6 KiB
JavaScript
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
|
|
const Clutter = imports.gi.Clutter;
|
|
const Lang = imports.lang;
|
|
const Mainloop = imports.mainloop;
|
|
const Shell = imports.gi.Shell;
|
|
const St = imports.gi.St;
|
|
|
|
const Tweener = imports.ui.tweener;
|
|
|
|
const ANIMATION_TIME = 0.075;
|
|
const DISPLAY_TIMEOUT = 600;
|
|
|
|
const LEFT = -1;
|
|
const RIGHT = 1;
|
|
|
|
function WorkspaceSwitcherPopup() {
|
|
this._init();
|
|
}
|
|
|
|
WorkspaceSwitcherPopup.prototype = {
|
|
_init : function() {
|
|
this.actor = new Clutter.Group({ reactive: true,
|
|
x: 0,
|
|
y: 0,
|
|
width: global.screen_width,
|
|
height: global.screen_height });
|
|
global.stage.add_actor(this.actor);
|
|
|
|
this._scaleWidth = global.screen_width / global.screen_height;
|
|
|
|
this._container = new St.BoxLayout({ style_class: "workspace-switcher-container" });
|
|
this._list = new St.BoxLayout({ style_class: "workspace-switcher" });
|
|
|
|
this._container.add(this._list);
|
|
|
|
this.actor.add_actor(this._container);
|
|
|
|
this._redraw();
|
|
|
|
this._position();
|
|
|
|
this.actor.show();
|
|
this._timeoutId = Mainloop.timeout_add(DISPLAY_TIMEOUT, Lang.bind(this, this._onTimeout));
|
|
},
|
|
|
|
_redraw : function(direction, activeWorkspaceIndex) {
|
|
this._list.destroy_children();
|
|
|
|
for (let i = 0; i < global.screen.n_workspaces; i++) {
|
|
let indicator = null;
|
|
|
|
if (i == activeWorkspaceIndex && direction == LEFT)
|
|
indicator = new St.Bin({ style_class: 'ws-switcher-active-left' });
|
|
else if(i == activeWorkspaceIndex && direction == RIGHT)
|
|
indicator = new St.Bin({ style_class: 'ws-switcher-active-right' });
|
|
else
|
|
indicator = new St.Bin({ style_class: 'ws-switcher-box' });
|
|
|
|
this._list.add(indicator);
|
|
indicator.set_width(Math.round(indicator.get_height() * this._scaleWidth));
|
|
|
|
if (i < global.screen.n_workspaces - 1) {
|
|
let spacer = new St.Bin({ style_class: 'ws-switcher-spacer' });
|
|
this._list.add(spacer);
|
|
}
|
|
|
|
}
|
|
},
|
|
|
|
_position: function() {
|
|
let focus = global.get_focus_monitor();
|
|
this._container.x = focus.x + Math.floor((focus.width - this._container.width) / 2);
|
|
this._container.y = focus.y + Math.floor((focus.height - this._container.height) / 2);
|
|
},
|
|
|
|
_show : function() {
|
|
Tweener.addTween(this._container, { opacity: 255,
|
|
time: ANIMATION_TIME,
|
|
transition: "easeOutQuad"
|
|
});
|
|
this._position();
|
|
this.actor.show();
|
|
},
|
|
|
|
display : function(direction, activeWorkspaceIndex) {
|
|
this._redraw(direction, activeWorkspaceIndex);
|
|
if (this._timeoutId != 0)
|
|
Mainloop.source_remove(this._timeoutId);
|
|
this._timeoutId = Mainloop.timeout_add(DISPLAY_TIMEOUT, Lang.bind(this, this._onTimeout));
|
|
this._show();
|
|
},
|
|
|
|
_onTimeout : function() {
|
|
Mainloop.source_remove(this._timeoutId);
|
|
this._timeoutId = 0;
|
|
Tweener.addTween(this._container, { opacity: 0.0,
|
|
time: ANIMATION_TIME,
|
|
transition: "easeOutQuad",
|
|
onComplete: function() { this.actor.hide() },
|
|
onCompleteScope: this
|
|
});
|
|
}
|
|
};
|