app: Port to be based on GDesktopAppInfo

We weren't using the GMenuTreeEntry for anything special anymore,
so remove it.

https://bugzilla.gnome.org/show_bug.cgi?id=698486
This commit is contained in:
Jasper St. Pierre 2013-02-08 22:52:25 -05:00
parent 027c3d1661
commit d84b018ba7
4 changed files with 48 additions and 92 deletions

View File

@ -12,9 +12,9 @@ G_BEGIN_DECLS
ShellApp* _shell_app_new_for_window (MetaWindow *window); ShellApp* _shell_app_new_for_window (MetaWindow *window);
ShellApp* _shell_app_new (GMenuTreeEntry *entry); ShellApp* _shell_app_new (GDesktopAppInfo *info);
void _shell_app_set_entry (ShellApp *app, GMenuTreeEntry *entry); void _shell_app_set_app_info (ShellApp *app, GDesktopAppInfo *info);
void _shell_app_handle_startup_sequence (ShellApp *app, SnStartupSequence *sequence); void _shell_app_handle_startup_sequence (ShellApp *app, SnStartupSequence *sequence);

View File

@ -326,7 +326,6 @@ on_apps_tree_changed_cb (GMenuTree *tree,
{ {
const char *id = key; const char *id = key;
GMenuTreeEntry *entry = value; GMenuTreeEntry *entry = value;
GMenuTreeEntry *old_entry;
char *prefix; char *prefix;
ShellApp *app; ShellApp *app;
GDesktopAppInfo *info; GDesktopAppInfo *info;
@ -342,53 +341,36 @@ on_apps_tree_changed_cb (GMenuTree *tree,
else else
g_free (prefix); g_free (prefix);
info = gmenu_tree_entry_get_app_info (entry);
app = g_hash_table_lookup (self->priv->id_to_app, id); app = g_hash_table_lookup (self->priv->id_to_app, id);
if (app != NULL) if (app != NULL)
{
/* We hold a reference to the original entry temporarily,
* because otherwise the hash table would be referencing
* potentially free'd memory until we replace it below with
* the new data.
*/
old_entry = shell_app_get_tree_entry (app);
gmenu_tree_item_ref (old_entry);
_shell_app_set_entry (app, entry);
g_object_ref (app); /* Extra ref, removed in _replace below */
}
else
{
old_entry = NULL;
app = _shell_app_new (entry);
}
/* Note that "id" is owned by app->entry. Since we're always
* setting a new entry, even if the app already exists in the
* hash table we need to replace the key so that the new id
* string is pointed to.
*/
g_hash_table_replace (self->priv->id_to_app, (char*)id, app);
if (!gmenu_tree_entry_get_is_nodisplay_recurse (entry))
g_hash_table_replace (self->priv->visible_id_to_app, (char*)id, app);
if (old_entry)
{ {
GDesktopAppInfo *old_info; GDesktopAppInfo *old_info;
const gchar *old_startup_wm_class; const gchar *old_startup_wm_class;
old_info = gmenu_tree_entry_get_app_info (old_entry); old_info = shell_app_get_app_info (app);
old_startup_wm_class = g_desktop_app_info_get_startup_wm_class (old_info); old_startup_wm_class = g_desktop_app_info_get_startup_wm_class (old_info);
if (old_startup_wm_class) if (old_startup_wm_class)
g_hash_table_remove (self->priv->startup_wm_class_to_app, old_startup_wm_class); g_hash_table_remove (self->priv->startup_wm_class_to_app, old_startup_wm_class);
_shell_app_set_app_info (app, info);
g_object_ref (app); /* Extra ref, removed in _replace below */
}
else
{
app = _shell_app_new (info);
} }
info = gmenu_tree_entry_get_app_info (entry); g_hash_table_replace (self->priv->id_to_app, (char*)id, app);
if (!gmenu_tree_entry_get_is_nodisplay_recurse (entry))
g_hash_table_replace (self->priv->visible_id_to_app, (char*)id, app);
startup_wm_class = g_desktop_app_info_get_startup_wm_class (info); startup_wm_class = g_desktop_app_info_get_startup_wm_class (info);
if (startup_wm_class) if (startup_wm_class)
g_hash_table_replace (self->priv->startup_wm_class_to_app, g_hash_table_replace (self->priv->startup_wm_class_to_app,
(char*)startup_wm_class, g_object_ref (app)); (char*)startup_wm_class, g_object_ref (app));
if (old_entry)
gmenu_tree_item_unref (old_entry);
} }
/* Now iterate over the apps again; we need to unreference any apps /* Now iterate over the apps again; we need to unreference any apps
* which have been removed. The JS code may still be holding a * which have been removed. The JS code may still be holding a

View File

@ -53,7 +53,7 @@ typedef struct {
* SECTION:shell-app * SECTION:shell-app
* @short_description: Object representing an application * @short_description: Object representing an application
* *
* This object wraps a #GMenuTreeEntry, providing methods and signals * This object wraps a #GDesktopAppInfo, providing methods and signals
* primarily useful for running applications. * primarily useful for running applications.
*/ */
struct _ShellApp struct _ShellApp
@ -64,7 +64,7 @@ struct _ShellApp
ShellAppState state; ShellAppState state;
GMenuTreeEntry *entry; /* If NULL, this app is backed by one or more GDesktopAppInfo *info; /* If NULL, this app is backed by one or more
* MetaWindow. For purposes of app title * MetaWindow. For purposes of app title
* etc., we use the first window added, * etc., we use the first window added,
* because it's most likely to be what we * because it's most likely to be what we
@ -137,15 +137,15 @@ shell_app_get_property (GObject *gobject,
const char * const char *
shell_app_get_id (ShellApp *app) shell_app_get_id (ShellApp *app)
{ {
if (app->entry) if (app->info)
return gmenu_tree_entry_get_desktop_file_id (app->entry); return g_app_info_get_id (G_APP_INFO (app->info));
return app->window_id_string; return app->window_id_string;
} }
static MetaWindow * static MetaWindow *
window_backed_app_get_window (ShellApp *app) window_backed_app_get_window (ShellApp *app)
{ {
g_assert (app->entry == NULL); g_assert (app->info == NULL);
g_assert (app->running_state); g_assert (app->running_state);
g_assert (app->running_state->windows); g_assert (app->running_state->windows);
return app->running_state->windows->data; return app->running_state->windows->data;
@ -194,10 +194,10 @@ shell_app_create_icon_texture (ShellApp *app,
ret = NULL; ret = NULL;
if (app->entry == NULL) if (app->info == NULL)
return window_backed_app_get_icon (app, size); return window_backed_app_get_icon (app, size);
icon = g_app_info_get_icon (G_APP_INFO (gmenu_tree_entry_get_app_info (app->entry))); icon = g_app_info_get_icon (G_APP_INFO (app->info));
if (icon != NULL) if (icon != NULL)
ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), NULL, icon, size); ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), NULL, icon, size);
@ -245,7 +245,7 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache,
info = NULL; info = NULL;
icon = g_app_info_get_icon (G_APP_INFO (gmenu_tree_entry_get_app_info (app->entry))); icon = g_app_info_get_icon (G_APP_INFO (app->info));
if (icon != NULL) if (icon != NULL)
{ {
info = gtk_icon_theme_lookup_by_gicon (gtk_icon_theme_get_default (), info = gtk_icon_theme_lookup_by_gicon (gtk_icon_theme_get_default (),
@ -347,7 +347,7 @@ shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection directio
* property tracking bits, and this helps us visually distinguish * property tracking bits, and this helps us visually distinguish
* app-tracked from not. * app-tracked from not.
*/ */
if (!app->entry) if (!app->info)
return window_backed_app_get_icon (app, size); return window_backed_app_get_icon (app, size);
/* Use icon: prefix so that we get evicted from the cache on /* Use icon: prefix so that we get evicted from the cache on
@ -384,8 +384,8 @@ shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection directio
const char * const char *
shell_app_get_name (ShellApp *app) shell_app_get_name (ShellApp *app)
{ {
if (app->entry) if (app->info)
return g_app_info_get_name (G_APP_INFO (gmenu_tree_entry_get_app_info (app->entry))); return g_app_info_get_name (G_APP_INFO (app->info));
else else
{ {
MetaWindow *window = window_backed_app_get_window (app); MetaWindow *window = window_backed_app_get_window (app);
@ -401,8 +401,8 @@ shell_app_get_name (ShellApp *app)
const char * const char *
shell_app_get_description (ShellApp *app) shell_app_get_description (ShellApp *app)
{ {
if (app->entry) if (app->info)
return g_app_info_get_description (G_APP_INFO (gmenu_tree_entry_get_app_info (app->entry))); return g_app_info_get_description (G_APP_INFO (app->info));
else else
return NULL; return NULL;
} }
@ -417,7 +417,7 @@ shell_app_get_description (ShellApp *app)
gboolean gboolean
shell_app_is_window_backed (ShellApp *app) shell_app_is_window_backed (ShellApp *app)
{ {
return app->entry == NULL; return app->info == NULL;
} }
typedef struct { typedef struct {
@ -665,7 +665,7 @@ void
shell_app_open_new_window (ShellApp *app, shell_app_open_new_window (ShellApp *app,
int workspace) int workspace)
{ {
g_return_if_fail (app->entry != NULL); g_return_if_fail (app->info != NULL);
/* Here we just always launch the application again, even if we know /* Here we just always launch the application again, even if we know
* it was already running. For most applications this * it was already running. For most applications this
@ -855,25 +855,24 @@ _shell_app_new_for_window (MetaWindow *window)
} }
ShellApp * ShellApp *
_shell_app_new (GMenuTreeEntry *info) _shell_app_new (GDesktopAppInfo *info)
{ {
ShellApp *app; ShellApp *app;
app = g_object_new (SHELL_TYPE_APP, NULL); app = g_object_new (SHELL_TYPE_APP, NULL);
_shell_app_set_entry (app, info); _shell_app_set_app_info (app, info);
return app; return app;
} }
void void
_shell_app_set_entry (ShellApp *app, _shell_app_set_app_info (ShellApp *app,
GMenuTreeEntry *entry) GDesktopAppInfo *info)
{ {
if (app->entry != NULL) g_clear_object (&app->info);
gmenu_tree_item_unref (app->entry); app->info = g_object_ref (info);
app->entry = gmenu_tree_item_ref (entry);
if (app->name_collation_key != NULL) if (app->name_collation_key != NULL)
g_free (app->name_collation_key); g_free (app->name_collation_key);
app->name_collation_key = g_utf8_collate_key (shell_app_get_name (app), -1); app->name_collation_key = g_utf8_collate_key (shell_app_get_name (app), -1);
@ -1174,14 +1173,13 @@ shell_app_launch (ShellApp *app,
int workspace, int workspace,
GError **error) GError **error)
{ {
GDesktopAppInfo *gapp;
GdkAppLaunchContext *context; GdkAppLaunchContext *context;
gboolean ret; gboolean ret;
ShellGlobal *global; ShellGlobal *global;
MetaScreen *screen; MetaScreen *screen;
GdkDisplay *gdisplay; GdkDisplay *gdisplay;
if (app->entry == NULL) if (app->info == NULL)
{ {
MetaWindow *window = window_backed_app_get_window (app); MetaWindow *window = window_backed_app_get_window (app);
meta_window_activate (window, timestamp); meta_window_activate (window, timestamp);
@ -1202,8 +1200,7 @@ shell_app_launch (ShellApp *app,
gdk_app_launch_context_set_timestamp (context, timestamp); gdk_app_launch_context_set_timestamp (context, timestamp);
gdk_app_launch_context_set_desktop (context, workspace); gdk_app_launch_context_set_desktop (context, workspace);
gapp = gmenu_tree_entry_get_app_info (app->entry); ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL,
ret = g_desktop_app_info_launch_uris_as_manager (gapp, NULL,
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,
@ -1223,21 +1220,7 @@ shell_app_launch (ShellApp *app,
GDesktopAppInfo * GDesktopAppInfo *
shell_app_get_app_info (ShellApp *app) shell_app_get_app_info (ShellApp *app)
{ {
if (app->entry) return app->info;
return gmenu_tree_entry_get_app_info (app->entry);
return NULL;
}
/**
* shell_app_get_tree_entry:
* @app: a #ShellApp
*
* Returns: (transfer none): The #GMenuTreeEntry for this app, or %NULL if backed by a window
*/
GMenuTreeEntry *
shell_app_get_tree_entry (ShellApp *app)
{
return app->entry;
} }
static void static void
@ -1352,24 +1335,22 @@ shell_app_init_search_data (ShellApp *app)
const char *exec; const char *exec;
const char * const *keywords; const char * const *keywords;
char *normalized_exec; char *normalized_exec;
GDesktopAppInfo *appinfo;
appinfo = gmenu_tree_entry_get_app_info (app->entry); name = g_app_info_get_name (G_APP_INFO (app->info));
name = g_app_info_get_name (G_APP_INFO (appinfo));
app->casefolded_name = shell_util_normalize_casefold_and_unaccent (name); app->casefolded_name = shell_util_normalize_casefold_and_unaccent (name);
generic_name = g_desktop_app_info_get_generic_name (appinfo); generic_name = g_desktop_app_info_get_generic_name (app->info);
if (generic_name) if (generic_name)
app->casefolded_generic_name = shell_util_normalize_casefold_and_unaccent (generic_name); app->casefolded_generic_name = shell_util_normalize_casefold_and_unaccent (generic_name);
else else
app->casefolded_generic_name = NULL; app->casefolded_generic_name = NULL;
exec = g_app_info_get_executable (G_APP_INFO (appinfo)); exec = g_app_info_get_executable (G_APP_INFO (app->info));
normalized_exec = shell_util_normalize_casefold_and_unaccent (exec); normalized_exec = shell_util_normalize_casefold_and_unaccent (exec);
app->casefolded_exec = trim_exec_line (normalized_exec); app->casefolded_exec = trim_exec_line (normalized_exec);
g_free (normalized_exec); g_free (normalized_exec);
keywords = g_desktop_app_info_get_keywords (appinfo); keywords = g_desktop_app_info_get_keywords (app->info);
if (keywords) if (keywords)
{ {
@ -1490,16 +1471,14 @@ _shell_app_do_match (ShellApp *app,
GSList **substring_results) GSList **substring_results)
{ {
ShellAppSearchMatch match; ShellAppSearchMatch match;
GAppInfo *appinfo;
g_assert (app != NULL); g_assert (app != NULL);
/* Skip window-backed apps */ /* Skip window-backed apps */
appinfo = (GAppInfo*)shell_app_get_app_info (app); if (app->info == NULL)
if (appinfo == NULL)
return; return;
/* Skip not-visible apps */ /* Skip not-visible apps */
if (!g_app_info_should_show (appinfo)) if (!g_app_info_should_show (G_APP_INFO (app->info)))
return; return;
match = _shell_app_match_search_terms (app, terms); match = _shell_app_match_search_terms (app, terms);
@ -1528,11 +1507,7 @@ shell_app_dispose (GObject *object)
{ {
ShellApp *app = SHELL_APP (object); ShellApp *app = SHELL_APP (object);
if (app->entry) g_clear_object (&app->info);
{
gmenu_tree_item_unref (app->entry);
app->entry = NULL;
}
if (app->running_state) if (app->running_state)
{ {

View File

@ -39,7 +39,6 @@ GType shell_app_get_type (void) G_GNUC_CONST;
const char *shell_app_get_id (ShellApp *app); const char *shell_app_get_id (ShellApp *app);
GMenuTreeEntry *shell_app_get_tree_entry (ShellApp *app);
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app); GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size); ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size);