[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