[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