diff --git a/src/shell-app-system.c b/src/shell-app-system.c index 2d0d3db41..c2d002531 100644 --- a/src/shell-app-system.c +++ b/src/shell-app-system.c @@ -484,6 +484,49 @@ shell_app_system_get_app (ShellAppSystem *self, return app; } +/** + * shell_app_system_get_app_for_path: + * @system: a #ShellAppSystem + * @desktop_path: (utf8): UTF-8 encoded absolute file name + * + * Find or create a #ShellApp corresponding to a given absolute + * file name which must be in the standard paths (XDG_DATA_DIRS). + * For files outside the datadirs, this function returns %NULL. + * + * If already cached elsewhere in memory, return that instance. + * Otherwise, create a new one. + * + * Return value: (transfer full): The #ShellApp for id, or %NULL if none + */ +ShellApp * +shell_app_system_get_app_for_path (ShellAppSystem *system, + const char *desktop_path) +{ + const char *basename; + ShellAppInfo *info; + + basename = g_strrstr (desktop_path, "/"); + if (basename) + basename += 1; + else + basename = desktop_path; + + info = g_hash_table_lookup (system->priv->app_id_to_info, basename); + if (!info) + return NULL; + + if (info->type == SHELL_APP_INFO_TYPE_ENTRY) + { + const char *full_path = gmenu_tree_entry_get_desktop_file_path ((GMenuTreeEntry*) info->entry); + if (strcmp (desktop_path, full_path) != 0) + return NULL; + } + else + return NULL; + + return shell_app_system_get_app (system, basename); +} + /** * shell_app_system_get_app_for_window: * @self: A #ShellAppSystem diff --git a/src/shell-app-system.h b/src/shell-app-system.h index be7efebce..2f3dda74f 100644 --- a/src/shell-app-system.h +++ b/src/shell-app-system.h @@ -70,6 +70,7 @@ gboolean shell_app_info_launch (ShellAppInfo *info, ShellAppInfo *shell_app_system_load_from_desktop_file (ShellAppSystem *system, const char *filename, GError **error); ShellApp *shell_app_system_get_app (ShellAppSystem *system, const char *id); +ShellApp *shell_app_system_get_app_for_path (ShellAppSystem *system, const char *desktop_path); ShellApp *shell_app_system_get_app_for_window (ShellAppSystem *self, MetaWindow *window); void _shell_app_system_register_app (ShellAppSystem *self, ShellApp *app);