WindowList: allow switching windows with mouse scroll

This is something that gnome-panel supported, and apparently
some users would like to have it back, so restore this feature
on our window list too.

https://bugzilla.gnome.org/show_bug.cgi?id=723693
This commit is contained in:
Giovanni Campagna
2014-02-05 17:25:43 +01:00
parent a4846847de
commit a42dcee6ec

View File

@@ -219,6 +219,17 @@ const WindowButton = new Lang.Class({
this._updateStyle();
},
get active() {
return this.actor.has_style_class_name('focused');
},
activate: function() {
if (this.active)
return;
this._onClicked(this.actor, 1);
},
_onClicked: function(actor, button) {
if (this._contextMenu.isOpen) {
this._contextMenu.close();
@@ -485,6 +496,17 @@ const AppButton = new Lang.Class({
},
get active() {
return this.actor.has_style_class_name('focused');
},
activate: function() {
if (this.active)
return;
this._onClicked(this.actor, 1);
},
_onClicked: function(actor, button) {
let menuWasOpen = this._menu.isOpen;
if (menuWasOpen)
@@ -724,6 +746,7 @@ const WindowList = new Lang.Class({
let layout = new Clutter.BoxLayout({ homogeneous: true });
this._windowList = new St.Widget({ style_class: 'window-list',
reactive: true,
layout_manager: layout,
x_align: Clutter.ActorAlign.START,
x_expand: true,
@@ -750,6 +773,7 @@ const WindowList = new Lang.Class({
Lang.bind(this, this._populateWindowList));
}
}));
this._windowList.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
let indicatorsBox = new St.BoxLayout({ x_align: Clutter.ActorAlign.END });
box.add(indicatorsBox);
@@ -833,6 +857,31 @@ const WindowList = new Lang.Class({
this._groupingModeChanged();
},
_onScrollEvent: function(actor, event) {
let direction = event.get_scroll_direction();
let diff = 0;
if (direction == Clutter.ScrollDirection.DOWN)
diff = 1;
else if (direction == Clutter.ScrollDirection.UP)
diff = -1;
else
return;
let children = this._windowList.get_children().map(function(actor) {
return actor._delegate;
});
let active = 0;
for (let i = 0; i < children.length; i++) {
if (children[i].active) {
active = i;
break;
}
}
active = Math.max(0, Math.min(active + diff, children.length-1));
children[active].activate();
},
_groupingModeChanged: function() {
this._groupingMode = this._settings.get_enum('grouping-mode');
this._grouped = this._groupingMode == GroupingMode.ALWAYS;