diff --git a/js/misc/util.js b/js/misc/util.js index 1bc1a7283..1112bef21 100644 --- a/js/misc/util.js +++ b/js/misc/util.js @@ -55,20 +55,6 @@ function spawnCommandLine(command_line) { } } -// spawnDesktop: -// @id: a desktop file ID -// -// Spawns the desktop file identified by @id using startup notification, -// etc, handling any errors that occur when trying to find or start -// the program. -function spawnDesktop(id) { - try { - trySpawnDesktop(id); - } catch (err) { - _handleSpawnError(id, err); - } -} - // trySpawn: // @argv: an argv array // @@ -116,33 +102,6 @@ function trySpawnCommandLine(command_line) { trySpawn(argv); } -// trySpawnDesktop: -// @id: a desktop file ID -// -// Spawns the desktop file identified by @id using startup notification. -// On error, throws an exception. -function trySpawnDesktop(id) { - let app; - - // shell_app_system_load_from_desktop_file() will end up returning - // a stupid error message if the desktop file doesn't exist, but - // that's the only case it returns an error for, so we just - // substitute our own error in instead - try { - app = Shell.AppSystem.get_default().load_from_desktop_file(id + '.desktop'); - } catch (err) { - throw new Error(_("No such application")); - } - - try { - app.launch(); - } catch(err) { - // see trySpawn - err.message = err.message.replace(/.*\((.+)\)/, '$1'); - throw err; - } -} - function _handleSpawnError(command, err) { let title = _("Execution of '%s' failed:").format(command); Main.notifyProblem(title, err.message); diff --git a/js/ui/dateMenu.js b/js/ui/dateMenu.js index 6af0b68f5..c0c8cea4e 100644 --- a/js/ui/dateMenu.js +++ b/js/ui/dateMenu.js @@ -200,7 +200,8 @@ DateMenuButton.prototype = { _onPreferencesActivate: function() { this.menu.close(); - Util.spawnDesktop('gnome-datetime-panel'); + let app = Shell.AppSystem.get_default().get_app('gnome-datetime-panel.desktop'); + app.activate(-1); }, _onOpenCalendarActivate: function() { diff --git a/js/ui/status/accessibility.js b/js/ui/status/accessibility.js index 67b019ec8..b9cf7230a 100644 --- a/js/ui/status/accessibility.js +++ b/js/ui/status/accessibility.js @@ -91,7 +91,8 @@ ATIndicator.prototype = { this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addAction(_("Universal Access Settings"), function() { - Util.spawnDesktop('gnome-universal-access-panel'); + let app = Shell.AppSystem.get_default().get_app('gnome-universal-access-panel.desktop'); + app.activate(-1); }); }, diff --git a/js/ui/status/power.js b/js/ui/status/power.js index fabb18187..ca41f3a71 100644 --- a/js/ui/status/power.js +++ b/js/ui/status/power.js @@ -83,7 +83,8 @@ Indicator.prototype = { this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addAction(_("Power Settings"),function() { - Util.spawnDesktop('gnome-power-panel'); + let app = Shell.AppSystem.get_default().get_app('gnome-power-panel.desktop'); + app.activate(-1); }); this._proxy.connect('Changed', Lang.bind(this, this._devicesChanged)); diff --git a/js/ui/status/volume.js b/js/ui/status/volume.js index 36aa65d12..29ffcee76 100644 --- a/js/ui/status/volume.js +++ b/js/ui/status/volume.js @@ -64,7 +64,8 @@ Indicator.prototype = { this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addAction(_("Sound Settings"), function() { - Util.spawnDesktop('gnome-sound-panel'); + let app = Shell.AppSystem.get_default().get_app('gnome-sound-panel.desktop'); + app.activate(-1); }); this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); diff --git a/js/ui/statusMenu.js b/js/ui/statusMenu.js index 2a04506db..26a4fe46a 100644 --- a/js/ui/statusMenu.js +++ b/js/ui/statusMenu.js @@ -190,12 +190,14 @@ StatusMenuButton.prototype = { _onMyAccountActivate: function() { Main.overview.hide(); - Util.spawnDesktop('gnome-user-accounts-panel'); + let app = Shell.AppSystem.get_default().get_app('gnome-user-accounts-panel.desktop'); + app.activate(-1); }, _onPreferencesActivate: function() { Main.overview.hide(); - Util.spawnDesktop('gnome-control-center'); + let app = Shell.AppSystem.get_default().get_app('gnome-control-center.desktop'); + app.activate(-1); }, _onLockScreenActivate: function() { diff --git a/src/shell-app-system.c b/src/shell-app-system.c index 519a83010..9012540a2 100644 --- a/src/shell-app-system.c +++ b/src/shell-app-system.c @@ -159,20 +159,6 @@ shell_app_info_new_from_window (MetaWindow *window) return info; } -static ShellAppInfo * -shell_app_info_new_from_keyfile_take_ownership (GKeyFile *keyfile, - const char *path) -{ - ShellAppInfo *info; - - info = g_slice_alloc0 (sizeof (ShellAppInfo)); - info->type = SHELL_APP_INFO_TYPE_DESKTOP_FILE; - info->refcount = 1; - info->keyfile = keyfile; - info->keyfile_path = g_strdup (path); - return info; -} - static void shell_app_system_class_init(ShellAppSystemClass *klass) { GObjectClass *gobject_class = (GObjectClass *)klass; @@ -576,44 +562,6 @@ _shell_app_system_register_app (ShellAppSystem *self, g_object_weak_ref (G_OBJECT (app), shell_app_system_on_app_weakref, ref); } -ShellAppInfo * -shell_app_system_load_from_desktop_file (ShellAppSystem *system, - const char *filename, - GError **error) -{ - ShellAppInfo *appinfo; - GKeyFile *keyfile; - char *full_path = NULL; - gboolean success; - - keyfile = g_key_file_new (); - - if (strchr (filename, '/') != NULL) - { - success = g_key_file_load_from_file (keyfile, filename, G_KEY_FILE_NONE, error); - full_path = g_strdup (filename); - } - else - { - char *app_path = g_build_filename ("applications", filename, NULL); - success = g_key_file_load_from_data_dirs (keyfile, app_path, &full_path, - G_KEY_FILE_NONE, error); - g_free (app_path); - } - - if (!success) - { - g_key_file_free (keyfile); - g_free (full_path); - return NULL; - } - - appinfo = shell_app_info_new_from_keyfile_take_ownership (keyfile, full_path); - g_free (full_path); - - return appinfo; -} - /** * shell_app_system_create_from_window: * @@ -1386,12 +1334,23 @@ shell_app_info_launch_full (ShellAppInfo *info, shell_app = shell_app_system_get_app (shell_app_system_get_default (), shell_app_info_get_id (info)); - ret = g_desktop_app_info_launch_uris_as_manager (gapp, uris, - G_APP_LAUNCH_CONTEXT (context), - G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, - NULL, NULL, - _gather_pid_callback, shell_app, - error); + /* In the case where we know an app, we handle reaping the child internally, + * in the window tracker. + */ + if (shell_app != NULL) + ret = g_desktop_app_info_launch_uris_as_manager (gapp, uris, + G_APP_LAUNCH_CONTEXT (context), + G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, + NULL, NULL, + _gather_pid_callback, shell_app, + error); + else + ret = g_desktop_app_info_launch_uris_as_manager (gapp, uris, + G_APP_LAUNCH_CONTEXT (context), + G_SPAWN_SEARCH_PATH, + NULL, NULL, + NULL, NULL, + error); g_object_unref (G_OBJECT (gapp)); diff --git a/src/shell-app-system.h b/src/shell-app-system.h index 3b615cecb..b53c78d6d 100644 --- a/src/shell-app-system.h +++ b/src/shell-app-system.h @@ -81,9 +81,6 @@ ShellApp *shell_app_system_get_app_for_window (ShellAppSystem *sel ShellApp *shell_app_system_lookup_heuristic_basename (ShellAppSystem *system, const char *id); -ShellAppInfo *shell_app_system_load_from_desktop_file (ShellAppSystem *system, - const char *filename, - GError **error); ShellAppInfo *shell_app_system_create_from_window (ShellAppSystem *system, MetaWindow *window);