Remove broken ShellAppSystem API and all consumers

In commit 9bd22dc0, I introduced an API to load an arbitrary
.desktop file, not necessarily from the menu path.  It turns
out this function was broken because it created ShellApp instances
that were *different* from ones that were cached normally.

As far as I can tell, we didn't initially use it.  Then later
Util.spawnDesktop was created which used this function.

Remove this broken function and all callers; if we're loading
.desktop files from *outside* the menu path, we can look at
readding.

This patch also kills off Util.spawnDesktop in favor of callers
talking to ShellAppSystem directly, now that the latter reports
errors.

https://bugzilla.gnome.org/show_bug.cgi?id=644402
This commit is contained in:
Colin Walters 2011-03-10 12:19:10 -05:00
parent 4bf1df0894
commit fea8b6da2f
8 changed files with 29 additions and 108 deletions

View File

@ -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: // trySpawn:
// @argv: an argv array // @argv: an argv array
// //
@ -116,33 +102,6 @@ function trySpawnCommandLine(command_line) {
trySpawn(argv); 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) { function _handleSpawnError(command, err) {
let title = _("Execution of '%s' failed:").format(command); let title = _("Execution of '%s' failed:").format(command);
Main.notifyProblem(title, err.message); Main.notifyProblem(title, err.message);

View File

@ -200,7 +200,8 @@ DateMenuButton.prototype = {
_onPreferencesActivate: function() { _onPreferencesActivate: function() {
this.menu.close(); 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() { _onOpenCalendarActivate: function() {

View File

@ -91,7 +91,8 @@ ATIndicator.prototype = {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Universal Access Settings"), function() { 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);
}); });
}, },

View File

@ -83,7 +83,8 @@ Indicator.prototype = {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Power Settings"),function() { 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)); this._proxy.connect('Changed', Lang.bind(this, this._devicesChanged));

View File

@ -64,7 +64,8 @@ Indicator.prototype = {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Sound Settings"), function() { 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)); this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));

View File

@ -190,12 +190,14 @@ StatusMenuButton.prototype = {
_onMyAccountActivate: function() { _onMyAccountActivate: function() {
Main.overview.hide(); 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() { _onPreferencesActivate: function() {
Main.overview.hide(); 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() { _onLockScreenActivate: function() {

View File

@ -159,20 +159,6 @@ shell_app_info_new_from_window (MetaWindow *window)
return info; 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) static void shell_app_system_class_init(ShellAppSystemClass *klass)
{ {
GObjectClass *gobject_class = (GObjectClass *)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); 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: * 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 = shell_app_system_get_app (shell_app_system_get_default (),
shell_app_info_get_id (info)); shell_app_info_get_id (info));
/* 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, ret = g_desktop_app_info_launch_uris_as_manager (gapp, uris,
G_APP_LAUNCH_CONTEXT (context), G_APP_LAUNCH_CONTEXT (context),
G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
NULL, NULL, NULL, NULL,
_gather_pid_callback, shell_app, _gather_pid_callback, shell_app,
error); 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)); g_object_unref (G_OBJECT (gapp));

View File

@ -81,9 +81,6 @@ ShellApp *shell_app_system_get_app_for_window (ShellAppSystem *sel
ShellApp *shell_app_system_lookup_heuristic_basename (ShellAppSystem *system, ShellApp *shell_app_system_lookup_heuristic_basename (ShellAppSystem *system,
const char *id); 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, ShellAppInfo *shell_app_system_create_from_window (ShellAppSystem *system,
MetaWindow *window); MetaWindow *window);