[gnome-shell] app: Port to be based on GDesktopAppInfo



commit d84b018ba71089dd2cb42242f25cd97b43cf2970
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Fri Feb 8 22:52:25 2013 -0500

    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

 src/shell-app-private.h |    4 +-
 src/shell-app-system.c  |   46 +++++++-----------------
 src/shell-app.c         |   89 +++++++++++++++++------------------------------
 src/shell-app.h         |    1 -
 4 files changed, 48 insertions(+), 92 deletions(-)
---
diff --git a/src/shell-app-private.h b/src/shell-app-private.h
index 8c6432e..407e75f 100644
--- a/src/shell-app-private.h
+++ b/src/shell-app-private.h
@@ -12,9 +12,9 @@ G_BEGIN_DECLS
 
 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);
 
diff --git a/src/shell-app-system.c b/src/shell-app-system.c
index 01c468b..8d36f25 100644
--- a/src/shell-app-system.c
+++ b/src/shell-app-system.c
@@ -326,7 +326,6 @@ on_apps_tree_changed_cb (GMenuTree *tree,
     {
       const char *id = key;
       GMenuTreeEntry *entry = value;
-      GMenuTreeEntry *old_entry;
       char *prefix;
       ShellApp *app;
       GDesktopAppInfo *info;
@@ -342,53 +341,36 @@ on_apps_tree_changed_cb (GMenuTree *tree,
       else
         g_free (prefix);
 
+      info = gmenu_tree_entry_get_app_info (entry);
+
       app = g_hash_table_lookup (self->priv->id_to_app, id);
       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;
           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);
 
           if (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);
       if (startup_wm_class)
         g_hash_table_replace (self->priv->startup_wm_class_to_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
    * which have been removed.  The JS code may still be holding a
diff --git a/src/shell-app.c b/src/shell-app.c
index c094fb9..ede6bc0 100644
--- a/src/shell-app.c
+++ b/src/shell-app.c
@@ -53,7 +53,7 @@ typedef struct {
  * SECTION:shell-app
  * @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.
  */
 struct _ShellApp
@@ -64,7 +64,7 @@ struct _ShellApp
 
   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
                           * etc., we use the first window added,
                           * because it's most likely to be what we
@@ -137,15 +137,15 @@ shell_app_get_property (GObject    *gobject,
 const char *
 shell_app_get_id (ShellApp *app)
 {
-  if (app->entry)
-    return gmenu_tree_entry_get_desktop_file_id (app->entry);
+  if (app->info)
+    return g_app_info_get_id (G_APP_INFO (app->info));
   return app->window_id_string;
 }
 
 static MetaWindow *
 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->windows);
   return app->running_state->windows->data;
@@ -194,10 +194,10 @@ shell_app_create_icon_texture (ShellApp   *app,
 
   ret = NULL;
 
-  if (app->entry == NULL)
+  if (app->info == NULL)
     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)
     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;
 
-  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)
     {
       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
    * app-tracked from not.
    */
-  if (!app->entry)
+  if (!app->info)
     return window_backed_app_get_icon (app, size);
 
   /* 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 *
 shell_app_get_name (ShellApp *app)
 {
-  if (app->entry)
-    return g_app_info_get_name (G_APP_INFO (gmenu_tree_entry_get_app_info (app->entry)));
+  if (app->info)
+    return g_app_info_get_name (G_APP_INFO (app->info));
   else
     {
       MetaWindow *window = window_backed_app_get_window (app);
@@ -401,8 +401,8 @@ shell_app_get_name (ShellApp *app)
 const char *
 shell_app_get_description (ShellApp *app)
 {
-  if (app->entry)
-    return g_app_info_get_description (G_APP_INFO (gmenu_tree_entry_get_app_info (app->entry)));
+  if (app->info)
+    return g_app_info_get_description (G_APP_INFO (app->info));
   else
     return NULL;
 }
@@ -417,7 +417,7 @@ shell_app_get_description (ShellApp *app)
 gboolean
 shell_app_is_window_backed (ShellApp *app)
 {
-  return app->entry == NULL;
+  return app->info == NULL;
 }
 
 typedef struct {
@@ -665,7 +665,7 @@ void
 shell_app_open_new_window (ShellApp      *app,
                            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
    * it was already running.  For most applications this
@@ -855,25 +855,24 @@ _shell_app_new_for_window (MetaWindow      *window)
 }
 
 ShellApp *
-_shell_app_new (GMenuTreeEntry *info)
+_shell_app_new (GDesktopAppInfo *info)
 {
   ShellApp *app;
 
   app = g_object_new (SHELL_TYPE_APP, NULL);
 
-  _shell_app_set_entry (app, info);
+  _shell_app_set_app_info (app, info);
 
   return app;
 }
 
 void
-_shell_app_set_entry (ShellApp       *app,
-                      GMenuTreeEntry *entry)
+_shell_app_set_app_info (ShellApp        *app,
+                         GDesktopAppInfo *info)
 {
-  if (app->entry != NULL)
-    gmenu_tree_item_unref (app->entry);
-  app->entry = gmenu_tree_item_ref (entry);
-  
+  g_clear_object (&app->info);
+  app->info = g_object_ref (info);
+
   if (app->name_collation_key != NULL)
     g_free (app->name_collation_key);
   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,
                   GError      **error)
 {
-  GDesktopAppInfo *gapp;
   GdkAppLaunchContext *context;
   gboolean ret;
   ShellGlobal *global;
   MetaScreen *screen;
   GdkDisplay *gdisplay;
 
-  if (app->entry == NULL)
+  if (app->info == NULL)
     {
       MetaWindow *window = window_backed_app_get_window (app);
       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_desktop (context, workspace);
 
-  gapp = gmenu_tree_entry_get_app_info (app->entry);
-  ret = g_desktop_app_info_launch_uris_as_manager (gapp, NULL,
+  ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL,
                                                    G_APP_LAUNCH_CONTEXT (context),
                                                    G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
                                                    NULL, NULL,
@@ -1223,21 +1220,7 @@ shell_app_launch (ShellApp     *app,
 GDesktopAppInfo *
 shell_app_get_app_info (ShellApp *app)
 {
-  if (app->entry)
-    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;
+  return app->info;
 }
 
 static void
@@ -1352,24 +1335,22 @@ shell_app_init_search_data (ShellApp *app)
   const char *exec;
   const char * const *keywords;
   char *normalized_exec;
-  GDesktopAppInfo *appinfo;
 
-  appinfo = gmenu_tree_entry_get_app_info (app->entry);
-  name = g_app_info_get_name (G_APP_INFO (appinfo));
+  name = g_app_info_get_name (G_APP_INFO (app->info));
   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)
     app->casefolded_generic_name = shell_util_normalize_casefold_and_unaccent (generic_name);
   else
     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);
   app->casefolded_exec = trim_exec_line (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)
     {
@@ -1490,16 +1471,14 @@ _shell_app_do_match (ShellApp         *app,
                      GSList          **substring_results)
 {
   ShellAppSearchMatch match;
-  GAppInfo *appinfo;
 
   g_assert (app != NULL);
 
   /* Skip window-backed apps */ 
-  appinfo = (GAppInfo*)shell_app_get_app_info (app);
-  if (appinfo == NULL)
+  if (app->info == NULL)
     return;
   /* Skip not-visible apps */ 
-  if (!g_app_info_should_show (appinfo))
+  if (!g_app_info_should_show (G_APP_INFO (app->info)))
     return;
 
   match = _shell_app_match_search_terms (app, terms);
@@ -1528,11 +1507,7 @@ shell_app_dispose (GObject *object)
 {
   ShellApp *app = SHELL_APP (object);
 
-  if (app->entry)
-    {
-      gmenu_tree_item_unref (app->entry);
-      app->entry = NULL;
-    }
+  g_clear_object (&app->info);
 
   if (app->running_state)
     {
diff --git a/src/shell-app.h b/src/shell-app.h
index 318242f..55bb01d 100644
--- a/src/shell-app.h
+++ b/src/shell-app.h
@@ -39,7 +39,6 @@ GType shell_app_get_type (void) G_GNUC_CONST;
 
 const char *shell_app_get_id (ShellApp *app);
 
-GMenuTreeEntry *shell_app_get_tree_entry (ShellApp *app);
 GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
 
 ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]