AppWellMenu: Remove window filtering
Don't filter and highlight windows when opening the menu as this turned out to be distracting and confusing. https://bugzilla.gnome.org/show_bug.cgi?id=642189
This commit is contained in:
parent
ed6af523cb
commit
c2ae95f912
@ -433,18 +433,12 @@ AppWellIcon.prototype = {
|
|||||||
|
|
||||||
if (!this._menu) {
|
if (!this._menu) {
|
||||||
this._menu = new AppIconMenu(this);
|
this._menu = new AppIconMenu(this);
|
||||||
this._menu.connect('highlight-window', Lang.bind(this, function (menu, window) {
|
|
||||||
this.highlightWindow(window);
|
|
||||||
}));
|
|
||||||
this._menu.connect('activate-window', Lang.bind(this, function (menu, window) {
|
this._menu.connect('activate-window', Lang.bind(this, function (menu, window) {
|
||||||
this.activateWindow(window);
|
this.activateWindow(window);
|
||||||
}));
|
}));
|
||||||
this._menu.connect('popup', Lang.bind(this, function (menu, isPoppedUp) {
|
this._menu.connect('popup', Lang.bind(this, function (menu, isPoppedUp) {
|
||||||
if (isPoppedUp) {
|
if (!isPoppedUp)
|
||||||
this._onMenuPoppedUp();
|
|
||||||
} else {
|
|
||||||
this._onMenuPoppedDown();
|
this._onMenuPoppedDown();
|
||||||
}
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._menuManager.addMenu(this._menu);
|
this._menuManager.addMenu(this._menu);
|
||||||
@ -455,45 +449,16 @@ AppWellIcon.prototype = {
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
highlightWindow: function(metaWindow) {
|
|
||||||
if (this._didActivateWindow)
|
|
||||||
return;
|
|
||||||
if (!this._getRunning())
|
|
||||||
return;
|
|
||||||
Main.overview.getWorkspacesForWindow(metaWindow).setHighlightWindow(metaWindow);
|
|
||||||
},
|
|
||||||
|
|
||||||
activateWindow: function(metaWindow) {
|
activateWindow: function(metaWindow) {
|
||||||
if (metaWindow) {
|
if (metaWindow) {
|
||||||
this._didActivateWindow = true;
|
|
||||||
Main.activateWindow(metaWindow);
|
Main.activateWindow(metaWindow);
|
||||||
} else {
|
} else {
|
||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onMenuPoppedUp: function() {
|
|
||||||
if (this._getRunning()) {
|
|
||||||
Main.overview.getWorkspacesForWindow(null).setApplicationWindowSelection(this.app.get_id());
|
|
||||||
this._setWindowSelection = true;
|
|
||||||
this._didActivateWindow = false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onMenuPoppedDown: function() {
|
_onMenuPoppedDown: function() {
|
||||||
this.actor.sync_hover();
|
this.actor.sync_hover();
|
||||||
|
|
||||||
if (this._didActivateWindow)
|
|
||||||
return;
|
|
||||||
if (!this._setWindowSelection)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Main.overview.getWorkspacesForWindow(null).setApplicationWindowSelection(null);
|
|
||||||
this._setWindowSelection = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_getRunning: function() {
|
|
||||||
return this.app.state != Shell.AppState.STOPPED;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onActivate: function (event) {
|
_onActivate: function (event) {
|
||||||
@ -509,11 +474,6 @@ AppWellIcon.prototype = {
|
|||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
// called by this._menuManager when it has the grab
|
|
||||||
menuEventFilter: function(event) {
|
|
||||||
return this._menu.menuEventFilter(event);
|
|
||||||
},
|
|
||||||
|
|
||||||
shellWorkspaceLaunch : function(params) {
|
shellWorkspaceLaunch : function(params) {
|
||||||
params = Params.parse(params, { workspace: null,
|
params = Params.parse(params, { workspace: null,
|
||||||
timestamp: null });
|
timestamp: null });
|
||||||
@ -549,7 +509,6 @@ AppIconMenu.prototype = {
|
|||||||
|
|
||||||
this._source = source;
|
this._source = source;
|
||||||
|
|
||||||
this.connect('active-changed', Lang.bind(this, this._onActiveChanged));
|
|
||||||
this.connect('activate', Lang.bind(this, this._onActivate));
|
this.connect('activate', Lang.bind(this, this._onActivate));
|
||||||
this.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
|
this.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
|
||||||
|
|
||||||
@ -596,7 +555,6 @@ AppIconMenu.prototype = {
|
|||||||
this._toggleFavoriteMenuItem = this._appendMenuItem(isFavorite ? _("Remove from Favorites")
|
this._toggleFavoriteMenuItem = this._appendMenuItem(isFavorite ? _("Remove from Favorites")
|
||||||
: _("Add to Favorites"));
|
: _("Add to Favorites"));
|
||||||
|
|
||||||
this._highlightedItem = null;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_appendSeparator: function () {
|
_appendSeparator: function () {
|
||||||
@ -620,68 +578,10 @@ AppIconMenu.prototype = {
|
|||||||
if (open) {
|
if (open) {
|
||||||
this.emit('popup', true);
|
this.emit('popup', true);
|
||||||
} else {
|
} else {
|
||||||
this._updateHighlight(null);
|
|
||||||
this.emit('popup', false);
|
this.emit('popup', false);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// called by this._menuManager when it has the grab
|
|
||||||
menuEventFilter: function(event) {
|
|
||||||
let eventType = event.type();
|
|
||||||
|
|
||||||
// Check if the user is interacting with a window representation
|
|
||||||
// rather than interacting with the menu
|
|
||||||
|
|
||||||
if (eventType == Clutter.EventType.BUTTON_RELEASE) {
|
|
||||||
let metaWindow = this._findMetaWindowForActor(event.get_source());
|
|
||||||
if (metaWindow)
|
|
||||||
this.emit('activate-window', metaWindow);
|
|
||||||
} else if (eventType == Clutter.EventType.ENTER) {
|
|
||||||
let metaWindow = this._findMetaWindowForActor(event.get_source());
|
|
||||||
if (metaWindow)
|
|
||||||
this._selectMenuItemForWindow(metaWindow, true);
|
|
||||||
} else if (eventType == Clutter.EventType.LEAVE) {
|
|
||||||
let metaWindow = this._findMetaWindowForActor(event.get_source());
|
|
||||||
if (metaWindow)
|
|
||||||
this._selectMenuItemForWindow(metaWindow, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_findMetaWindowForActor: function (actor) {
|
|
||||||
if (actor._delegate.metaWindow)
|
|
||||||
return actor._delegate.metaWindow;
|
|
||||||
else if (actor.get_meta_window)
|
|
||||||
return actor.get_meta_window();
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateHighlight: function (item) {
|
|
||||||
if (this._highlightedItem)
|
|
||||||
this.emit('highlight-window', null);
|
|
||||||
this._highlightedItem = item;
|
|
||||||
if (this._highlightedItem) {
|
|
||||||
let window = this._highlightedItem._window;
|
|
||||||
if (window)
|
|
||||||
this.emit('highlight-window', window);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_selectMenuItemForWindow: function (metaWindow, selected) {
|
|
||||||
let items = this.getMenuItems();
|
|
||||||
for (let i = 0; i < items.length; i++) {
|
|
||||||
let item = items[i];
|
|
||||||
let menuMetaWindow = item._window;
|
|
||||||
if (menuMetaWindow == metaWindow)
|
|
||||||
item.setActive(selected);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onActiveChanged: function (menu, child) {
|
|
||||||
this._updateHighlight(child);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onActivate: function (actor, child) {
|
_onActivate: function (actor, child) {
|
||||||
if (child._window) {
|
if (child._window) {
|
||||||
let metaWindow = child._window;
|
let metaWindow = child._window;
|
||||||
|
@ -564,9 +564,6 @@ Workspace.prototype = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// A filter for what windows we display
|
|
||||||
this._showOnlyWindows = null;
|
|
||||||
|
|
||||||
// Track window changes
|
// Track window changes
|
||||||
this._windowAddedId = this.metaWorkspace.connect('window-added',
|
this._windowAddedId = this.metaWorkspace.connect('window-added',
|
||||||
Lang.bind(this, this._windowAdded));
|
Lang.bind(this, this._windowAdded));
|
||||||
@ -597,18 +594,6 @@ Workspace.prototype = {
|
|||||||
new_parent.add_actor(this._windowOverlaysGroup);
|
new_parent.add_actor(this._windowOverlaysGroup);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* lookupCloneForMetaWindow:
|
|
||||||
* @metaWindow: A #MetaWindow
|
|
||||||
*
|
|
||||||
* Given a #MetaWindow instance, find the WindowClone object
|
|
||||||
* which represents it in the workspaces display.
|
|
||||||
*/
|
|
||||||
lookupCloneForMetaWindow: function (metaWindow) {
|
|
||||||
let index = this._lookupIndex (metaWindow);
|
|
||||||
return index < 0 ? null : this._windows[index];
|
|
||||||
},
|
|
||||||
|
|
||||||
containsMetaWindow: function (metaWindow) {
|
containsMetaWindow: function (metaWindow) {
|
||||||
return this._lookupIndex(metaWindow) >= 0;
|
return this._lookupIndex(metaWindow) >= 0;
|
||||||
},
|
},
|
||||||
@ -617,48 +602,6 @@ Workspace.prototype = {
|
|||||||
return this._windows.length == 0;
|
return this._windows.length == 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
setShowOnlyWindows: function(showOnlyWindows, reposition) {
|
|
||||||
this._showOnlyWindows = showOnlyWindows;
|
|
||||||
this._resetCloneVisibility();
|
|
||||||
if (reposition)
|
|
||||||
this.positionWindows(WindowPositionFlags.ANIMATE);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* setLightboxMode:
|
|
||||||
* @showLightbox: If true, dim background and allow highlighting a specific window
|
|
||||||
*
|
|
||||||
* This function also resets the highlighted window state.
|
|
||||||
*/
|
|
||||||
setLightboxMode: function (showLightbox) {
|
|
||||||
if (!this._lightbox)
|
|
||||||
this._lightbox = new Lightbox.Lightbox(this.actor,
|
|
||||||
{ fadeTime: LIGHTBOX_FADE_TIME });
|
|
||||||
|
|
||||||
if (showLightbox)
|
|
||||||
this._lightbox.show();
|
|
||||||
else
|
|
||||||
this._lightbox.hide();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* setHighlightWindow:
|
|
||||||
* @metaWindow: A #MetaWindow
|
|
||||||
*
|
|
||||||
* Draw the user's attention to the given window @metaWindow.
|
|
||||||
*/
|
|
||||||
setHighlightWindow: function (metaWindow) {
|
|
||||||
if (!this._lightbox)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let actor;
|
|
||||||
if (metaWindow != null) {
|
|
||||||
let clone = this.lookupCloneForMetaWindow(metaWindow);
|
|
||||||
actor = clone.actor;
|
|
||||||
}
|
|
||||||
this._lightbox.highlight(actor);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* setReactive:
|
* setReactive:
|
||||||
* @reactive: %true iff the workspace should be reactive
|
* @reactive: %true iff the workspace should be reactive
|
||||||
@ -669,47 +612,6 @@ Workspace.prototype = {
|
|||||||
this.actor.reactive = reactive;
|
this.actor.reactive = reactive;
|
||||||
},
|
},
|
||||||
|
|
||||||
_isCloneVisible: function(clone) {
|
|
||||||
return this._showOnlyWindows == null || (clone.metaWindow in this._showOnlyWindows);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* _getVisibleClones:
|
|
||||||
*
|
|
||||||
* Returns a list WindowClone objects where the clone isn't filtered
|
|
||||||
* out by any application filter.
|
|
||||||
* The returned array will always be newly allocated; it is not in any
|
|
||||||
* defined order, and thus it's convenient to call .sort() with your
|
|
||||||
* choice of sorting function.
|
|
||||||
*/
|
|
||||||
_getVisibleClones: function() {
|
|
||||||
let visible = [];
|
|
||||||
|
|
||||||
for (let i = 0; i < this._windows.length; i++) {
|
|
||||||
let clone = this._windows[i];
|
|
||||||
|
|
||||||
if (!this._isCloneVisible(clone))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
visible.push(clone);
|
|
||||||
}
|
|
||||||
return visible;
|
|
||||||
},
|
|
||||||
|
|
||||||
_resetCloneVisibility: function () {
|
|
||||||
for (let i = 0; i < this._windows.length; i++) {
|
|
||||||
let clone = this._windows[i];
|
|
||||||
let overlay = this._windowOverlays[i];
|
|
||||||
|
|
||||||
if (!this._isCloneVisible(clone)) {
|
|
||||||
clone.actor.hide();
|
|
||||||
overlay.hide();
|
|
||||||
} else {
|
|
||||||
clone.actor.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Only use this for n <= 20 say
|
// Only use this for n <= 20 say
|
||||||
_factorial: function(n) {
|
_factorial: function(n) {
|
||||||
let result = 1;
|
let result = 1;
|
||||||
@ -948,25 +850,23 @@ Workspace.prototype = {
|
|||||||
this._repositionWindowsId = 0;
|
this._repositionWindowsId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
let totalVisible = 0;
|
let clones = this._windows.slice();
|
||||||
|
|
||||||
let visibleClones = this._getVisibleClones();
|
|
||||||
if (this._reservedSlot)
|
if (this._reservedSlot)
|
||||||
visibleClones.push(this._reservedSlot);
|
clones.push(this._reservedSlot);
|
||||||
|
|
||||||
let workspaceZooming = flags & WindowPositionFlags.ZOOM;
|
let workspaceZooming = flags & WindowPositionFlags.ZOOM;
|
||||||
let animate = flags & WindowPositionFlags.ANIMATE;
|
let animate = flags & WindowPositionFlags.ANIMATE;
|
||||||
|
|
||||||
// Start the animations
|
// Start the animations
|
||||||
let slots = this._computeAllWindowSlots(visibleClones.length);
|
let slots = this._computeAllWindowSlots(clones.length);
|
||||||
visibleClones = this._orderWindowsByMotionAndStartup(visibleClones, slots);
|
clones = this._orderWindowsByMotionAndStartup(clones, slots);
|
||||||
|
|
||||||
let currentWorkspace = global.screen.get_active_workspace();
|
let currentWorkspace = global.screen.get_active_workspace();
|
||||||
let isOnCurrentWorkspace = this.metaWorkspace == currentWorkspace;
|
let isOnCurrentWorkspace = this.metaWorkspace == currentWorkspace;
|
||||||
|
|
||||||
for (let i = 0; i < visibleClones.length; i++) {
|
for (let i = 0; i < clones.length; i++) {
|
||||||
let slot = slots[i];
|
let slot = slots[i];
|
||||||
let clone = visibleClones[i];
|
let clone = clones[i];
|
||||||
let metaWindow = clone.metaWindow;
|
let metaWindow = clone.metaWindow;
|
||||||
let mainIndex = this._lookupIndex(metaWindow);
|
let mainIndex = this._lookupIndex(metaWindow);
|
||||||
let overlay = this._windowOverlays[mainIndex];
|
let overlay = this._windowOverlays[mainIndex];
|
||||||
@ -1022,16 +922,16 @@ Workspace.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
syncStacking: function(stackIndices) {
|
syncStacking: function(stackIndices) {
|
||||||
let visibleClones = this._getVisibleClones();
|
let clones = this._windows.slice();
|
||||||
visibleClones.sort(function (a, b) { return stackIndices[a.metaWindow.get_stable_sequence()] - stackIndices[b.metaWindow.get_stable_sequence()]; });
|
clones.sort(function (a, b) { return stackIndices[a.metaWindow.get_stable_sequence()] - stackIndices[b.metaWindow.get_stable_sequence()]; });
|
||||||
|
|
||||||
for (let i = 0; i < visibleClones.length; i++) {
|
for (let i = 0; i < clones.length; i++) {
|
||||||
let clone = visibleClones[i];
|
let clone = clones[i];
|
||||||
let metaWindow = clone.metaWindow;
|
let metaWindow = clone.metaWindow;
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
clone.setStackAbove(null);
|
clone.setStackAbove(null);
|
||||||
} else {
|
} else {
|
||||||
let previousClone = visibleClones[i - 1];
|
let previousClone = clones[i - 1];
|
||||||
clone.setStackAbove(previousClone.actor);
|
clone.setStackAbove(previousClone.actor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1068,8 +968,6 @@ Workspace.prototype = {
|
|||||||
for (let i = 0; i < this._windows.length; i++) {
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
let clone = this._windows[i];
|
let clone = this._windows[i];
|
||||||
let overlay = this._windowOverlays[i];
|
let overlay = this._windowOverlays[i];
|
||||||
if (this._showOnlyWindows != null && !(clone.metaWindow in this._showOnlyWindows))
|
|
||||||
continue;
|
|
||||||
this._showWindowOverlay(clone, overlay, this.metaWorkspace == currentWorkspace);
|
this._showWindowOverlay(clone, overlay, this.metaWorkspace == currentWorkspace);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -94,9 +94,6 @@ WorkspacesView.prototype = {
|
|||||||
|
|
||||||
this._timeoutId = 0;
|
this._timeoutId = 0;
|
||||||
|
|
||||||
this._windowSelectionAppId = null;
|
|
||||||
this._highlightWindow = null;
|
|
||||||
|
|
||||||
this._switchWorkspaceNotifyId =
|
this._switchWorkspaceNotifyId =
|
||||||
global.window_manager.connect('switch-workspace',
|
global.window_manager.connect('switch-workspace',
|
||||||
Lang.bind(this, this._activeWorkspaceChanged));
|
Lang.bind(this, this._activeWorkspaceChanged));
|
||||||
@ -121,76 +118,15 @@ WorkspacesView.prototype = {
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
setHighlightWindow: function (metaWindow) {
|
|
||||||
// Looping over all workspaces is easier than keeping track of the last
|
|
||||||
// highlighted window while trying to handle the window or workspace possibly
|
|
||||||
// going away.
|
|
||||||
for (let i = 0; i < this._workspaces.length; i++) {
|
|
||||||
this._workspaces[i].setHighlightWindow(null);
|
|
||||||
}
|
|
||||||
if (metaWindow != null) {
|
|
||||||
let workspace = this._lookupWorkspaceForMetaWindow(metaWindow);
|
|
||||||
workspace.setHighlightWindow(metaWindow);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
getActiveWorkspace: function() {
|
getActiveWorkspace: function() {
|
||||||
let active = global.screen.get_active_workspace_index();
|
let active = global.screen.get_active_workspace_index();
|
||||||
return this._workspaces[active];
|
return this._workspaces[active];
|
||||||
},
|
},
|
||||||
|
|
||||||
_clearApplicationWindowSelection: function(reposition) {
|
|
||||||
if (this._windowSelectionAppId == null)
|
|
||||||
return;
|
|
||||||
this._windowSelectionAppId = null;
|
|
||||||
|
|
||||||
for (let i = 0; i < this._workspaces.length; i++) {
|
|
||||||
this._workspaces[i].setLightboxMode(false);
|
|
||||||
this._workspaces[i].setShowOnlyWindows(null, reposition);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* setApplicationWindowSelection:
|
|
||||||
* @appid: Application identifier string
|
|
||||||
*
|
|
||||||
* Enter a mode which shows only the windows owned by the
|
|
||||||
* given application, and allow highlighting of a specific
|
|
||||||
* window with setHighlightWindow().
|
|
||||||
*/
|
|
||||||
setApplicationWindowSelection: function (appId) {
|
|
||||||
if (appId == null) {
|
|
||||||
this._clearApplicationWindowSelection(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (appId == this._windowSelectionAppId)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._windowSelectionAppId = appId;
|
|
||||||
|
|
||||||
let appSys = Shell.AppSystem.get_default();
|
|
||||||
|
|
||||||
let showOnlyWindows = {};
|
|
||||||
let app = appSys.get_app(appId);
|
|
||||||
let windows = app.get_windows();
|
|
||||||
for (let i = 0; i < windows.length; i++) {
|
|
||||||
showOnlyWindows[windows[i]] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < this._workspaces.length; i++) {
|
|
||||||
this._workspaces[i].setLightboxMode(true);
|
|
||||||
this._workspaces[i].setShowOnlyWindows(showOnlyWindows, true);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||||
let activeWorkspace = this._workspaces[activeWorkspaceIndex];
|
let activeWorkspace = this._workspaces[activeWorkspaceIndex];
|
||||||
|
|
||||||
if (this._windowSelectionAppId != null)
|
|
||||||
this._clearApplicationWindowSelection(false);
|
|
||||||
|
|
||||||
activeWorkspace.actor.raise_top();
|
activeWorkspace.actor.raise_top();
|
||||||
|
|
||||||
for (let w = 0; w < this._workspaces.length; w++)
|
for (let w = 0; w < this._workspaces.length; w++)
|
||||||
|
Loading…
Reference in New Issue
Block a user