[Xfce4-commits] <design:master> Make things work a bit.
Nick Schermer
noreply at xfce.org
Wed Jun 1 22:22:01 CEST 2011
Updating branch refs/heads/master
to 08f85328085bf8df79c546c59cb218701c9cb5eb (commit)
from 41e54340a3813c31b50f461d9bf4ae380d630a80 (commit)
commit 08f85328085bf8df79c546c59cb218701c9cb5eb
Author: Nick Schermer <nick at xfce.org>
Date: Wed Jun 1 22:20:08 2011 +0200
Make things work a bit.
.../merge-with-xfrun/demo-code/c/Makefile | 2 +
.../demo-code/c/appfinder-category-model.c | 341 ++++++++++++
.../demo-code/c/appfinder-category-model.h | 39 ++
.../merge-with-xfrun/demo-code/c/appfinder-model.c | 588 ++++++++++++++++++++
.../merge-with-xfrun/demo-code/c/appfinder-model.h | 40 ++
.../demo-code/c/appfinder-window.c | 105 +++-
.../merge-with-xfrun/demo-code/c/main.c | 2 +
7 files changed, 1094 insertions(+), 23 deletions(-)
diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/Makefile b/xfce4-appfinder/merge-with-xfrun/demo-code/c/Makefile
index 794912b..0d46187 100644
--- a/xfce4-appfinder/merge-with-xfrun/demo-code/c/Makefile
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/Makefile
@@ -7,4 +7,6 @@ all:
`pkg-config --libs --cflags gthread-2.0` \
`pkg-config --libs --cflags libxfce4ui-1` \
main.c appfinder-window.c appfinder-window.h \
+ appfinder-model.c appfinder-model.h \
+ appfinder-category-model.c appfinder-category-model.h \
-o appfinder
diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-category-model.c b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-category-model.c
new file mode 100644
index 0000000..f3ded89
--- /dev/null
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-category-model.c
@@ -0,0 +1,341 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <memory.h>
+#include <string.h>
+#include <libxfce4util/libxfce4util.h>
+#include <garcon/garcon.h>
+
+#include "appfinder-model.h"
+#include "appfinder-category-model.h"
+
+
+static void xfce_appfinder_category_model_tree_model_init (GtkTreeModelIface *iface);
+static void xfce_appfinder_category_model_finalize (GObject *object);
+static GtkTreeModelFlags xfce_appfinder_category_model_get_flags (GtkTreeModel *tree_model);
+static gint xfce_appfinder_category_model_get_n_columns (GtkTreeModel *tree_model);
+static GType xfce_appfinder_category_model_get_column_type (GtkTreeModel *tree_model,
+ gint column);
+static gboolean xfce_appfinder_category_model_get_iter (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreePath *path);
+static GtkTreePath *xfce_appfinder_category_model_get_path (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
+static void xfce_appfinder_category_model_get_value (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gint column,
+ GValue *value);
+static gboolean xfce_appfinder_category_model_iter_next (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
+static gboolean xfce_appfinder_category_model_iter_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent);
+static gboolean xfce_appfinder_category_model_iter_has_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
+static gint xfce_appfinder_category_model_iter_n_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
+static gboolean xfce_appfinder_category_model_iter_nth_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent,
+ gint n);
+static gboolean xfce_appfinder_category_model_iter_parent (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *child);
+
+
+
+struct _XfceAppfinderCategoryModelClass
+{
+ GObjectClass __parent__;
+};
+
+struct _XfceAppfinderCategoryModel
+{
+ GObject __parent__;
+ gint stamp;
+
+ GSList *items;
+};
+
+
+
+G_DEFINE_TYPE_WITH_CODE (XfceAppfinderCategoryModel, xfce_appfinder_category_model, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, xfce_appfinder_category_model_tree_model_init))
+
+
+
+static void
+xfce_appfinder_category_model_class_init (XfceAppfinderCategoryModelClass *klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = xfce_appfinder_category_model_finalize;
+}
+
+
+
+static void
+xfce_appfinder_category_model_init (XfceAppfinderCategoryModel *model)
+{
+ GarconMenuDirectory *directory;
+
+ /* generate a unique stamp */
+ model->stamp = g_random_int ();
+
+ directory = g_object_new (GARCON_TYPE_MENU_DIRECTORY,
+ "name", _("Commands History"),
+ "icon-name", GTK_STOCK_EXECUTE, NULL);
+ model->items = g_slist_prepend (model->items, directory);
+
+ directory = g_object_new (GARCON_TYPE_MENU_DIRECTORY,
+ "name", _("All Applications"),
+ "icon-name", "applications-other", NULL);
+ model->items = g_slist_prepend (model->items, directory);
+}
+
+
+
+static void
+xfce_appfinder_category_model_tree_model_init (GtkTreeModelIface *iface)
+{
+ iface->get_flags = xfce_appfinder_category_model_get_flags;
+ iface->get_n_columns = xfce_appfinder_category_model_get_n_columns;
+ iface->get_column_type = xfce_appfinder_category_model_get_column_type;
+ iface->get_iter = xfce_appfinder_category_model_get_iter;
+ iface->get_path = xfce_appfinder_category_model_get_path;
+ iface->get_value = xfce_appfinder_category_model_get_value;
+ iface->iter_next = xfce_appfinder_category_model_iter_next;
+ iface->iter_children = xfce_appfinder_category_model_iter_children;
+ iface->iter_has_child = xfce_appfinder_category_model_iter_has_child;
+ iface->iter_n_children = xfce_appfinder_category_model_iter_n_children;
+ iface->iter_nth_child = xfce_appfinder_category_model_iter_nth_child;
+ iface->iter_parent = xfce_appfinder_category_model_iter_parent;
+}
+
+
+
+static void
+xfce_appfinder_category_model_finalize (GObject *object)
+{
+ //XfceAppfinderCategoryModel *model = XFCE_APPFINDER_CATEGORY_MODEL (object);
+
+ (*G_OBJECT_CLASS (xfce_appfinder_category_model_parent_class)->finalize) (object);
+}
+
+
+
+static GtkTreeModelFlags
+xfce_appfinder_category_model_get_flags (GtkTreeModel *tree_model)
+{
+ return GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY;
+}
+
+
+
+static gint
+xfce_appfinder_category_model_get_n_columns (GtkTreeModel *tree_model)
+{
+ return XFCE_APPFINDER_CATEGORY_MODEL_N_COLUMNS;
+}
+
+
+
+static GType
+xfce_appfinder_category_model_get_column_type (GtkTreeModel *tree_model,
+ gint column)
+{
+ switch (column)
+ {
+ case XFCE_APPFINDER_CATEGORY_MODEL_COLUMN_NAME:
+ return G_TYPE_STRING;
+
+ case XFCE_APPFINDER_CATEGORY_MODEL_COLUMN_ICON:
+ return GDK_TYPE_PIXBUF;
+
+ default:
+ g_assert_not_reached ();
+ return G_TYPE_INVALID;
+ }
+}
+
+
+
+static gboolean
+xfce_appfinder_category_model_get_iter (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreePath *path)
+{
+ XfceAppfinderCategoryModel *model = XFCE_APPFINDER_CATEGORY_MODEL (tree_model);
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_CATEGORY_MODEL (model), FALSE);
+ g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
+
+ iter->stamp = model->stamp;
+ iter->user_data = g_slist_nth (model->items, gtk_tree_path_get_indices (path)[0]);
+
+ return (iter->user_data != NULL);
+}
+
+
+
+static GtkTreePath*
+xfce_appfinder_category_model_get_path (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ XfceAppfinderCategoryModel *model = XFCE_APPFINDER_CATEGORY_MODEL (tree_model);
+ gint idx;
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_CATEGORY_MODEL (model), NULL);
+ g_return_val_if_fail (iter->stamp == model->stamp, NULL);
+
+ /* determine the index of the iter */
+ idx = g_slist_position (model->items, iter->user_data);
+ if (G_UNLIKELY (idx < 0))
+ return NULL;
+
+ return gtk_tree_path_new_from_indices (idx, -1);
+}
+
+
+
+static void
+xfce_appfinder_category_model_get_value (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gint column,
+ GValue *value)
+{
+ XfceAppfinderCategoryModel *model = XFCE_APPFINDER_CATEGORY_MODEL (tree_model);
+ GarconMenuDirectory *directory;
+ GdkPixbuf *icon;
+
+ g_return_if_fail (XFCE_IS_APPFINDER_CATEGORY_MODEL (model));
+ g_return_if_fail (iter->stamp == model->stamp);
+
+ directory = ((GSList *) iter->user_data)->data;
+
+ switch (column)
+ {
+ case XFCE_APPFINDER_CATEGORY_MODEL_COLUMN_NAME:
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_static_string (value, garcon_menu_directory_get_name (directory));
+ break;
+
+ case XFCE_APPFINDER_CATEGORY_MODEL_COLUMN_ICON:
+ g_value_init (value, GDK_TYPE_PIXBUF);
+ icon = xfce_appfinder_model_load_pixbuf (garcon_menu_directory_get_icon_name (directory), 24);
+ g_value_take_object (value, icon);
+ break;
+
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+
+
+static gboolean
+xfce_appfinder_category_model_iter_next (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ g_return_val_if_fail (XFCE_IS_APPFINDER_CATEGORY_MODEL (tree_model), FALSE);
+ g_return_val_if_fail (iter->stamp == XFCE_APPFINDER_CATEGORY_MODEL (tree_model)->stamp, FALSE);
+
+ iter->user_data = g_slist_next (iter->user_data);
+ return (iter->user_data != NULL);
+}
+
+
+
+static gboolean
+xfce_appfinder_category_model_iter_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent)
+{
+ XfceAppfinderCategoryModel *model = XFCE_APPFINDER_CATEGORY_MODEL (tree_model);
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_CATEGORY_MODEL (model), FALSE);
+
+ if (G_LIKELY (parent == NULL && model->items != NULL))
+ {
+ iter->stamp = model->stamp;
+ iter->user_data = model->items;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+
+static gboolean
+xfce_appfinder_category_model_iter_has_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ return FALSE;
+}
+
+
+
+static gint
+xfce_appfinder_category_model_iter_n_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ XfceAppfinderCategoryModel *model = XFCE_APPFINDER_CATEGORY_MODEL (tree_model);
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_CATEGORY_MODEL (model), 0);
+
+ return (iter == NULL) ? g_slist_length (model->items) : 0;
+}
+
+
+
+static gboolean
+xfce_appfinder_category_model_iter_nth_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent,
+ gint n)
+{
+ XfceAppfinderCategoryModel *model = XFCE_APPFINDER_CATEGORY_MODEL (tree_model);
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_CATEGORY_MODEL (model), FALSE);
+
+ if (G_LIKELY (parent != NULL))
+ {
+ iter->stamp = model->stamp;
+ iter->user_data = g_slist_nth (model->items, n);
+ return (iter->user_data != NULL);
+ }
+
+ return FALSE;
+}
+
+
+
+static gboolean
+xfce_appfinder_category_model_iter_parent (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *child)
+{
+ return FALSE;
+}
+
+
+
+XfceAppfinderCategoryModel *
+xfce_appfinder_category_model_new (void)
+{
+ return g_object_new (XFCE_TYPE_APPFINDER_CATEGORY_MODEL, NULL);
+}
+
+
+
+gboolean
+xfce_appfinder_category_model_row_separator_func (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ return ((GSList *) iter->user_data)->data == NULL;
+}
diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-category-model.h b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-category-model.h
new file mode 100644
index 0000000..1f8d719
--- /dev/null
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-category-model.h
@@ -0,0 +1,39 @@
+#ifndef __XFCE_APPFINDER_CATEGORY_MODEL_H__
+#define __XFCE_APPFINDER_CATEGORY_MODEL_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef struct _XfceAppfinderCategoryModelClass XfceAppfinderCategoryModelClass;
+typedef struct _XfceAppfinderCategoryModel XfceAppfinderCategoryModel;
+
+#define XFCE_TYPE_APPFINDER_CATEGORY_MODEL (xfce_appfinder_category_model_get_type ())
+#define XFCE_APPFINDER_CATEGORY_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFCE_TYPE_APPFINDER_CATEGORY_MODEL, XfceAppfinderCategoryModel))
+#define XFCE_APPFINDER_CATEGORY_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), XFCE_TYPE_APPFINDER_CATEGORY_MODEL, XfceAppfinderCategoryModelClass))
+#define XFCE_IS_APPFINDER_CATEGORY_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFCE_TYPE_APPFINDER_CATEGORY_MODEL))
+#define XFCE_IS_APPFINDER_CATEGORY_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XFCE_TYPE_APPFINDER_CATEGORY_MODEL))
+#define XFCE_APPFINDER_CATEGORY_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), XFCE_TYPE_APPFINDER_CATEGORY_MODEL, XfceAppfinderCategoryModelClass))
+
+
+
+enum
+{
+ XFCE_APPFINDER_CATEGORY_MODEL_COLUMN_NAME,
+ XFCE_APPFINDER_CATEGORY_MODEL_COLUMN_ICON,
+ XFCE_APPFINDER_CATEGORY_MODEL_N_COLUMNS,
+};
+
+
+
+GType xfce_appfinder_category_model_get_type (void) G_GNUC_CONST;
+
+XfceAppfinderCategoryModel *xfce_appfinder_category_model_new (void) G_GNUC_MALLOC;
+
+gboolean xfce_appfinder_category_model_row_separator_func (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gpointer user_data);
+
+G_END_DECLS
+
+#endif /* !__XFCE_APPFINDER_CATEGORY_MODEL_H__ */
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
new file mode 100644
index 0000000..aa3e89d
--- /dev/null
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.c
@@ -0,0 +1,588 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <memory.h>
+#include <string.h>
+#include <libxfce4util/libxfce4util.h>
+#include <garcon/garcon.h>
+
+#include "appfinder-model.h"
+
+
+
+static void xfce_appfinder_model_tree_model_init (GtkTreeModelIface *iface);
+static void xfce_appfinder_model_finalize (GObject *object);
+static GtkTreeModelFlags xfce_appfinder_model_get_flags (GtkTreeModel *tree_model);
+static gint xfce_appfinder_model_get_n_columns (GtkTreeModel *tree_model);
+static GType xfce_appfinder_model_get_column_type (GtkTreeModel *tree_model,
+ gint column);
+static gboolean xfce_appfinder_model_get_iter (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreePath *path);
+static GtkTreePath *xfce_appfinder_model_get_path (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
+static void xfce_appfinder_model_get_value (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gint column,
+ GValue *value);
+static gboolean xfce_appfinder_model_iter_next (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
+static gboolean xfce_appfinder_model_iter_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent);
+static gboolean xfce_appfinder_model_iter_has_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
+static gint xfce_appfinder_model_iter_n_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
+static gboolean xfce_appfinder_model_iter_nth_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent,
+ gint n);
+static gboolean xfce_appfinder_model_iter_parent (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *child);
+static gpointer xfce_appfinder_model_collect_thread (gpointer user_data);
+static void xfce_appfinder_model_item_free (gpointer data);
+
+
+
+struct _XfceAppfinderModelClass
+{
+ GObjectClass __parent__;
+};
+
+struct _XfceAppfinderModel
+{
+ GObject __parent__;
+ gint stamp;
+
+ GSList *items;
+ GarconMenu *menu;
+
+ gint collect_idle_id;
+ GSList *collect_items;
+ GThread *collect_thread;
+ volatile gboolean collect_cancelled;
+};
+
+typedef struct
+{
+ GarconMenuItem *item;
+ GdkPixbuf *pixbuf;
+ gchar *key;
+ gchar *abstract;
+}
+ModelItem;
+
+
+
+G_DEFINE_TYPE_WITH_CODE (XfceAppfinderModel, xfce_appfinder_model, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, xfce_appfinder_model_tree_model_init))
+
+
+
+static void
+xfce_appfinder_model_class_init (XfceAppfinderModelClass *klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = xfce_appfinder_model_finalize;
+}
+
+
+
+static void
+xfce_appfinder_model_init (XfceAppfinderModel *model)
+{
+ /* generate a unique stamp */
+ model->stamp = g_random_int ();
+
+ model->menu = garcon_menu_new_applications ();
+ model->collect_thread = g_thread_create_full (xfce_appfinder_model_collect_thread, model,
+ 0, TRUE, FALSE, G_THREAD_PRIORITY_LOW, NULL);
+}
+
+
+
+static void
+xfce_appfinder_model_tree_model_init (GtkTreeModelIface *iface)
+{
+ iface->get_flags = xfce_appfinder_model_get_flags;
+ iface->get_n_columns = xfce_appfinder_model_get_n_columns;
+ iface->get_column_type = xfce_appfinder_model_get_column_type;
+ iface->get_iter = xfce_appfinder_model_get_iter;
+ iface->get_path = xfce_appfinder_model_get_path;
+ iface->get_value = xfce_appfinder_model_get_value;
+ iface->iter_next = xfce_appfinder_model_iter_next;
+ iface->iter_children = xfce_appfinder_model_iter_children;
+ iface->iter_has_child = xfce_appfinder_model_iter_has_child;
+ iface->iter_n_children = xfce_appfinder_model_iter_n_children;
+ iface->iter_nth_child = xfce_appfinder_model_iter_nth_child;
+ iface->iter_parent = xfce_appfinder_model_iter_parent;
+}
+
+
+
+static void
+xfce_appfinder_model_finalize (GObject *object)
+{
+ XfceAppfinderModel *model = XFCE_APPFINDER_MODEL (object);
+
+ g_object_unref (G_OBJECT (model->menu));
+
+ g_slist_foreach (model->items, (GFunc) xfce_appfinder_model_item_free, NULL);
+ g_slist_free (model->items);
+
+ (*G_OBJECT_CLASS (xfce_appfinder_model_parent_class)->finalize) (object);
+}
+
+
+
+static GtkTreeModelFlags
+xfce_appfinder_model_get_flags (GtkTreeModel *tree_model)
+{
+ return GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY;
+}
+
+
+
+static gint
+xfce_appfinder_model_get_n_columns (GtkTreeModel *tree_model)
+{
+ return XFCE_APPFINDER_MODEL_N_COLUMNS;
+}
+
+
+
+static GType
+xfce_appfinder_model_get_column_type (GtkTreeModel *tree_model,
+ gint column)
+{
+ switch (column)
+ {
+ case XFCE_APPFINDER_MODEL_COLUMN_ABSTRACT:
+ case XFCE_APPFINDER_MODEL_COLUMN_KEY:
+ case XFCE_APPFINDER_MODEL_COLUMN_ICON_NAME:
+ return G_TYPE_STRING;
+
+ case XFCE_APPFINDER_MODEL_COLUMN_ICON:
+ return GDK_TYPE_PIXBUF;
+
+ default:
+ g_assert_not_reached ();
+ return G_TYPE_INVALID;
+ }
+}
+
+
+
+static gboolean
+xfce_appfinder_model_get_iter (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreePath *path)
+{
+ XfceAppfinderModel *model = XFCE_APPFINDER_MODEL (tree_model);
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_MODEL (model), FALSE);
+ g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
+
+ iter->stamp = model->stamp;
+ iter->user_data = g_slist_nth (model->items, gtk_tree_path_get_indices (path)[0]);
+
+ return (iter->user_data != NULL);
+}
+
+
+
+static GtkTreePath*
+xfce_appfinder_model_get_path (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ XfceAppfinderModel *model = XFCE_APPFINDER_MODEL (tree_model);
+ gint idx;
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_MODEL (model), NULL);
+ g_return_val_if_fail (iter->stamp == model->stamp, NULL);
+
+ /* determine the index of the iter */
+ idx = g_slist_position (model->items, iter->user_data);
+ if (G_UNLIKELY (idx < 0))
+ return NULL;
+
+ return gtk_tree_path_new_from_indices (idx, -1);
+}
+
+
+
+static void
+xfce_appfinder_model_get_value (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gint column,
+ GValue *value)
+{
+ XfceAppfinderModel *model = XFCE_APPFINDER_MODEL (tree_model);
+ ModelItem *item;
+ const gchar *name, *comment;
+
+ g_return_if_fail (XFCE_IS_APPFINDER_MODEL (model));
+ g_return_if_fail (iter->stamp == model->stamp);
+
+ item = ((GSList *) iter->user_data)->data;
+ g_return_if_fail (item->item == NULL || GARCON_IS_MENU_ITEM (item->item));
+
+ switch (column)
+ {
+ case XFCE_APPFINDER_MODEL_COLUMN_ABSTRACT:
+ if (item->abstract == NULL
+ && item->item != NULL)
+ {
+ name = garcon_menu_item_get_name (item->item);
+ comment = garcon_menu_item_get_comment (item->item);
+
+ if (comment != NULL)
+ item->abstract = g_markup_printf_escaped ("<b>%s</b>\n%s", name, comment);
+ else
+ item->abstract = g_markup_printf_escaped ("<b>%s</b>", name);
+ }
+
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_static_string (value, item->abstract);
+ break;
+
+ case XFCE_APPFINDER_MODEL_COLUMN_ICON:
+ if (item->pixbuf == NULL
+ && item->item != NULL)
+ item->pixbuf = xfce_appfinder_model_load_pixbuf (garcon_menu_item_get_icon_name (item->item), 32);
+
+ g_value_init (value, GDK_TYPE_PIXBUF);
+ g_value_set_object (value, item->pixbuf);
+ break;
+
+ case XFCE_APPFINDER_MODEL_COLUMN_KEY:
+ if (item->key == NULL
+ && item->item)
+ {
+ name = garcon_menu_item_get_name (item->item);
+ item->key = g_utf8_normalize (name, -1, G_NORMALIZE_ALL);
+ }
+
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_static_string (value, item->key);
+ break;
+
+ case XFCE_APPFINDER_MODEL_COLUMN_ICON_NAME:
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_static_string (value, garcon_menu_item_get_icon_name (item->item));
+ break;
+
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+
+
+static gboolean
+xfce_appfinder_model_iter_next (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ g_return_val_if_fail (XFCE_IS_APPFINDER_MODEL (tree_model), FALSE);
+ g_return_val_if_fail (iter->stamp == XFCE_APPFINDER_MODEL (tree_model)->stamp, FALSE);
+
+ iter->user_data = g_slist_next (iter->user_data);
+ return (iter->user_data != NULL);
+}
+
+
+
+static gboolean
+xfce_appfinder_model_iter_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent)
+{
+ XfceAppfinderModel *model = XFCE_APPFINDER_MODEL (tree_model);
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_MODEL (model), FALSE);
+
+ if (G_LIKELY (parent == NULL && model->items != NULL))
+ {
+ iter->stamp = model->stamp;
+ iter->user_data = model->items;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+
+static gboolean
+xfce_appfinder_model_iter_has_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ return FALSE;
+}
+
+
+
+static gint
+xfce_appfinder_model_iter_n_children (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ XfceAppfinderModel *model = XFCE_APPFINDER_MODEL (tree_model);
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_MODEL (model), 0);
+
+ return (iter == NULL) ? g_slist_length (model->items) : 0;
+}
+
+
+
+static gboolean
+xfce_appfinder_model_iter_nth_child (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent,
+ gint n)
+{
+ XfceAppfinderModel *model = XFCE_APPFINDER_MODEL (tree_model);
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_MODEL (model), FALSE);
+
+ if (G_LIKELY (parent != NULL))
+ {
+ iter->stamp = model->stamp;
+ iter->user_data = g_slist_nth (model->items, n);
+ return (iter->user_data != NULL);
+ }
+
+ return FALSE;
+}
+
+
+
+static gboolean
+xfce_appfinder_model_iter_parent (GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ GtkTreeIter *child)
+{
+ return FALSE;
+}
+
+
+
+static gboolean
+xfce_appfinder_model_collect_idle (gpointer user_data)
+{
+ XfceAppfinderModel *model = XFCE_APPFINDER_MODEL (user_data);
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ GSList *li, *lnext;
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_MODEL (model), FALSE);
+ g_return_val_if_fail (model->items == NULL, FALSE);
+
+ g_message ("insert idle start");
+
+ GDK_THREADS_ENTER ();
+
+ /* move the collected items "online" */
+ model->items = model->collect_items;
+ model->collect_items = NULL;
+
+ /* emit notifications for all new items */
+ path = gtk_tree_path_new_first ();
+ for (li = model->items; li != NULL; li = li->next)
+ {
+ /* remember the next item */
+ lnext = li->next;
+ li->next = NULL;
+
+ /* generate the iterator */
+ iter.stamp = model->stamp;
+ iter.user_data = li;
+
+ /* emit the "row-inserted" signal */
+ gtk_tree_model_row_inserted (GTK_TREE_MODEL (model), path, &iter);
+
+ /* advance the path */
+ gtk_tree_path_next (path);
+
+ /* reset the next item */
+ li->next = lnext;
+ }
+ gtk_tree_path_free (path);
+
+ GDK_THREADS_LEAVE ();
+
+ g_message ("insert idle end");
+
+ return FALSE;
+}
+
+
+
+static void
+xfce_appfinder_model_collect_idle_destroy (gpointer user_data)
+{
+ XFCE_APPFINDER_MODEL (user_data)->collect_idle_id = 0;
+}
+
+
+
+static gint
+xfce_appfinder_model_item_compare (gconstpointer a,
+ gconstpointer b)
+{
+ const ModelItem *item_a = a;
+ const ModelItem *item_b = b;
+
+ g_return_val_if_fail (GARCON_IS_MENU_ITEM (item_a->item), 0);
+ g_return_val_if_fail (GARCON_IS_MENU_ITEM (item_b->item), 0);
+
+ return g_utf8_collate (garcon_menu_item_get_name (item_a->item),
+ garcon_menu_item_get_name (item_b->item));
+}
+
+
+
+static void
+xfce_appfinder_model_item_free (gpointer data)
+{
+ ModelItem *item = data;
+
+ if (item->pixbuf != NULL)
+ g_object_unref (G_OBJECT (item->pixbuf));
+ g_free (item->abstract);
+ g_free (item->key);
+ g_slice_free (ModelItem, item);
+}
+
+
+
+static void
+xfce_appfinder_model_collect_items (XfceAppfinderModel *model,
+ GarconMenu *menu)
+{
+ GList *elements, *li;
+ GarconMenuDirectory *directory;
+ ModelItem *item;
+
+ /* collect all the elements in this menu and its sub menus */
+ elements = garcon_menu_get_elements (menu);
+ for (li = elements; li != NULL && !model->collect_cancelled; li = li->next)
+ {
+ if (GARCON_IS_MENU_ITEM (li->data))
+ {
+ if (!garcon_menu_element_get_visible (li->data))
+ continue;
+
+ item = g_slice_new0 (ModelItem);
+ item->item = li->data;
+
+ model->collect_items = g_slist_prepend (model->collect_items, item);
+ }
+ else if (GARCON_IS_MENU (li->data))
+ {
+ directory = garcon_menu_get_directory (li->data);
+ if (directory != NULL && garcon_menu_directory_get_visible (directory))
+ xfce_appfinder_model_collect_items (model, li->data);
+ }
+ }
+ g_list_free (elements);
+}
+
+
+
+static gpointer
+xfce_appfinder_model_collect_thread (gpointer user_data)
+{
+ XfceAppfinderModel *model = XFCE_APPFINDER_MODEL (user_data);
+ GError *error = NULL;
+ GList *menus, *li;
+
+ g_return_val_if_fail (GARCON_IS_MENU (model->menu), NULL);
+ g_return_val_if_fail (model->collect_items == NULL, NULL);
+
+ g_message ("collect thread start");
+
+ if (G_LIKELY (model->menu != NULL))
+ {
+ if (garcon_menu_load (model->menu, NULL, &error))
+ {
+ menus = garcon_menu_get_menus (model->menu);
+ for (li = menus; li != NULL && !model->collect_cancelled; li = li->next)
+ xfce_appfinder_model_collect_items (model, li->data);
+ g_list_free (menus);
+ }
+ else
+ {
+ g_warning ("Failed to load the root menu: %s", error->message);
+ g_error_free (error);
+ }
+ }
+
+ if (model->collect_items != NULL
+ && !model->collect_cancelled)
+ {
+ model->collect_items = g_slist_sort (model->collect_items, xfce_appfinder_model_item_compare);
+ model->collect_idle_id = g_idle_add_full (G_PRIORITY_LOW, xfce_appfinder_model_collect_idle,
+ model, xfce_appfinder_model_collect_idle_destroy);
+ }
+
+ g_message ("collect thread end");
+
+ return NULL;
+}
+
+
+
+XfceAppfinderModel *
+xfce_appfinder_model_new (void)
+{
+ return g_object_new (XFCE_TYPE_APPFINDER_MODEL, NULL);
+}
+
+
+
+GdkPixbuf *
+xfce_appfinder_model_load_pixbuf (const gchar *icon_name,
+ gint size)
+{
+ GdkPixbuf *pixbuf = NULL;
+ GdkPixbuf *scaled;
+
+ if (icon_name != NULL)
+ {
+ if (g_path_is_absolute (icon_name))
+ {
+ pixbuf = gdk_pixbuf_new_from_file_at_scale (icon_name, size,
+ size, TRUE, NULL);
+ }
+ else
+ {
+ pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+ icon_name, size, 0, NULL);
+ }
+ }
+
+ if (G_UNLIKELY (pixbuf == NULL))
+ {
+ pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+ "applications-other",
+ size, 0, NULL);
+ }
+
+ if (pixbuf != NULL
+ && (gdk_pixbuf_get_width (pixbuf) > size
+ || gdk_pixbuf_get_height (pixbuf) > size))
+ {
+ scaled = gdk_pixbuf_scale_simple (pixbuf, size, size, GDK_INTERP_BILINEAR);
+ g_object_unref (G_OBJECT (pixbuf));
+ pixbuf = scaled;
+ }
+
+ return pixbuf;
+}
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
new file mode 100644
index 0000000..c3eeb5b
--- /dev/null
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/appfinder-model.h
@@ -0,0 +1,40 @@
+#ifndef __XFCE_APPFINDER_MODEL_H__
+#define __XFCE_APPFINDER_MODEL_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef struct _XfceAppfinderModelClass XfceAppfinderModelClass;
+typedef struct _XfceAppfinderModel XfceAppfinderModel;
+
+#define XFCE_TYPE_APPFINDER_MODEL (xfce_appfinder_model_get_type ())
+#define XFCE_APPFINDER_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFCE_TYPE_APPFINDER_MODEL, XfceAppfinderModel))
+#define XFCE_APPFINDER_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), XFCE_TYPE_APPFINDER_MODEL, XfceAppfinderModelClass))
+#define XFCE_IS_APPFINDER_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFCE_TYPE_APPFINDER_MODEL))
+#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))
+
+
+
+enum
+{
+ XFCE_APPFINDER_MODEL_COLUMN_ABSTRACT,
+ XFCE_APPFINDER_MODEL_COLUMN_ICON,
+ XFCE_APPFINDER_MODEL_COLUMN_KEY,
+ XFCE_APPFINDER_MODEL_COLUMN_ICON_NAME,
+ XFCE_APPFINDER_MODEL_N_COLUMNS,
+};
+
+
+
+GType xfce_appfinder_model_get_type (void) G_GNUC_CONST;
+
+XfceAppfinderModel *xfce_appfinder_model_new (void) G_GNUC_MALLOC;
+
+GdkPixbuf *xfce_appfinder_model_load_pixbuf (const gchar *icon_name,
+ gint size) G_GNUC_MALLOC;
+
+G_END_DECLS
+
+#endif /* !__XFCE_APPFINDER_MODEL_H__ */
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 1ad6fd8..7c67222 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
@@ -6,19 +6,23 @@
#include <libxfce4util/libxfce4util.h>
#include "appfinder-window.h"
+#include "appfinder-model.h"
+#include "appfinder-category-model.h"
-static void xfce_appfinder_window_finalize (GObject *object);
-static void xfce_appfinder_window_set_padding (GtkWidget *entry,
- GtkWidget *align);
+static void xfce_appfinder_window_finalize (GObject *object);
+static void xfce_appfinder_window_set_padding (GtkWidget *entry,
+ GtkWidget *align);
static GtkWidget *xfce_appfinder_window_buttonbox (void);
-static void xfce_appfinder_window_entry_icon_released (GtkEntry *entry,
- GtkEntryIconPosition icon_pos,
- GdkEvent *event,
- XfceAppfinderWindow *window);
-
-
+static void xfce_appfinder_window_entry_icon_released (GtkEntry *entry,
+ GtkEntryIconPosition icon_pos,
+ GdkEvent *event,
+ XfceAppfinderWindow *window);
+static gboolean xfce_appfinder_window_match_selected (GtkEntryCompletion *widget,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ XfceAppfinderWindow *window);
struct _XfceAppfinderWindowClass
{
@@ -29,11 +33,16 @@ struct _XfceAppfinderWindow
{
GtkWindow __parent__;
+ XfceAppfinderModel *model;
+
+ XfceAppfinderCategoryModel *category_model;
+
GtkWidget *paned;
GtkWidget *entry;
GtkWidget *vbox;
GtkWidget *bbox1;
GtkWidget *bbox2;
+ GtkWidget *image;
};
@@ -65,8 +74,12 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
GtkWidget *image;
GtkWidget *hbox;
GtkWidget *align;
- /*GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;*/
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
+ GtkEntryCompletion *completion;
+
+ window->model = xfce_appfinder_model_new ();
+ window->category_model = xfce_appfinder_category_model_new ();
gtk_window_set_title (GTK_WINDOW (window), _("Application Finder"));
gtk_window_set_default_size (GTK_WINDOW (window), 400 /* todo, remember */, -1);
@@ -86,7 +99,7 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
gtk_box_pack_start (GTK_BOX (hbox), align, FALSE, FALSE, 0);
gtk_widget_show (align);
- image = gtk_image_new_from_icon_name ("preferences-desktop-theme", GTK_ICON_SIZE_DIALOG);
+ window->image = image = gtk_image_new_from_icon_name ("preferences-desktop-theme", GTK_ICON_SIZE_DIALOG);
gtk_container_add (GTK_CONTAINER (align), image);
gtk_widget_show (image);
@@ -104,6 +117,17 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
g_signal_connect (G_OBJECT (entry), "realize", G_CALLBACK (xfce_appfinder_window_set_padding), align);
gtk_widget_show (entry);
+ completion = gtk_entry_completion_new ();
+ gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (window->model));
+ /*gtk_entry_completion_set_match_func (completion, xfce_appfinder_window_match_func, window, NULL);*/
+ gtk_entry_completion_set_text_column (completion, XFCE_APPFINDER_MODEL_COLUMN_KEY);
+ gtk_entry_completion_set_popup_completion (completion, TRUE);
+ gtk_entry_completion_set_popup_single_match (completion, FALSE);
+ gtk_entry_completion_set_inline_completion (completion, TRUE);
+ gtk_entry_set_completion (GTK_ENTRY (window->entry), completion);
+ g_signal_connect (G_OBJECT (completion), "match-selected", G_CALLBACK (xfce_appfinder_window_match_selected), window);
+ g_object_unref (G_OBJECT (completion));
+
window->bbox1 = xfce_appfinder_window_buttonbox ();
gtk_box_pack_start (GTK_BOX (vbox2), window->bbox1, FALSE, TRUE, 0);
@@ -117,10 +141,10 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
gtk_widget_show (scroll);
- sidepane = gtk_tree_view_new ();
+ sidepane = gtk_tree_view_new_with_model (GTK_TREE_MODEL (window->category_model));
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (sidepane), FALSE);
- /*gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (sidepane),
- xfce_appfinder_model_row_separator_func, NULL, NULL);*/
+ gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (sidepane),
+ xfce_appfinder_category_model_row_separator_func, NULL, NULL);
gtk_container_add (GTK_CONTAINER (scroll), sidepane);
gtk_widget_show (sidepane);
@@ -128,19 +152,19 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
g_signal_connect_swapped (G_OBJECT (selection), "changed",
G_CALLBACK (xfce_appfinder_window_category_changed), window);*/
- /* column = gtk_tree_view_column_new ();
+ column = gtk_tree_view_column_new ();
gtk_tree_view_append_column (GTK_TREE_VIEW (sidepane), GTK_TREE_VIEW_COLUMN (column));
renderer = gtk_cell_renderer_pixbuf_new ();
gtk_tree_view_column_pack_start (GTK_TREE_VIEW_COLUMN (column), renderer, FALSE);
gtk_tree_view_column_set_attributes (GTK_TREE_VIEW_COLUMN (column), renderer,
- "pixbuf", XFCE_APPFINDER_MODEL_COLUMN_ICON, NULL);
+ "pixbuf", XFCE_APPFINDER_CATEGORY_MODEL_COLUMN_ICON, NULL);
renderer = gtk_cell_renderer_text_new ();
g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
gtk_tree_view_column_pack_start (GTK_TREE_VIEW_COLUMN (column), renderer, TRUE);
gtk_tree_view_column_set_attributes (GTK_TREE_VIEW_COLUMN (column), renderer,
- "text", XFCE_APPFINDER_MODEL_COLUMN_NAME, NULL); */
+ "text", XFCE_APPFINDER_CATEGORY_MODEL_COLUMN_NAME, NULL);
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_paned_add2 (GTK_PANED (pane), scroll);
@@ -148,23 +172,25 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
gtk_widget_show (scroll);
- treeview = gtk_tree_view_new ();
+ treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (window->model));
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
/* gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), XFCE_RUN_MODEL_COLUMN_TOOLTIP); */
gtk_container_add (GTK_CONTAINER (scroll), treeview);
gtk_widget_show (treeview);
- /*renderer = gtk_cell_renderer_pixbuf_new ();
+ renderer = gtk_cell_renderer_pixbuf_new ();
column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "pixbuf", XFCE_APPFINDER_MODEL_COLUMN_ICON, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), GTK_TREE_VIEW_COLUMN (column));
renderer = gtk_cell_renderer_text_new ();
g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
- column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "markup", XFCE_APPFINDER_MODEL_COLUMN_NAME, NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), GTK_TREE_VIEW_COLUMN (column));*/
+ column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "markup", XFCE_APPFINDER_MODEL_COLUMN_ABSTRACT, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), GTK_TREE_VIEW_COLUMN (column));
window->bbox2 = xfce_appfinder_window_buttonbox ();
gtk_box_pack_start (GTK_BOX (vbox), window->bbox2, FALSE, TRUE, 0);
+
+ g_message ("constructed window");
}
@@ -172,7 +198,10 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
static void
xfce_appfinder_window_finalize (GObject *object)
{
- //XfceAppfinderWindow *window = XFCE_APPFINDER_WINDOW (object);
+ XfceAppfinderWindow *window = XFCE_APPFINDER_WINDOW (object);
+
+ g_object_unref (G_OBJECT (window->model));
+ g_object_unref (G_OBJECT (window->category_model));
(*G_OBJECT_CLASS (xfce_appfinder_window_parent_class)->finalize) (object);
}
@@ -189,6 +218,8 @@ xfce_appfinder_window_set_padding (GtkWidget *entry,
gtk_alignment_set_padding (GTK_ALIGNMENT (align), MAX (0, padding), 0, 0, 0);
}
+
+
static GtkWidget *
xfce_appfinder_window_buttonbox (void)
{
@@ -231,6 +262,34 @@ xfce_appfinder_window_entry_icon_released (GtkEntry *entry,
+static gboolean
+xfce_appfinder_window_match_selected (GtkEntryCompletion *widget,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ XfceAppfinderWindow *window)
+{
+ gchar *icon_name;
+ GdkPixbuf *pixbuf;
+
+ gtk_tree_model_get (model, iter, XFCE_APPFINDER_MODEL_COLUMN_ICON_NAME, &icon_name, -1);
+ pixbuf = xfce_appfinder_model_load_pixbuf (icon_name, 48);
+ g_free (icon_name);
+
+ if (G_LIKELY (pixbuf != NULL))
+ {
+ gtk_image_set_from_pixbuf (GTK_IMAGE (window->image), pixbuf);
+ g_object_unref (G_OBJECT (pixbuf));
+ }
+ else
+ {
+ gtk_image_clear (GTK_IMAGE (window->image));
+ }
+
+ return FALSE;
+}
+
+
+
GtkWidget *
xfce_appfinder_window_new (void)
{
diff --git a/xfce4-appfinder/merge-with-xfrun/demo-code/c/main.c b/xfce4-appfinder/merge-with-xfrun/demo-code/c/main.c
index b603826..f847999 100644
--- a/xfce4-appfinder/merge-with-xfrun/demo-code/c/main.c
+++ b/xfce4-appfinder/merge-with-xfrun/demo-code/c/main.c
@@ -74,6 +74,8 @@ main (gint argc, gchar **argv)
xfce_appfinder_window_set_expanded (XFCE_APPFINDER_WINDOW (window), opt_finder);
gtk_widget_show (window);
+ g_message ("enter mainloop");
+
gtk_main ();
return EXIT_SUCCESS;
More information about the Xfce4-commits
mailing list