[gnome-launch-box] properly replace the application module with tracker



commit 93a4c3aa3aaacfd7113684f3c1f0da523276d0d2
Author: Sven Herzberg <herzi gnome-de org>
Date:   Sun Feb 7 23:57:43 2010 +0100

    properly replace the application module with tracker
    
    * configure.ac: be able to disable tracker; use tracker only if it's
      there
    * src/Makefile.am,
    * src/lb-module-manager.c: conditionally include the new tracker module
      instead of the application module
    * src/lb-module-tracker.c: become a drop-in replacement for the
      application module

 configure.ac            |   12 ++++++++
 src/Makefile.am         |   22 +++++++++-----
 src/lb-module-manager.c |   17 ++++++++---
 src/lb-module-tracker.c |   71 ++++++++++++++++++++++++++++++++--------------
 4 files changed, 87 insertions(+), 35 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 896314a..b6a6e28 100644
--- a/configure.ac
+++ b/configure.ac
@@ -43,6 +43,17 @@ AM_GLIB_GNU_GETTEXT
 
 dnl -----------------------------------------------------------
 
+AC_MSG_CHECKING([whether to use tracker for application search])
+AC_ARG_ENABLE([tracker], AS_HELP_STRING([--disable-tracker],[disable tracker (default: enable if available]))
+if test -z "$enable_tracker" || test "$enable_tracker" != "no"; then
+	PKG_CHECK_EXISTS(tracker-client-0.7,
+			 [tracker_client="tracker-client-0.7 gio-unix-2.0"
+			  AC_MSG_RESULT([yes (0.7 found)])
+			  AC_DEFINE_UNQUOTED([HAVE_TRACKER],[1],[specify whether we can use tracker])],
+			 [AC_MSG_RESULT([no])])
+fi
+AM_CONDITIONAL([HAVE_TRACKER],[test -n "$tracker_client"])
+
 PKG_CHECK_MODULES(LB,[
 	glib-2.0 >= 2.14
 	gtk+-2.0 >= 2.10
@@ -52,6 +63,7 @@ PKG_CHECK_MODULES(LB,[
 	gnome-desktop-2.0 >= 2.10
 	libebook-1.2 >= 1.8
 	gconf-2.0
+	$tracker_client
 ])
 
 AC_MSG_CHECKING([whether the GNOME control-center uses custom keybindings])
diff --git a/src/Makefile.am b/src/Makefile.am
index 71799ad..e3017cd 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -26,24 +26,20 @@ gnome_launch_box_SOURCES = \
 	lb-item-dummy.h                 \
 	lb-item-file.c			\
 	lb-item-file.h			\
-	lb-module.c			\
-	lb-module.h			\
-	lb-module-bookmarks.c		\
-	lb-module-bookmarks.h		\
+	lb-module.c \
+	lb-module.h \
+	lb-module-bookmarks.c \
+	lb-module-bookmarks.h \
 	lb-module-manager.c		\
 	lb-module-manager.h		\
 	lb-module-dummy.c		\
 	lb-module-dummy.h		\
-	lb-module-applications.c	\
-	lb-module-applications.h	\
 	lb-module-evolution.c           \
 	lb-module-evolution.h		\
 	lb-module-files.c	        \
 	lb-module-files.h               \
 	lb-module-recent.c \
 	lb-module-recent.h \
-	lb-module-tracker.c \
-	lb-module-tracker.h \
 	lb-object.c \
 	lb-object.h \
 	lb-private.h                    \
@@ -60,6 +56,16 @@ gnome_launch_box_SOURCES = \
 	tomboykeybinder.c		\
 	tomboykeybinder.h
 
+if HAVE_TRACKER
+gnome_launch_box_SOURCES+=\
+	lb-module-tracker.c \
+	lb-module-tracker.h
+else
+gnome_launch_box_SOURCES+=\
+	lb-module-applications.c \
+	lb-module-applications.h
+endif
+
 gnome_launch_box_LDADD = @LB_LIBS@
 
 lb-marshal.h: lb-marshal.list
diff --git a/src/lb-module-manager.c b/src/lb-module-manager.c
index 5eccd71..30e7fd2 100644
--- a/src/lb-module-manager.c
+++ b/src/lb-module-manager.c
@@ -28,15 +28,19 @@
 
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
-#include "lb-module-applications.h"
 #include "lb-module-bookmarks.h"
 #include "lb-module-evolution.h"
 #include "lb-module-manager.h"
 #include "lb-module-recent.h"
 #include "lb-module-files.h"
-#include "lb-module-tracker.h"
 #include "lb-utils.h"
 
+#ifdef HAVE_TRACKER
+#include "lb-module-tracker.h"
+#else
+#include "lb-module-applications.h"
+#endif
+
 static void    lb_module_manager_finalize     (GObject              *object);
 static void    lb_module_manager_set_property (GObject              *object,
 					       guint                 property_id,
@@ -75,9 +79,15 @@ lb_module_manager_class_init (LbModuleManagerClass *klass)
 static void
 lb_module_manager_init (LbModuleManager *manager)
 {
+#ifdef HAVE_TRACKER
+	manager->modules = g_list_append (manager->modules,
+					  g_object_new (LB_TYPE_MODULE_TRACKER,
+							NULL));
+#else
 	manager->modules = g_list_append (manager->modules,
 					  g_object_new (LB_TYPE_MODULE_APPLICATIONS,
 							NULL));
+#endif
 	manager->modules = g_list_append (manager->modules,
 					  g_object_new (LB_TYPE_MODULE_RECENT,
 							NULL));
@@ -90,9 +100,6 @@ lb_module_manager_init (LbModuleManager *manager)
 	manager->modules = g_list_append (manager->modules,
 					  g_object_new (LB_TYPE_MODULE_FILES,
 							NULL));
-	manager->modules = g_list_append (manager->modules,
-					  g_object_new (LB_TYPE_MODULE_TRACKER,
-							NULL));
 }
 
 static void
diff --git a/src/lb-module-tracker.c b/src/lb-module-tracker.c
index 5aa38d9..920579b 100644
--- a/src/lb-module-tracker.c
+++ b/src/lb-module-tracker.c
@@ -25,16 +25,20 @@
 #include "config.h"
 
 #include <string.h>
-
+#include <gio/gdesktopappinfo.h>
+#include <libtracker-client/tracker.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
+#include "lb-item-application.h"
 #include "lb-module-tracker.h"
 
 #define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), LB_TYPE_MODULE_TRACKER, LbModuleTrackerPriv))
 
 typedef struct _LbModuleTrackerPriv LbModuleTrackerPriv;
-struct _LbModuleTrackerPriv {
-	gint placeholder; /* Remove this, can't have empty struct */
+
+struct _LbModuleTrackerPriv
+{
+  TrackerClient* client;
 };
 
 #if 0
@@ -108,9 +112,11 @@ lb_module_tracker_class_init (LbModuleTrackerClass *klass)
 static void
 lb_module_tracker_init (LbModuleTracker *tracker)
 {
-	LbModuleTrackerPriv *priv;
+  LbModuleTrackerPriv *priv;
+
+  priv = GET_PRIV (tracker);
 
-	priv = GET_PRIV (tracker);
+  priv->client = tracker_client_new (0, -1);
 }
 
 static void
@@ -211,6 +217,11 @@ lb_module_tracker_query (LbModule    *module,
           NULL,
           NULL
   };
+  enum
+    {
+      URN, TITLE, COMMENT, COMMANDLINE
+    };
+  GList* list = NULL;
   gchar* sparql = g_strdup_printf ("SELECT ?urn ?title ?tooltip ?link fts:rank(?urn) "
                                    "WHERE { ?urn a nfo:Software ;"
                                    " nie:title ?title ;"
@@ -219,34 +230,50 @@ lb_module_tracker_query (LbModule    *module,
                                    " } "
                                    "ORDER BY DESC(fts:rank(?urn)) "
                                    "OFFSET 0 LIMIT 10", match);
-  gchar* out = NULL;
-  gint   exit = -1;
+  GPtrArray* result;
   GError* error = NULL;
 
   priv = GET_PRIV (module);
 
   argv[G_N_ELEMENTS (argv) - 2] = sparql;
 
-  if (g_spawn_sync (g_get_home_dir (),
-                    argv,
-                    NULL,
-                    G_SPAWN_SEARCH_PATH,
-                    NULL, NULL,
-                    &out, NULL,
-                    &exit,
-                    &error))
+  result = tracker_resources_sparql_query (priv->client, sparql, &error);
+
+  if (error)
     {
-      g_print ("%s\n", out);
+      g_warning ("error querying tracker for \"%s\": %s",
+                 match, error->message);
+      g_error_free (error);
     }
-  else
+  if (result)
     {
-      g_printerr ("error querying tracker: %s\n",
-                  error->message);
-
-      g_error_free (error);
+      size_t index;
+
+      for (index = 0; index < result->len; index++)
+        {
+          gchar const** column = g_ptr_array_index (result, index);
+          column[URN] += strlen ("file://");
+          GDesktopAppInfo* info = g_desktop_app_info_new_from_filename (column[URN]);
+          GIcon* icon = g_app_info_get_icon (G_APP_INFO (info));
+          gchar const* name = NULL;
+          if (G_IS_THEMED_ICON (icon))
+            {
+              gchar const * const * names = g_themed_icon_get_names (G_THEMED_ICON (icon));
+              if (names)
+                {
+                  name = *names;
+                }
+            }
+          LbItemApplication* item = g_object_new (LB_TYPE_ITEM_APPLICATION, "name", column[TITLE], "icon-name", name, NULL);
+          lb_item_application_set_desktop_file (item, column[URN]);
+          list = g_list_prepend (list, item);
+        }
+      list = g_list_reverse (list);
+
+      g_ptr_array_free (result, TRUE);
     }
 
-  return NULL;
+  return list;
 }
 
 /* vim:set et sw=2 cino=t0,f0,(0,{s,>2s,n-1s,^-1s,e2s: */



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