altTab: Add also a shortcut to close windows from the switcher popups

Similar to what has been done for the apps switcher, this allows closing
windows pressing W or F4 while operating the windows switcher popup or
the apps switcher popup while navigating the list of windows for an app.

https://bugzilla.gnome.org/show_bug.cgi?id=620106
This commit is contained in:
Mario Sanchez Prada 2017-12-05 10:02:23 +00:00 committed by Florian Müllner
parent 06f790d86c
commit d63c0e277c

View File

@ -156,6 +156,18 @@ var AppSwitcherPopup = new Lang.Class({
this._items[this._selectedIndex].cachedWindows.length); this._items[this._selectedIndex].cachedWindows.length);
}, },
_closeAppWindow: function(appIndex, windowIndex) {
let appIcon = this._items[appIndex];
if (!appIcon)
return;
let window = appIcon.cachedWindows[windowIndex];
if (!window)
return;
window.delete(global.get_current_time());
},
_quitApplication: function(appIndex) { _quitApplication: function(appIndex) {
let appIcon = this._items[appIndex]; let appIcon = this._items[appIndex];
if (!appIcon) if (!appIcon)
@ -185,6 +197,8 @@ var AppSwitcherPopup = new Lang.Class({
this._select(this._selectedIndex, this._nextWindow()); this._select(this._selectedIndex, this._nextWindow());
else if (keysym == Clutter.Up) else if (keysym == Clutter.Up)
this._select(this._selectedIndex, null, true); this._select(this._selectedIndex, null, true);
else if (keysym == Clutter.w || keysym == Clutter.F4)
this._closeAppWindow(this._selectedIndex, this._currentWindow);
else else
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} else { } else {
@ -258,6 +272,17 @@ var AppSwitcherPopup = new Lang.Class({
this._select(this._selectedIndex, n); this._select(this._selectedIndex, n);
}, },
_windowRemoved : function(thumbnailList, n) {
let appIcon = this._items[this._selectedIndex];
if (!appIcon)
return;
if (appIcon.cachedWindows.length > 0) {
let newIndex = Math.min(n, appIcon.cachedWindows.length - 1);
this._select(this._selectedIndex, newIndex);
}
},
_finish : function(timestamp) { _finish : function(timestamp) {
let appIcon = this._items[this._selectedIndex]; let appIcon = this._items[this._selectedIndex];
if (this._currentWindow < 0) if (this._currentWindow < 0)
@ -361,6 +386,7 @@ var AppSwitcherPopup = new Lang.Class({
this._thumbnails = new ThumbnailList (this._items[this._selectedIndex].cachedWindows); this._thumbnails = new ThumbnailList (this._items[this._selectedIndex].cachedWindows);
this._thumbnails.connect('item-activated', Lang.bind(this, this._windowActivated)); this._thumbnails.connect('item-activated', Lang.bind(this, this._windowActivated));
this._thumbnails.connect('item-entered', Lang.bind(this, this._windowEntered)); this._thumbnails.connect('item-entered', Lang.bind(this, this._windowEntered));
this._thumbnails.connect('item-removed', Lang.bind(this, this._windowRemoved));
this._thumbnails.actor.connect('destroy', () => { this._thumbnails.actor.connect('destroy', () => {
this._thumbnails = null; this._thumbnails = null;
this._thumbnailsFocused = false; this._thumbnailsFocused = false;
@ -550,6 +576,14 @@ var WindowSwitcherPopup = new Lang.Class({
return getWindows(workspace); return getWindows(workspace);
}, },
_closeWindow: function(windowIndex) {
let windowIcon = this._items[windowIndex];
if (!windowIcon)
return;
windowIcon.window.delete(global.get_current_time());
},
_keyPressHandler: function(keysym, action) { _keyPressHandler: function(keysym, action) {
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) { if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) {
this._select(this._next()); this._select(this._next());
@ -560,6 +594,8 @@ var WindowSwitcherPopup = new Lang.Class({
this._select(this._previous()); this._select(this._previous());
else if (keysym == Clutter.Right) else if (keysym == Clutter.Right)
this._select(this._next()); this._select(this._next());
else if (keysym == Clutter.w || keysym == Clutter.F4)
this._closeWindow(this._selectedIndex);
else else
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
@ -988,7 +1024,19 @@ var WindowList = new Lang.Class({
this.addItem(icon.actor, icon.label); this.addItem(icon.actor, icon.label);
this.icons.push(icon); this.icons.push(icon);
icon._unmanagedSignalId = icon.window.connect('unmanaged', (window) => {
this._removeWindow(window)
});
} }
this.actor.connect('destroy', () => { this._onDestroy(); });
},
_onDestroy: function() {
this.icons.forEach(icon => {
icon.window.disconnect(icon._unmanagedSignalId);
});
}, },
_getPreferredHeight: function(actor, forWidth, alloc) { _getPreferredHeight: function(actor, forWidth, alloc) {
@ -1017,5 +1065,16 @@ var WindowList = new Lang.Class({
this.parent(index, justOutline); this.parent(index, justOutline);
this._label.set_text(index == -1 ? '' : this.icons[index].label.text); this._label.set_text(index == -1 ? '' : this.icons[index].label.text);
},
_removeWindow: function(window) {
let index = this.icons.findIndex(icon => {
return icon.window == window;
});
if (index === -1)
return;
this.icons.splice(index, 1);
this.removeItem(index);
} }
}); });