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:
parent
4bf1df0894
commit
fea8b6da2f
@ -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);
|
||||||
|
@ -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() {
|
||||||
|
@ -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);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
@ -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));
|
||||||
|
@ -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() {
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user