diff --git a/data/theme/gnome-shell-high-contrast.css b/data/theme/gnome-shell-high-contrast.css index 6b4ea1218..766202927 100644 --- a/data/theme/gnome-shell-high-contrast.css +++ b/data/theme/gnome-shell-high-contrast.css @@ -1210,6 +1210,12 @@ StScrollBar { .icon-grid .overview-icon { icon-size: 96px; } +.system-action-icon { + background-color: black; + color: white; + border-radius: 99px; + icon-size: 48px; } + .app-view-controls { padding-bottom: 32px; } diff --git a/data/theme/gnome-shell-sass b/data/theme/gnome-shell-sass index 53cf147f9..81c5a273c 160000 --- a/data/theme/gnome-shell-sass +++ b/data/theme/gnome-shell-sass @@ -1 +1 @@ -Subproject commit 53cf147f95305d398b71443de2b5cb893fbcd166 +Subproject commit 81c5a273cf2fa5ef8c05940665a077635ae019a4 diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css index 34d3c886b..f94c67cbc 100644 --- a/data/theme/gnome-shell.css +++ b/data/theme/gnome-shell.css @@ -1210,6 +1210,12 @@ StScrollBar { .icon-grid .overview-icon { icon-size: 96px; } +.system-action-icon { + background-color: black; + color: white; + border-radius: 99px; + icon-size: 48px; } + .app-view-controls { padding-bottom: 32px; } diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 428b3c062..9b92311ac 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -24,8 +24,11 @@ const OverviewControls = imports.ui.overviewControls; const PopupMenu = imports.ui.popupMenu; const Tweener = imports.ui.tweener; const Workspace = imports.ui.workspace; +const Search = imports.ui.search; +const System = imports.ui.status.system; const Params = imports.misc.params; const Util = imports.misc.util; +const SystemActions = imports.misc.systemActions; var MAX_APPLICATION_WORK_MILLIS = 75; var MENU_POPUP_TIMEOUT = 600; @@ -1085,19 +1088,35 @@ var AppSearchProvider = new Lang.Class({ this.id = 'applications'; this.isRemoteProvider = false; this.canLaunchSearch = false; + + this._systemActions = new SystemActions.getDefault(); }, getResultMetas: function(apps, callback) { let metas = []; - for (let i = 0; i < apps.length; i++) { - let app = this._appSys.lookup_app(apps[i]); - metas.push({ 'id': app.get_id(), - 'name': app.get_name(), - 'createIcon': function(size) { - return app.create_icon_texture(size); - } - }); + for (let id of apps) { + if (id.endsWith('.desktop')) { + let app = this._appSys.lookup_app(id); + + metas.push({ 'id': app.get_id(), + 'name': app.get_name(), + 'createIcon': function(size) { + return app.create_icon_texture(size); + } + }); + } else { + let name = this._systemActions.getName(id); + let iconName = this._systemActions.getIconName(id); + + let createIcon = size => new St.Icon({ icon_name: iconName, + width: size, + height: size, + style_class: 'system-action-icon' }); + + metas.push({ id, name, createIcon }); + } } + callback(metas); }, @@ -1119,6 +1138,9 @@ var AppSearchProvider = new Lang.Class({ return usage.compare('', a, b); })); }); + + results = results.concat(this._systemActions.getMatchingActions(terms)); + callback(results); }, @@ -1127,8 +1149,10 @@ var AppSearchProvider = new Lang.Class({ }, createResultObject: function (resultMeta) { - let app = this._appSys.lookup_app(resultMeta['id']); - return new AppIcon(app); + if (resultMeta.id.endsWith('.desktop')) + return new AppIcon(this._appSys.lookup_app(resultMeta['id'])); + else + return new SystemActionIcon(this, resultMeta); } }); @@ -1983,3 +2007,13 @@ var AppIconMenu = new Lang.Class({ } }); Signals.addSignalMethods(AppIconMenu.prototype); + +var SystemActionIcon = new Lang.Class({ + Name: 'SystemActionIcon', + Extends: Search.GridSearchResult, + + activate: function() { + SystemActions.getDefault().activateAction(this.metaInfo['id']); + Main.overview.hide(); + } +});