[Xfce4-commits] <design:master> Merge categories to avoid desktop_id dups.

Nick Schermer noreply at xfce.org
Sun Jun 5 19:46:01 CEST 2011


Updating branch refs/heads/master
         to 8934cabe65178cdde229d7103851ae828e047374 (commit)
       from 883cf7f2623c63c28e237d8f4c9011760a9708c0 (commit)

commit 8934cabe65178cdde229d7103851ae828e047374
Author: Nick Schermer <nick at xfce.org>
Date:   Sun Jun 5 18:18:44 2011 +0200

    Merge categories to avoid desktop_id dups.

 .../merge-with-xfrun/demo-code/c/appfinder-model.c |   68 ++++++++++++++++----
 .../merge-with-xfrun/demo-code/c/appfinder-model.h |    3 +
 .../demo-code/c/appfinder-window.c                 |    4 +-
 3 files changed, 60 insertions(+), 15 deletions(-)

diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.c b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.c
index c0fd921..1365dfb 100644
--- a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.c
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.c
@@ -11,8 +11,6 @@
 #include "appfinder-model.h"
 
 #define HISTORY_PATH "xfce4/xfce4-appfinder/history"
-#define ICON_SMALL   32
-#define ICON_LARGE   48
 
 
 
@@ -77,6 +75,7 @@ struct _XfceAppfinderModel
   GSList            *collect_categories;
   GThread           *collect_thread;
   volatile gboolean  collect_cancelled;
+  GHashTable        *collect_desktop_ids;
 };
 
 typedef struct
@@ -84,7 +83,7 @@ typedef struct
   GarconMenuItem *item;
   gchar          *key;
   gchar          *abstract;
-  gchar          *category;
+  GPtrArray      *categories;
   gchar          *command;
   guint           visible : 1;
 
@@ -186,6 +185,9 @@ xfce_appfinder_model_finalize (GObject *object)
   if (G_UNLIKELY (model->filter_idle_id != 0))
     g_source_remove (model->filter_idle_id);
 
+  if (model->collect_desktop_ids != NULL)
+    g_hash_table_destroy (model->collect_desktop_ids);
+
   g_free (model->filter_category);
   g_free (model->filter_string);
 
@@ -585,9 +587,10 @@ xfce_appfinder_model_item_free (gpointer data)
     g_object_unref (G_OBJECT (item->icon_small));
   if (item->icon_large != NULL)
     g_object_unref (G_OBJECT (item->icon_large));
+  if (item->categories != NULL)
+    g_ptr_array_free (item->categories, TRUE);
   g_free (item->abstract);
   g_free (item->key);
-  g_free (item->category);
   g_free (item->command);
   g_slice_free (ModelItem, item);
 }
@@ -635,6 +638,28 @@ xfce_appfinder_model_item_key (GarconMenuItem *item)
 
 
 static gboolean
+xfce_appfinder_model_ptr_array_strcmp (GPtrArray   *array,
+                                       const gchar *str1)
+{
+  guint        i;
+  const gchar *str2;
+
+  if (array != NULL && str1 != NULL)
+    {
+      for (i = 0; i < array->len; i++)
+        {
+          str2 = g_ptr_array_index (array, i);
+          if (str2 != NULL && strcmp (str1, str2) == 0)
+            return TRUE;
+        }
+    }
+
+  return FALSE;
+}
+
+
+
+static gboolean
 xfce_appfinder_model_collect_items (XfceAppfinderModel *model,
                                     GarconMenu         *menu,
                                     const gchar        *category)
@@ -644,6 +669,7 @@ xfce_appfinder_model_collect_items (XfceAppfinderModel *model,
   ModelItem           *item;
   gboolean             has_items = FALSE;
   gchar               *category_collated = NULL;
+  const gchar         *desktop_id;
 
   g_return_val_if_fail (GARCON_IS_MENU (menu), FALSE);
 
@@ -670,13 +696,27 @@ xfce_appfinder_model_collect_items (XfceAppfinderModel *model,
           if (!garcon_menu_element_get_visible (li->data))
             continue;
 
-          item = g_slice_new0 (ModelItem);
-          item->visible = TRUE;
-          item->item = li->data;
-          item->visible = FALSE;
-          item->category = g_strdup (category);
+          desktop_id = garcon_menu_item_get_desktop_id (li->data);
+          item = g_hash_table_lookup (model->collect_desktop_ids, desktop_id);
+          if (G_LIKELY (item == NULL))
+            {
+              item = g_slice_new0 (ModelItem);
+              item->visible = TRUE;
+              item->item = li->data;
+              item->visible = FALSE;
 
-          model->collect_items = g_slist_prepend (model->collect_items, item);
+              item->categories = g_ptr_array_new_with_free_func (g_free);
+              g_ptr_array_add (item->categories, g_strdup (category));
+
+              model->collect_items = g_slist_prepend (model->collect_items, item);
+              g_hash_table_insert (model->collect_desktop_ids, (gchar *) desktop_id, item);
+            }
+          else if (!xfce_appfinder_model_ptr_array_strcmp (item->categories, category))
+            {
+              /* add category to existing item */
+              g_ptr_array_add (item->categories, g_strdup (category));
+              g_message ("%s is in %d categories", desktop_id, item->categories->len);
+            }
 
           has_items = TRUE;
         }
@@ -711,7 +751,7 @@ xfce_appfinder_model_collect_history (XfceAppfinderModel *model,
   if (contents == NULL)
     return;
 
-  for (;;)
+  for (;!model->collect_cancelled;)
     {
       end = strchr (contents, '\n');
       if (G_UNLIKELY (end == NULL))
@@ -751,7 +791,10 @@ xfce_appfinder_model_collect_thread (gpointer user_data)
     {
       if (garcon_menu_load (model->menu, NULL, &error))
         {
+          model->collect_desktop_ids = g_hash_table_new (g_str_hash, g_str_equal);
           xfce_appfinder_model_collect_items (model, model->menu, NULL);
+          g_hash_table_destroy (model->collect_desktop_ids);
+          model->collect_desktop_ids = NULL;
         }
       else
         {
@@ -818,8 +861,7 @@ xfce_appfinder_model_filter_idle (gpointer data)
       if (item->item != NULL)
         {
           if (model->filter_category != NULL
-              && (item->category == NULL
-                  || strcmp (model->filter_category, item->category) != 0))
+              && !xfce_appfinder_model_ptr_array_strcmp (item->categories, model->filter_category))
             {
               visible = FALSE;
             }
diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.h b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.h
index 19ca402..f041949 100644
--- a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.h
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.h
@@ -15,6 +15,9 @@ typedef struct _XfceAppfinderModel      XfceAppfinderModel;
 #define XFCE_IS_APPFINDER_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XFCE_TYPE_APPFINDER_MODEL))
 #define XFCE_APPFINDER_MODEL_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), XFCE_TYPE_APPFINDER_MODEL, XfceAppfinderModelClass))
 
+#define ICON_SMALL   32
+#define ICON_LARGE   48
+
 #define ITER_GET_DATA(iter)          (((GSList *) (iter)->user_data)->data)
 #define ITER_INIT(iter, iter_stamp, iter_data) \
 G_STMT_START { \
diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-window.c b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-window.c
index 9d8065e..2482e02 100644
--- a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-window.c
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-window.c
@@ -150,7 +150,7 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
   gtk_box_pack_start (GTK_BOX (hbox), align, FALSE, FALSE, 0);
   gtk_widget_show (align);
 
-  window->icon_find = xfce_appfinder_model_load_pixbuf (GTK_STOCK_FIND, 48);
+  window->icon_find = xfce_appfinder_model_load_pixbuf (GTK_STOCK_FIND, ICON_LARGE);
   window->image = image = gtk_image_new_from_pixbuf (window->icon_find);
   gtk_container_add (GTK_CONTAINER (align), image);
   gtk_widget_show (image);
@@ -351,7 +351,7 @@ xfce_appfinder_window_set_padding (GtkWidget *entry,
 {
   gint padding;
 
-  padding = (48 - entry->allocation.height) / 2;
+  padding = (ICON_LARGE - entry->allocation.height) / 2;
   gtk_alignment_set_padding (GTK_ALIGNMENT (align), MAX (0, padding), 0, 0, 0);
 }
 



More information about the Xfce4-commits mailing list