[Deskbar] first attempt at a cuemiac/pearl merge



Here is a monster patch applying against HEAD. Apply it from the
toplevel deskbar-applet dir.

Facts:
- Uses cairo so requires gtk 2.8. (right?)
- Not integrated into panel yet. Only window mode.
- Quite functional, but read through the top comments in
  deksbar/pearl.py before you flame me.
- Have python bindings for beagle installed together with a running
beagled for extra bonus leetness!

Run with "python pearl.py" from deskbar-applet/deskbar.

Cheers
Mikkel

PS: Sorry for low verbosity. I'm really should sleep :)
diff -ruN ../deskbar-applet/deskbar/categories.py deskbar/categories.py
--- ../deskbar-applet/deskbar/categories.py	1970-01-01 01:00:00.000000000 +0100
+++ deskbar/categories.py	2006-01-07 03:46:06.000000000 +0100
@@ -0,0 +1,73 @@
+
+class UnknownCategory (Exception):
+	def __init__ (self, category_name, match):
+		print "** Unknown Category '%s' requested by %s" % (category_name, match.__class__)
+
+
+CATEGORIES = {
+	"Files"		: {	
+				"name": "Files",
+				"nest": "<b>%(count)s</b> <i>more files</i>", 
+				"threshold": 3
+			},
+	"Actions"	: {
+				"name": "Actions",
+				"nest": "<b>%(count)s</b> <i>more actions</i>", 
+				"threshold": 1
+			},
+	"News"		: {
+				"name": "News",
+				"nest": "<b>%(count)s</b> <i>more news items</i>", 
+				"threshold": 3
+			},
+	"Contacts"	: {
+				"name": "Contacts",
+				"nest": "<b>%(count)s</b> <i>more contacts</i>",
+				"threshold": 3
+			},
+	"Emails"	: {
+				"name": "Emails",
+				"nest": "<b>%(count)s</b> <i>more emails</i>", 
+				"threshold": 3
+			},
+	"Notes"	: {
+				"name": "Notes",
+				"nest": "<b>%(count)s</b> <i>more notes</i>", 
+				"threshold": 3
+			},
+	"Volumes"	: {
+				"name": "Volumes",
+				"nest": "<b>%(count)s</b> <i>more volumes</i>", 
+				"threshold": 3
+			},
+	"Google Search"	: {
+				"name": "Google Search",
+				"nest": "<b>%(count)s</b> <i>more online hits</i>", 
+				"threshold": 2
+			},
+	"Calendar"	: {
+				"name": "Calendar",
+				"nest": "<b>%(count)s</b> <i>more calendar items</i>", 
+				"threshold": 1
+			},
+	"Conversation"	: {
+				"name": "Conversation",
+				"nest": "<b>%(count)s</b> <i>more conversations</i>", 
+				"threshold": 1
+			},
+	"Web Browser" : {
+		"name":"Web Browser",
+		"nest":"<b>%(count)s</b> <i>more items</i>",
+		"threshold":5,
+	},
+	"Programs" : {
+		"name":"Programs",
+		"nest":"<b>%(count)s</b> <i>more programs</i>",
+		"threshold":3,
+	},
+	"Debug" : {
+		"name":"Debug",
+		"nest":"<b>%(count)s</b> <i>more debugging handlers</i>",
+		"threshold":2,
+	},
+}
diff -ruN ../deskbar-applet/deskbar/handlers/beagle-live.py deskbar/handlers/beagle-live.py
--- ../deskbar-applet/deskbar/handlers/beagle-live.py	2005-12-21 17:17:49.000000000 +0100
+++ deskbar/handlers/beagle-live.py	2006-01-07 03:44:12.000000000 +0100
@@ -122,6 +122,16 @@
 		
 		self.__result = result
 	
+	def get_category (self):
+		t = self.__result["type"]
+		if t == "MailMessage" : return "Emails"
+		elif t == "Contact": return "Contacts"
+		elif t == "File": return "Files"
+		elif t == "FeedItem": return "News"
+		elif t == "Note": return "Notes"
+		elif t == "IMLog": return "Conversation"
+		elif t == "Calendar": return "Calendar"
+	
 	def get_name (self, text=None):
 		# We use the result dict itself to look up words
 		return self.__result
Binary files ../deskbar-applet/deskbar/handlers/beagle-live.pyc and deskbar/handlers/beagle-live.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/beagle.py deskbar/handlers/beagle.py
--- ../deskbar-applet/deskbar/handlers/beagle.py	2005-12-26 18:37:06.000000000 +0100
+++ deskbar/handlers/beagle.py	2006-01-07 03:44:12.000000000 +0100
@@ -29,6 +29,9 @@
 	def action(self, text=None):
 		gobject.spawn_async(["best", '--no-tray', '--show-window', self._name], flags=gobject.SPAWN_SEARCH_PATH)
 	
+	def get_category(self):
+		return _("Actions")
+	
 	def get_verb(self):
 		return _("Search for %s using Beagle") % "<b>%(name)s</b>"
 	
Binary files ../deskbar-applet/deskbar/handlers/beagle.pyc and deskbar/handlers/beagle.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/debug-async_handler.py deskbar/handlers/debug-async_handler.py
--- ../deskbar-applet/deskbar/handlers/debug-async_handler.py	2005-11-15 05:27:26.000000000 +0100
+++ deskbar/handlers/debug-async_handler.py	2006-01-07 03:44:12.000000000 +0100
@@ -22,6 +22,9 @@
 		
 	def action(self, text=None):
 		print str(self.__class__) + " : action triggered"
+		
+	def get_category (self):
+		return "Debug"
 
 class AsyncDebugHandler (AsyncHandler): 
 
Binary files ../deskbar-applet/deskbar/handlers/debug-async_handler.pyc and deskbar/handlers/debug-async_handler.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/debug-requirements.py deskbar/handlers/debug-requirements.py
--- ../deskbar-applet/deskbar/handlers/debug-requirements.py	2005-11-28 21:16:27.000000000 +0100
+++ deskbar/handlers/debug-requirements.py	2006-01-07 03:44:12.000000000 +0100
@@ -33,6 +33,9 @@
 		
 	def action(self, text=None):
 		pass
+		
+	def get_category (self):
+		return "Debug"
 
 class DebugRequirementsModule(deskbar.handler.Handler):
 	def __init__ (self):
Binary files ../deskbar-applet/deskbar/handlers/debug-requirements.pyc and deskbar/handlers/debug-requirements.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/debug-signal_handler.py deskbar/handlers/debug-signal_handler.py
--- ../deskbar-applet/deskbar/handlers/debug-signal_handler.py	2005-11-15 05:27:26.000000000 +0100
+++ deskbar/handlers/debug-signal_handler.py	2006-01-07 03:44:12.000000000 +0100
@@ -19,6 +19,9 @@
 		
 	def action(self, text=None):
 		print str(self.__class__) + " : action triggered"
+		
+	def get_category (self):
+		return "Debug"
 
 
 class SignallingDebugHandler(SignallingHandler):
Binary files ../deskbar-applet/deskbar/handlers/debug-signal_handler.pyc and deskbar/handlers/debug-signal_handler.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/email_address.py deskbar/handlers/email_address.py
--- ../deskbar-applet/deskbar/handlers/email_address.py	2005-11-15 05:27:27.000000000 +0100
+++ deskbar/handlers/email_address.py	2006-01-07 03:44:12.000000000 +0100
@@ -21,6 +21,9 @@
 		
 	def action(self, text=None):
 		gnomevfs.url_show("mailto:"+self._email)
+		
+	def get_category(self):
+		return "Emails"
 	
 	def get_verb(self):
 		return _("Send Email to %s") % "<b>%(name)s</b>"
Binary files ../deskbar-applet/deskbar/handlers/email_address.pyc and deskbar/handlers/email_address.pyc differ
Binary files ../deskbar-applet/deskbar/handlers/epiphany.pyc and deskbar/handlers/epiphany.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/evolution.py deskbar/handlers/evolution.py
--- ../deskbar-applet/deskbar/handlers/evolution.py	2006-01-02 01:57:54.000000000 +0100
+++ deskbar/handlers/evolution.py	2006-01-07 03:44:12.000000000 +0100
@@ -29,6 +29,9 @@
 		
 	def action(self, text=None):
 		gnomevfs.url_show("mailto:"+self._email)
+		
+	def get_category(self):
+		return "Contacts"
 	
 	def get_name(self, text=None):
 		return {
Binary files ../deskbar-applet/deskbar/handlers/evolution.pyc and deskbar/handlers/evolution.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/files.py deskbar/handlers/files.py
--- ../deskbar-applet/deskbar/handlers/files.py	2005-11-18 15:14:25.000000000 +0100
+++ deskbar/handlers/files.py	2006-01-07 03:44:12.000000000 +0100
@@ -27,6 +27,9 @@
 	def action(self, text=None):
 		gobject.spawn_async(["gnome-open", self._filename], flags=gobject.SPAWN_SEARCH_PATH)
 		
+	def get_category(self):
+		return "Files"
+		
 	def get_verb(self):
 		return _("Open %s") % "<b>%(name)s</b>"
 	
Binary files ../deskbar-applet/deskbar/handlers/files.pyc and deskbar/handlers/files.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/galago.py deskbar/handlers/galago.py
--- ../deskbar-applet/deskbar/handlers/galago.py	2006-01-02 01:57:54.000000000 +0100
+++ deskbar/handlers/galago.py	2006-01-07 03:44:12.000000000 +0100
@@ -21,6 +21,9 @@
 		
 	def action(self, text=None):
 		gnomevfs.url_show("mailto:"+self._email)
+		
+	def get_category(self):
+		return "Contacts"
 	
 	def get_verb(self):
 		return _("Send Email to %s") % "<b>%(name)s</b>"
Binary files ../deskbar-applet/deskbar/handlers/galago.pyc and deskbar/handlers/galago.pyc differ
Binary files ../deskbar-applet/deskbar/handlers/galeon.pyc and deskbar/handlers/galeon.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/google-live.py deskbar/handlers/google-live.py
--- ../deskbar-applet/deskbar/handlers/google-live.py	2005-11-28 21:16:27.000000000 +0100
+++ deskbar/handlers/google-live.py	2006-01-07 03:44:12.000000000 +0100
@@ -62,6 +62,9 @@
 		
 	def action(self, text=None):
 		gnomevfs.url_show(self.__url)
+		
+	def get_category(self):
+		return "Google Search"
 	
 	def get_hash(self, text=None):
 		return self.__url
Binary files ../deskbar-applet/deskbar/handlers/google-live.pyc and deskbar/handlers/google-live.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/gtkbookmarks.py deskbar/handlers/gtkbookmarks.py
--- ../deskbar-applet/deskbar/handlers/gtkbookmarks.py	2006-01-02 01:57:54.000000000 +0100
+++ deskbar/handlers/gtkbookmarks.py	2006-01-07 03:44:12.000000000 +0100
@@ -23,6 +23,9 @@
 		
 	def action(self, text=None):
 		gobject.spawn_async(["nautilus", self._path], flags=gobject.SPAWN_SEARCH_PATH)
+		
+	def get_category(self):
+		return "Files"
 	
 	def get_verb(self):
 		return _("Open location %s") % "<b>%(name)s</b>"
Binary files ../deskbar-applet/deskbar/handlers/gtkbookmarks.pyc and deskbar/handlers/gtkbookmarks.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/Makefile deskbar/handlers/Makefile
--- ../deskbar-applet/deskbar/handlers/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ deskbar/handlers/Makefile	2006-01-07 03:44:12.000000000 +0100
@@ -0,0 +1,441 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# deskbar/handlers/Makefile.  Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+srcdir = .
+top_srcdir = ../..
+
+pkgdatadir = $(datadir)/deskbar-applet
+pkglibdir = $(libdir)/deskbar-applet
+pkgincludedir = $(includedir)/deskbar-applet
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = /usr/bin/install -c
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = i686-pc-linux-gnu
+host_triplet = i686-pc-linux-gnu
+am__append_1 = evolution.py
+subdir = deskbar/handlers
+DIST_COMMON = $(am__deskbar_handlers_PYTHON_DIST) \
+	$(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/intltool.m4 \
+	$(top_srcdir)/m4/python.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__deskbar_handlers_PYTHON_DIST = beagle.py beagle-live.py \
+	email_address.py epiphany.py files.py galago.py galeon.py \
+	gtkbookmarks.py google-live.py mozilla.py programs.py \
+	pathprograms.py volumes.py web_address.py evolution.py
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(deskbar_handlersdir)"
+deskbar_handlersPYTHON_INSTALL = $(INSTALL_DATA)
+py_compile = $(top_srcdir)/py-compile
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/mikkel/Projects/deskbar-applet/missing --run aclocal-1.9
+ACLOCAL_AMFLAGS =  -I m4
+AMDEP_FALSE = #
+AMDEP_TRUE = 
+AMTAR = ${SHELL} /home/mikkel/Projects/deskbar-applet/missing --run tar
+AR = ar
+AUTOCONF = ${SHELL} /home/mikkel/Projects/deskbar-applet/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/mikkel/Projects/deskbar-applet/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/mikkel/Projects/deskbar-applet/missing --run automake-1.9
+AWK = mawk
+CATALOGS =  bg.gmo de.gmo en_CA.gmo en_GB.gmo es.gmo fi.gmo gl.gmo gu.gmo hu.gmo ja.gmo lt.gmo mk.gmo nb.gmo nl.gmo pa.gmo sk.gmo sv.gmo th.gmo zh_CN.gmo
+CATOBJEXT = .gmo
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2
+CPP = gcc -E
+CPPFLAGS = 
+CXX = g++
+CXXCPP = g++ -E
+CXXDEPMODE = depmode=gcc3
+CXXFLAGS = -g -O2
+CYGPATH_W = echo
+DATADIR = /usr/share
+DATADIRNAME = share
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+DESKBAR_CFLAGS = -DORBIT2=1 -pthread -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pygtk-2.0 -I/usr/include/gnome-python-2.0 -I/usr/include/gnome-desktop-2.0 -I/usr/include/libgnomeui-2.0 -I/usr/include/startup-notification-1.0 -I/usr/include/libgnome-2.0 -I/usr/include/libgnomecanvas-2.0 -I/usr/include/libart-2.0 -I/usr/include/gconf/2 -I/usr/include/libbonoboui-2.0 -I/usr/include/gnome-vfs-2.0 -I/usr/lib/gnome-vfs-2.0/include -I/usr/include/gnome-keyring-1 -I/usr/include/orbit-2.0 -I/usr/include/libbonobo-2.0 -I/usr/include/bonobo-activation-2.0 -I/usr/include/freetype2 -I/usr/include/libxml2  
+DESKBAR_LIBS = -pthread -lgnome-desktop-2 -lgnomeui-2 -lSM -lICE -lstartup-notification-1 -lbonoboui-2 -lgnome-keyring -lxml2 -lz -lgnomecanvas-2 -lgnome-2 -lpopt -lart_lgpl_2 -lpangoft2-1.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lfontconfig -lX11 -lXext -lXinerama -lXi -lXrandr -lXcursor -lXfixes -lpango-1.0 -lcairo -lgnomevfs-2 -lbonobo-2 -lgconf-2 -lgobject-2.0 -lbonobo-activation -lORBit-2 -lm -lgmodule-2.0 -ldl -lgthread-2.0 -lglib-2.0  
+ECHO = echo
+ECHO_C = 
+ECHO_N = -n
+ECHO_T = 
+EGREP = grep -E
+ENABLE_EVOLUTION_FALSE = #
+ENABLE_EVOLUTION_TRUE = 
+EVOLUTION_CFLAGS = -DORBIT2=1 -pthread -I/usr/include/evolution-data-server-1.6 -I/usr/include/libbonobo-2.0 -I/usr/include/libgnome-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/orbit-2.0 -I/usr/include/bonobo-activation-2.0 -I/usr/include/gconf/2 -I/usr/include/gnome-vfs-2.0 -I/usr/lib/gnome-vfs-2.0/include -I/usr/include/libxml2 -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/pygtk-2.0  
+EVOLUTION_LIBS = -pthread -lebook-1.2 -lgnome-2 -lpopt -ledataserver-1.2 -lgnomevfs-2 -lxml2 -lz -lgconf-2 -lbonobo-2 -lbonobo-activation -lORBit-2 -lgthread-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lX11 -lXext -lXinerama -lXi -lXrandr -lXcursor -lXfixes -lpango-1.0 -lcairo -lgmodule-2.0 -ldl -lgobject-2.0 -lglib-2.0  
+EXEEXT = 
+F77 = 
+FFLAGS = 
+GCONFTOOL = /usr/bin/gconftool-2
+GCONF_SCHEMAS_INSTALL_FALSE = #
+GCONF_SCHEMAS_INSTALL_TRUE = 
+GCONF_SCHEMA_CONFIG_SOURCE = xml::/etc/gconf/gconf.xml.defaults
+GCONF_SCHEMA_FILE_DIR = $(sysconfdir)/gconf/schemas
+GETTEXT_PACKAGE = deskbar-applet
+GMOFILES =  bg.gmo de.gmo en_CA.gmo en_GB.gmo es.gmo fi.gmo gl.gmo gu.gmo hu.gmo ja.gmo lt.gmo mk.gmo nb.gmo nl.gmo pa.gmo sk.gmo sv.gmo th.gmo zh_CN.gmo
+GMSGFMT = /usr/bin/msgfmt
+HAVE_PKGCONFIG = yes
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
+INSTOBJEXT = .mo
+INTLLIBS = 
+INTLTOOL_CAVES_RULE = %.caves:     %.caves.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_DESKTOP_RULE = %.desktop:   %.desktop.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_DIRECTORY_RULE = %.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_EXTRACT = $(top_builddir)/intltool-extract
+INTLTOOL_ICONV = /usr/bin/iconv
+INTLTOOL_KBD_RULE = %.kbd:       %.kbd.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_KEYS_RULE = %.keys:      %.keys.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_MERGE = $(top_builddir)/intltool-merge
+INTLTOOL_MSGFMT = /usr/bin/msgfmt
+INTLTOOL_MSGMERGE = /usr/bin/msgmerge
+INTLTOOL_OAF_RULE = %.oaf:       %.oaf.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< $@
+INTLTOOL_PERL = /usr/bin/perl
+INTLTOOL_PONG_RULE = %.pong:      %.pong.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_PROP_RULE = %.prop:      %.prop.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_SCHEMAS_RULE = %.schemas:   %.schemas.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_SERVER_RULE = %.server:    %.server.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_SHEET_RULE = %.sheet:     %.sheet.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_SOUNDLIST_RULE = %.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_THEME_RULE = %.theme:     %.theme.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_UI_RULE = %.ui:        %.ui.in        $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_UPDATE = $(top_builddir)/intltool-update
+INTLTOOL_XAM_RULE = %.xam:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_XGETTEXT = /usr/bin/xgettext
+INTLTOOL_XML_NOMERGE_RULE = %.xml:       %.xml.in       $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< $@
+INTLTOOL_XML_RULE = %.xml:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+LDFLAGS = 
+LIBDIR = /usr/lib
+LIBOBJS = 
+LIBS = 
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LN_S = ln -s
+LTLIBOBJS = 
+MAINT = 
+MAINTAINER_MODE_FALSE = #
+MAINTAINER_MODE_TRUE = 
+MAKEINFO = ${SHELL} /home/mikkel/Projects/deskbar-applet/missing --run makeinfo
+MKINSTALLDIRS = ./mkinstalldirs
+MSGFMT = /usr/bin/msgfmt
+OBJEXT = o
+PACKAGE = deskbar-applet
+PACKAGE_BUGREPORT = raphael slinckx net
+PACKAGE_NAME = deskbar-applet
+PACKAGE_STRING = deskbar-applet 0.8.8
+PACKAGE_TARNAME = deskbar-applet
+PACKAGE_VERSION = 0.8.8
+PATH_SEPARATOR = :
+PKG_CONFIG = /usr/bin/pkg-config
+POFILES =  bg.po de.po en_CA.po en_GB.po es.po fi.po gl.po gu.po hu.po ja.po lt.po mk.po nb.po nl.po pa.po sk.po sv.po th.po zh_CN.po
+POSUB = po
+PO_IN_DATADIR_FALSE = 
+PO_IN_DATADIR_TRUE = 
+PYGTK_CODEGEN = /usr/bin/pygtk-codegen-2.0
+PYGTK_DEFSDIR = /usr/share/pygtk/2.0/defs
+PYTHON = /usr/bin/python
+PYTHONPATH = /usr/lib/python2.4/site-packages
+PYTHON_EXEC_PREFIX = ${exec_prefix}
+PYTHON_INCLUDES = -I/usr/include/python2.4
+PYTHON_PLATFORM = linux2
+PYTHON_PREFIX = ${prefix}
+PYTHON_VERSION = 2.4
+RANLIB = ranlib
+SET_MAKE = 
+SHELL = /bin/sh
+STRIP = strip
+USE_NLS = yes
+VERSION = 0.8.8
+XGETTEXT = /usr/bin/xgettext
+ac_ct_AR = ar
+ac_ct_CC = gcc
+ac_ct_CXX = g++
+ac_ct_F77 = 
+ac_ct_RANLIB = ranlib
+ac_ct_STRIP = strip
+ac_pt_PKG_CONFIG = /usr/bin/pkg-config
+am__fastdepCC_FALSE = #
+am__fastdepCC_TRUE = 
+am__fastdepCXX_FALSE = #
+am__fastdepCXX_TRUE = 
+am__include = include
+am__leading_dot = .
+am__quote = 
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build = i686-pc-linux-gnu
+build_alias = 
+build_cpu = i686
+build_os = linux-gnu
+build_vendor = pc
+datadir = ${prefix}/share
+exec_prefix = ${prefix}
+host = i686-pc-linux-gnu
+host_alias = 
+host_cpu = i686
+host_os = linux-gnu
+host_vendor = pc
+includedir = ${prefix}/include
+infodir = ${prefix}/info
+install_sh = /home/mikkel/Projects/deskbar-applet/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localstatedir = ${prefix}/var
+mandir = ${prefix}/man
+mkdir_p = mkdir -p --
+oldincludedir = /usr/include
+pkgpyexecdir = ${pyexecdir}/deskbar-applet
+pkgpythondir = ${pythondir}/deskbar-applet
+prefix = /usr
+program_transform_name = s,x,x,
+pyexecdir = ${exec_prefix}/lib/python2.4/site-packages
+pythondir = ${prefix}/lib/python2.4/site-packages
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+sysconfdir = ${prefix}/etc
+target_alias = 
+deskbar_handlersdir = $(libdir)/deskbar-applet/handlers
+deskbar_handlers_PYTHON = beagle.py beagle-live.py email_address.py \
+	epiphany.py files.py galago.py galeon.py gtkbookmarks.py \
+	google-live.py mozilla.py programs.py pathprograms.py \
+	volumes.py web_address.py $(am__append_1)
+EXTRA_DIST = \
+	debug-async_handler.py \
+	debug-requirements.py \
+	debug-signal_handler.py
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  deskbar/handlers/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  deskbar/handlers/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-deskbar_handlersPYTHON: $(deskbar_handlers_PYTHON)
+	@$(NORMAL_INSTALL)
+	test -z "$(deskbar_handlersdir)" || $(mkdir_p) "$(DESTDIR)$(deskbar_handlersdir)"
+	@list='$(deskbar_handlers_PYTHON)'; dlist=''; for p in $$list; do\
+	  if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \
+	  if test -f $$b$$p; then \
+	    f=$(am__strip_dir) \
+	    dlist="$$dlist $$f"; \
+	    echo " $(deskbar_handlersPYTHON_INSTALL) '$$b$$p' '$(DESTDIR)$(deskbar_handlersdir)/$$f'"; \
+	    $(deskbar_handlersPYTHON_INSTALL) "$$b$$p" "$(DESTDIR)$(deskbar_handlersdir)/$$f"; \
+	  else :; fi; \
+	done; \
+	if test -n "$$dlist"; then \
+	  if test -z "$(DESTDIR)"; then \
+	    PYTHON=$(PYTHON) $(py_compile) --basedir "$(deskbar_handlersdir)" $$dlist; \
+	  else \
+	    PYTHON=$(PYTHON) $(py_compile) --destdir "$(DESTDIR)" --basedir "$(deskbar_handlersdir)" $$dlist; \
+	  fi; \
+	else :; fi
+
+uninstall-deskbar_handlersPYTHON:
+	@$(NORMAL_UNINSTALL)
+	@list='$(deskbar_handlers_PYTHON)'; dlist=''; for p in $$list; do\
+	  f=$(am__strip_dir) \
+	  rm -f "$(DESTDIR)$(deskbar_handlersdir)/$$f"; \
+	  rm -f "$(DESTDIR)$(deskbar_handlersdir)/$${f}c"; \
+	  rm -f "$(DESTDIR)$(deskbar_handlersdir)/$${f}o"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+	for dir in "$(DESTDIR)$(deskbar_handlersdir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-deskbar_handlersPYTHON
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-deskbar_handlersPYTHON uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-deskbar_handlersPYTHON \
+	install-exec install-exec-am install-info install-info-am \
+	install-man install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am uninstall uninstall-am \
+	uninstall-deskbar_handlersPYTHON uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff -ruN ../deskbar-applet/deskbar/handlers/Makefile.in deskbar/handlers/Makefile.in
--- ../deskbar-applet/deskbar/handlers/Makefile.in	1970-01-01 01:00:00.000000000 +0100
+++ deskbar/handlers/Makefile.in	2006-01-07 03:44:12.000000000 +0100
@@ -0,0 +1,441 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+ ENABLE_EVOLUTION_TRUE@am__append_1 = evolution.py
+subdir = deskbar/handlers
+DIST_COMMON = $(am__deskbar_handlers_PYTHON_DIST) \
+	$(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/intltool.m4 \
+	$(top_srcdir)/m4/python.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__deskbar_handlers_PYTHON_DIST = beagle.py beagle-live.py \
+	email_address.py epiphany.py files.py galago.py galeon.py \
+	gtkbookmarks.py google-live.py mozilla.py programs.py \
+	pathprograms.py volumes.py web_address.py evolution.py
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(deskbar_handlersdir)"
+deskbar_handlersPYTHON_INSTALL = $(INSTALL_DATA)
+py_compile = $(top_srcdir)/py-compile
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DESKBAR_CFLAGS = @DESKBAR_CFLAGS@
+DESKBAR_LIBS = @DESKBAR_LIBS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_EVOLUTION_FALSE = @ENABLE_EVOLUTION_FALSE@
+ENABLE_EVOLUTION_TRUE = @ENABLE_EVOLUTION_TRUE@
+EVOLUTION_CFLAGS = @EVOLUTION_CFLAGS@
+EVOLUTION_LIBS = @EVOLUTION_LIBS@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GCONFTOOL = @GCONFTOOL@
+GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@
+GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@
+GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@
+GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+HAVE_PKGCONFIG = @HAVE_PKGCONFIG@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@
+INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@
+INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_ICONV = @INTLTOOL_ICONV@
+INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@
+INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_MSGFMT = @INTLTOOL_MSGFMT@
+INTLTOOL_MSGMERGE = @INTLTOOL_MSGMERGE@
+INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@
+INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@
+INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@
+INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@
+INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@
+INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@
+INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@
+INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@
+INTLTOOL_XGETTEXT = @INTLTOOL_XGETTEXT@
+INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@
+INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+POFILES = @POFILES@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+PYGTK_CODEGEN = @PYGTK_CODEGEN@
+PYGTK_DEFSDIR = @PYGTK_DEFSDIR@
+PYTHON = @PYTHON@
+PYTHONPATH = @PYTHONPATH@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_INCLUDES = @PYTHON_INCLUDES@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+deskbar_handlersdir = $(libdir)/deskbar-applet/handlers
+deskbar_handlers_PYTHON = beagle.py beagle-live.py email_address.py \
+	epiphany.py files.py galago.py galeon.py gtkbookmarks.py \
+	google-live.py mozilla.py programs.py pathprograms.py \
+	volumes.py web_address.py $(am__append_1)
+EXTRA_DIST = \
+	debug-async_handler.py \
+	debug-requirements.py \
+	debug-signal_handler.py
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  deskbar/handlers/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  deskbar/handlers/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+install-deskbar_handlersPYTHON: $(deskbar_handlers_PYTHON)
+	@$(NORMAL_INSTALL)
+	test -z "$(deskbar_handlersdir)" || $(mkdir_p) "$(DESTDIR)$(deskbar_handlersdir)"
+	@list='$(deskbar_handlers_PYTHON)'; dlist=''; for p in $$list; do\
+	  if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \
+	  if test -f $$b$$p; then \
+	    f=$(am__strip_dir) \
+	    dlist="$$dlist $$f"; \
+	    echo " $(deskbar_handlersPYTHON_INSTALL) '$$b$$p' '$(DESTDIR)$(deskbar_handlersdir)/$$f'"; \
+	    $(deskbar_handlersPYTHON_INSTALL) "$$b$$p" "$(DESTDIR)$(deskbar_handlersdir)/$$f"; \
+	  else :; fi; \
+	done; \
+	if test -n "$$dlist"; then \
+	  if test -z "$(DESTDIR)"; then \
+	    PYTHON=$(PYTHON) $(py_compile) --basedir "$(deskbar_handlersdir)" $$dlist; \
+	  else \
+	    PYTHON=$(PYTHON) $(py_compile) --destdir "$(DESTDIR)" --basedir "$(deskbar_handlersdir)" $$dlist; \
+	  fi; \
+	else :; fi
+
+uninstall-deskbar_handlersPYTHON:
+	@$(NORMAL_UNINSTALL)
+	@list='$(deskbar_handlers_PYTHON)'; dlist=''; for p in $$list; do\
+	  f=$(am__strip_dir) \
+	  rm -f "$(DESTDIR)$(deskbar_handlersdir)/$$f"; \
+	  rm -f "$(DESTDIR)$(deskbar_handlersdir)/$${f}c"; \
+	  rm -f "$(DESTDIR)$(deskbar_handlersdir)/$${f}o"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+	for dir in "$(DESTDIR)$(deskbar_handlersdir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-deskbar_handlersPYTHON
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-deskbar_handlersPYTHON uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-deskbar_handlersPYTHON \
+	install-exec install-exec-am install-info install-info-am \
+	install-man install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am uninstall uninstall-am \
+	uninstall-deskbar_handlersPYTHON uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Binary files ../deskbar-applet/deskbar/handlers/mozilla.pyc and deskbar/handlers/mozilla.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/pathprograms.py deskbar/handlers/pathprograms.py
--- ../deskbar-applet/deskbar/handlers/pathprograms.py	2006-01-02 01:57:54.000000000 +0100
+++ deskbar/handlers/pathprograms.py	2006-01-07 03:44:12.000000000 +0100
@@ -25,6 +25,9 @@
 	def action(self, text=None):
 		gobject.spawn_async(text.split(" "), flags=gobject.SPAWN_SEARCH_PATH)
 	
+	def get_category(self):
+		return "Programs"
+	
 	def get_verb(self):
 		return _("Execute %s") % "<b>%(text)s</b>"
 
Binary files ../deskbar-applet/deskbar/handlers/pathprograms.pyc and deskbar/handlers/pathprograms.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/programs.py deskbar/handlers/programs.py
--- ../deskbar-applet/deskbar/handlers/programs.py	2006-01-02 01:57:54.000000000 +0100
+++ deskbar/handlers/programs.py	2006-01-07 03:44:12.000000000 +0100
@@ -58,6 +58,9 @@
 		else:
 			self._desktop.launch([])
 	
+	def get_category(self):
+		return "Programs"
+	
 	def get_verb(self):
 		#translators: First %s is the programs full name, second is the executable name
 		#translators: For example: Launch Text Editor (gedit)
Binary files ../deskbar-applet/deskbar/handlers/programs.pyc and deskbar/handlers/programs.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/volumes.py deskbar/handlers/volumes.py
--- ../deskbar-applet/deskbar/handlers/volumes.py	2006-01-02 01:57:54.000000000 +0100
+++ deskbar/handlers/volumes.py	2006-01-07 03:44:12.000000000 +0100
@@ -28,6 +28,9 @@
 	
 	def action(self, text=None):
 		gobject.spawn_async(["nautilus", self.__drive.get_activation_uri()], flags=gobject.SPAWN_SEARCH_PATH)
+	
+	def get_category(self):
+		return "Files"
 	 
 	def get_verb(self):
 		activation = self.__drive.get_activation_uri()
Binary files ../deskbar-applet/deskbar/handlers/volumes.pyc and deskbar/handlers/volumes.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers/web_address.py deskbar/handlers/web_address.py
--- ../deskbar-applet/deskbar/handlers/web_address.py	2006-01-02 01:57:54.000000000 +0100
+++ deskbar/handlers/web_address.py	2006-01-07 03:44:12.000000000 +0100
@@ -28,6 +28,9 @@
 			gnomevfs.url_show(self._url)
 		else:
 			gobject.spawn_async(["nautilus", self._url], flags=gobject.SPAWN_SEARCH_PATH)
+			
+	def get_category(self):
+		return _("Actions")
 	
 	def get_verb(self):
 		if not self._has_method:
Binary files ../deskbar-applet/deskbar/handlers/web_address.pyc and deskbar/handlers/web_address.pyc differ
diff -ruN ../deskbar-applet/deskbar/handlers_browsers.py deskbar/handlers_browsers.py
--- ../deskbar-applet/deskbar/handlers_browsers.py	2006-01-02 01:57:53.000000000 +0100
+++ deskbar/handlers_browsers.py	2006-01-07 03:46:06.000000000 +0100
@@ -24,6 +24,9 @@
 	def action(self, text=None):
 		gnomevfs.url_show(self._url)
 		
+	def get_category(self):
+		return "Web Browser"
+		
 	def get_verb(self):
 		if self._is_history:
 			return _("Open History Item %s") % "<b>%(name)s</b>"
diff -ruN ../deskbar-applet/deskbar/pearl.py deskbar/pearl.py
--- ../deskbar-applet/deskbar/pearl.py	1970-01-01 01:00:00.000000000 +0100
+++ deskbar/pearl.py	2006-01-07 03:46:06.000000000 +0100
@@ -0,0 +1,584 @@
+#
+# Known issues/ Ideas
+#
+# - (EASY) Expanding should be possible with enter/space as well
+#
+# - (?) Multiscreen logic.
+#
+# - (HARD) Detach the search window to "store" the search
+#
+# - (MEDIUM) Drag hits onto desktop/nautilus
+#
+# - (?) The entry loose focus sometimes when the CuemiacWindow appears,
+#   really annoying!
+#
+# - (MEDIUM) Store expandedness state of categories
+#
+# - (MEDIUM) User defined (non-static) categories *WITHOUT PERFOMANCE HIT*
+#
+# - (?) Optimize
+
+from os.path import *
+
+import cgi
+import sys
+
+import gtk, gobject
+import gnome
+import gnome.ui, gnomeapplet
+import pango
+
+from categories import CATEGORIES
+
+from gettext import gettext as _
+
+class Nest :
+	"""
+	A class used to handle nested results in the CuemiacModel
+	"""
+	def __init__(self, category_name, parent):
+		self.__nest_msg = category_name
+		self.__parent = parent # The CuemiacCategory to which this nest belongs
+	
+	def get_name (self, text=None):
+		return {"count" : self.__parent.get_count () - self.__parent.get_threshold ()}
+	
+	def get_verb (self):
+		return self.__nest_msg
+		
+	def get_count (self):
+		return self.__parent.get_count () - self.__parent.get_threshold ()
+
+class CuemiacCategory :
+
+	def __init__ (self, name, parent, threshold=5):
+		self.__category_row_ref = None
+		self.__nest_row_ref = None
+		self.__parent = parent
+
+		self.__name = name
+		self.__threshold = threshold
+		self.__count = 0
+
+	def get_category_row_path (self):
+		return self.__category_row_ref.get_path ()
+		
+	def get_nest_row_path (self):
+		return self.__nest_row_ref.get_path ()
+
+	def set_category_iter (self, iter):
+		self.__category_row_ref = gtk.TreeRowReference (self.__parent, self.__parent.get_path(iter))
+		
+	def get_category_iter (self):
+		"""
+		Returns a gtk.TreeIter pointing at the category
+		"""
+		return self.__parent.get_iter (self.__category_row_ref.get_path())
+		
+	def set_nest_iter (self, iter):
+		self.__nest_row_ref = gtk.TreeRowReference (self.__parent, self.__parent.get_path(iter))	
+		
+	def get_nest_iter (self):
+		"""
+		Returns a gtk.TreeIter pointing at the nested row
+		"""
+		return self.__parent.get_iter (self.__nest_row_ref.get_path())
+	
+	def get_name (self):
+		return self.__name
+	
+	def inc_count (self):
+		self.__count = self.__count + 1
+	
+	def get_count (self):
+		return self.__count
+	
+	def get_threshold (self):
+		return self.__threshold
+
+class CuemiacModel (gtk.TreeStore):
+
+	# Column name
+	MATCHES = 0
+
+	def __init__ (self):
+		"""
+		"""
+		gtk.TreeStore.__init__ (self, 
+					gobject.TYPE_PYOBJECT)	# Match object
+		self.__categories = {}
+		
+	def append (self, match):
+		"""
+		Automagically append a match or list of matches 
+		to correct category(s), or create a new one(s) if needed.
+		"""
+		if type (match) == list:
+			for hit in match:
+				self.__append (hit)
+		else:
+			self.__append (match)
+		
+	def __append (self, match):
+		if self.__categories.has_key (match.get_category()):
+			self.__append_to_category (match)
+		else:
+			self.__create_category_with_match (match)
+			
+			
+	def __create_category_with_match (self, match):
+		"""
+		Assumes that the category for the match does not exist.
+		"""
+		#FIXME: Check validity of category name and use  proper i18n
+		# Set up a new category
+		cat = CuemiacCategory (match.get_category(), self)
+		iter = gtk.TreeStore.append (self, None, [cat])
+		cat.set_category_iter (iter)
+		self.__categories [match.get_category()] = cat
+
+		# Append the match to the category		
+		gtk.TreeStore.append (self, iter, [match])
+		cat.inc_count ()
+		
+	
+	def __append_to_category (self, match):
+
+		cat = self.__categories [match.get_category ()]
+		row_iter = None
+		if cat.get_count() < cat.get_threshold() :
+			cat.inc_count ()
+			gtk.TreeStore.append (self, cat.get_category_iter(), [match])
+			
+		elif cat.get_count() == cat.get_threshold():
+			nest = Nest (CATEGORIES[match.get_category ()]["nest"], cat)
+			nest_iter = gtk.TreeStore.append (self, cat.get_category_iter(), [nest])
+			cat.set_nest_iter (nest_iter)
+			
+			cat.inc_count ()
+			gtk.TreeStore.append (self, nest_iter, [match])
+		else:
+			cat.inc_count ()
+			gtk.TreeStore.append (self, cat.get_nest_iter(), [match])
+			# Update the nested count in the nest row:
+			self.row_changed (cat.get_nest_row_path(), cat.get_nest_iter())
+			
+		# Update the row count in the view:
+		self.row_changed (cat.get_category_row_path(), cat.get_category_iter())
+		
+	def clear (self):
+		"""
+		Clears this model of data.
+		"""
+		gtk.TreeStore.clear (self)
+		self.__categories = {}
+
+class CellRendererCuemiacCategory (gtk.CellRendererText):
+
+	__gproperties__ = {
+        		'category-header' : (gobject.TYPE_STRING, 'markup for category title string',
+                  	'markup for category title string, None if this is not a category header',
+                 	 None, gobject.PARAM_READWRITE),
+                 	 
+                 'match-count' : (gobject.TYPE_INT, 'number of hits in the category',
+                  	'the number of hits for the CuemiacCategory to be rendered',
+                 	 0,1000,0, gobject.PARAM_READWRITE)
+        }
+	
+	def __init__ (self):
+		gtk.CellRendererText.__init__ (self)
+		self.__category_header = None
+		self.__match_count = 0
+	
+	def do_render (self, window, widget, background_area, cell_area, expose_area, flags):
+		if not self.get_property ("category-header"):
+			gtk.CellRendererText.do_render (self, window, widget, background_area, cell_area, expose_area, flags)
+		else:
+			self.render_category (window, widget, background_area, cell_area, expose_area, flags)
+	
+	def render_category (self, window, widget, background_area, cell_area, expose_area, flag):
+		"""
+		Renders the category title from the "markup" property and displays a rigth aligned
+		hit count (read from the "match-count" property).
+		"""
+		ctx = window.cairo_create ()
+		font_desc = pango.FontDescription ("sans bold 8") #FIXME: Use gtk theme
+		
+		# Set up a pango.Layout for the category title
+		cat_layout = ctx.create_layout ()
+		cat_layout.set_text (self.get_property("category-header"))
+		cat_layout.set_font_description (font_desc)
+		
+		# Set up a pango.Layout for the hit count
+		count_layout = ctx.create_layout ()
+		count_layout.set_text ("(" + str(self.get_property("match-count")) + ")")
+		count_layout.set_font_description (font_desc)
+		
+		# Position and draw the layouts
+		ctx.move_to (18, background_area.y + 6)
+		ctx.show_layout (cat_layout)
+		w, h = count_layout.get_pixel_size()
+		ctx.move_to (background_area.width - w + 10, background_area.y + 6)
+		ctx.show_layout (count_layout)
+		
+		ctx.set_source_rgb (1,1,1)
+		ctx.move_to (0, background_area.y + 1)
+		ctx.line_to (background_area.width + 100, background_area.y + 1)
+		ctx.stroke ()
+		
+	def do_get_property(self, property):
+		if property.name == 'category-header':
+			return self.__category_header
+		elif property.name == 'match-count':
+			return self.__match_count
+		else:
+			raise AttributeError, 'unknown property %s' % property.name
+
+	def do_set_property(self, property, value):
+		if property.name == 'category-header':
+			self.__category_header = value
+		elif property.name == 'match-count':
+			self.__match_count = value
+		else:
+			raise AttributeError, 'unknown property %s' % property.name
+		
+
+class CuemiacTreeView (gtk.TreeView):
+	"""
+	Shows a DeskbarCategoryModel. Used internally in the CuemiacWidget.
+	"""
+	
+	__gsignals__ = {
+		"match-selected" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT]),
+	}
+	
+	def __init__ (self, model):
+		gtk.TreeView.__init__ (self, model)
+				
+		icon = gtk.CellRendererPixbuf ()
+		hit_title = CellRendererCuemiacCategory ()
+		hit_title.set_property ("ellipsize", pango.ELLIPSIZE_END)
+		hit_title.set_property ("width-chars", 50) #FIXME: Pick width according to screen size
+		hits = gtk.TreeViewColumn ("Hits")
+		hits.pack_start (icon)
+		hits.pack_start (hit_title)
+		hits.set_cell_data_func(hit_title, self.__get_match_title_for_cell)			
+		hits.set_cell_data_func(icon, self.__get_match_icon_for_cell)
+		self.append_column (hits)
+		
+		self.connect ("cursor-changed", self.__on_cursor_changed)
+		self.set_property ("headers-visible", False)
+		self.set_property ("hover-selection", True)
+		self.set_reorderable(True)
+		self.connect ("button-press-event", self.__on_click)
+		
+	def __on_cursor_changed (self, view):
+		model, iter = self.get_selection().get_selected()
+	
+	def __get_match_icon_for_cell (self, column, cell, model, iter, data=None):
+		
+		match = model[iter][model.MATCHES]
+		
+		if match.__class__ == CuemiacCategory:
+			cell.set_property ("pixbuf", None)
+			cell.set_property ("cell-background", "gray")
+			
+		else:
+			cell.set_property ("cell-background", "white")
+			if match.__class__ == Nest:
+				cell.set_property ("pixbuf", None)		
+			else:
+				cell.set_property ("pixbuf", match.get_icon())
+
+		
+	def __get_match_title_for_cell (self, column, cell, model, iter, data=None):
+
+		match = model[iter][model.MATCHES]
+		
+		if match.__class__ == CuemiacCategory:
+			# Look up i18n category name
+			cell.set_property ("cell-background", "gray")
+			#cell.set_property ("height", 20)
+			cell.set_property ("category-header", match.get_name())
+			cell.set_property ("match-count", match.get_count ())
+			return
+		else:
+			cell.set_property ("category-header", None)
+			cell.set_property ("height", -1)
+			cell.set_property ("cell-background", "white")
+		
+		t = entry.get_text().strip () # FIXME: This will have to be changed in a proper implementation
+		# Pass unescaped query to the matches
+		verbs = {"text" : t}
+		verbs.update(match.get_name(t))
+		# Escape the query now for display
+		verbs["text"] = cgi.escape(verbs["text"])
+		
+		cell.set_property ("markup", match.get_verb () % verbs)
+
+
+	def clear (self):
+		self.model.clear ()
+
+	def __on_click (self, widget, event):
+		
+		model, iter = self.get_selection().get_selected()
+		match = model[iter][model.MATCHES]
+		self.emit ("match-selected", match)
+	
+class CuemiacWindow (gtk.Window):
+	"""
+	Borderless window aligning itself to a given widget
+	"""
+	def __init__(self, widgetToAlignWith, alignment):
+		"""
+		alignment should be one of
+			gnomeapplet.ORIENT_{DOWN,UP,LEFT,RIGHT}
+		
+		The window will be placed accordingly relative to the given widget
+		upon invoking .show().
+		"""
+		gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
+		self.set_decorated(False)
+		
+		self.widgetToAlignWith = widgetToAlignWith
+		self.alignment = alignment
+		self.__is_shown = False
+		
+		self.scroll_win = gtk.ScrolledWindow ()
+		self.scroll_win.set_policy (gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+		gtk.Window.add (self, self.scroll_win)
+		
+		self.screen_height = self.get_screen().get_height ()
+		self.max_window_height = int (0.6 * self.screen_height)
+		
+	def add (self, child):
+		# Register a callback to respond to resizing of the child
+		self.scroll_win.add_with_viewport (child)
+		child.connect ("size-request", self.adjust_size)
+
+	def adjust_size (self, child, event):
+		# FIXME: SHould we handle width intelligently also?
+		w, h = child.size_request ()
+		h = h + 4 # To ensure we don't always show scrollbars
+		h = min (h, self.max_window_height)
+		self.resize (w, h)
+
+	def show (self):
+		"""
+		Calculates the position and shows the window
+		"""
+		# Get our own dimensions & position
+		self.realize()
+		gtk.gdk.flush()
+		window_width  = (self.window.get_geometry())[2]
+	   	window_height = (self.window.get_geometry())[3]
+
+		# Skip the taskbar, and the pager, stick and stay on top
+		self.stick()
+		self.set_keep_above(True)
+		self.set_skip_pager_hint(True)
+		self.set_skip_taskbar_hint(True)
+		self.set_type_hint (gtk.gdk.WINDOW_TYPE_HINT_DOCK)
+
+		# Get the dimensions/position of the widgetToAlignWith
+		self.widgetToAlignWith.realize()
+		(x, y) = self.widgetToAlignWith.window.get_origin()
+
+		(w, h) = self.get_size()
+		(w, h) = self.size_request()
+
+		target_w = self.widgetToAlignWith.allocation.width
+		target_h = self.widgetToAlignWith.allocation.height
+
+		screen = self.get_screen()
+
+		found_monitor = False
+		n = screen.get_n_monitors()
+		for i in range(0, n):
+				monitor = screen.get_monitor_geometry(i)
+				if (x >= monitor.x and x <= monitor.x + monitor.width and \
+					y >= monitor.y and y <= monitor.y + monitor.height):
+						found_monitor = True
+						break
+		
+		if not found_monitor:
+				monitor = gtk.gdk.Rectangle(0, 0, screen.get_width(), screen.get_width())
+		
+		self.alignment
+		if self.alignment == gnomeapplet.ORIENT_RIGHT:
+				x += target_w
+
+				if ((y + h) > monitor.y + monitor.height):
+						y -= (y + h) - (monitor.y + monitor.height)
+				
+				if ((y + h) > (monitor.height / 2)):
+						gravity = gtk.gdk.GRAVITY_SOUTH_WEST	
+				else:
+						gravity = gtk.gdk.GRAVITY_NORTH_WEST
+		elif self.alignment == gnomeapplet.ORIENT_LEFT:
+				x -= w
+
+				if ((y + h) > monitor.y + monitor.height):
+						y -= (y + h) - (monitor.y + monitor.height)
+				
+				if ((y + h) > (monitor.height / 2)):
+						gravity = gtk.gdk.GRAVITY_SOUTH_EAST
+				else:
+						gravity = gtk.gdk.GRAVITY_NORTH_EAST
+		elif self.alignment == gnomeapplet.ORIENT_DOWN:
+				y += target_h
+
+				if ((x + w) > monitor.x + monitor.width):
+						x -= (x + w) - (monitor.x + monitor.width)
+
+				gravity = gtk.gdk.GRAVITY_NORTH_WEST
+		elif self.alignment == gnomeapplet.ORIENT_UP:
+				y -= h
+
+				if ((x + w) > monitor.x + monitor.width):
+						x -= (x + w) - (monitor.x + monitor.width)
+
+				gravity = gtk.gdk.GRAVITY_SOUTH_WEST
+		
+		# -"Coordinates locked in captain."
+		# -"Engage."
+		self.move(x, y)
+		#print "Move win to "+x+","+y
+		self.set_gravity(gravity)
+		gtk.Window.show (self)
+		self.__is_shown = True
+		
+	def show_all (self):
+		self.show ()
+		gtk.Window.show_all (self)
+		
+	def hide (self):
+		self.__is_shown = False
+		gtk.Window.hide (self)
+	
+	def is_shown (self):
+		return self.__is_shown
+
+# --------------------BEGIN CUT-N-PASTE FROM DESKBAR-APPLET ---------------
+import gtk
+gtk.threads_init()
+import gnome.ui, gnomeapplet
+
+import getopt, sys
+from os.path import *
+
+# Allow to use uninstalled
+def _check(path):
+	return exists(path) and isdir(path) and isfile(path+"/AUTHORS")
+
+name = join(dirname(__file__), "..")
+if _check(name):
+	print 'Running uninstalled deskbar, modifying PYTHONPATH'
+	sys.path.insert(0, abspath(name))
+else:
+	print "Running installed deskbar, using normal PYTHONPATH"
+
+# Now the path is set, import our applet
+import deskbar, deskbar.applet, deskbar.defs
+
+import gettext, locale
+gettext.bindtextdomain('deskbar-applet', abspath(join(deskbar.defs.DATA_DIR, "locale")))
+gettext.textdomain('deskbar-applet')
+
+locale.bindtextdomain('deskbar-applet', abspath(join(deskbar.defs.DATA_DIR, "locale")))
+locale.textdomain('deskbar-applet')
+# --------------------END CUT-N-PASTE FROM DESKBAR-APPLET ---------------
+
+#
+# Load modules and set up async handling of matches
+#
+modules = []
+def on_module_loaded (loader, ctx):
+	loader.initialize_module (ctx)
+	modules.append (ctx)
+	if ctx.module.is_async ():
+		ctx.module.connect ("query-ready", lambda sender, match: cmodel.append(match))
+
+from module_list import ModuleLoader, ModuleList
+mloader = ModuleLoader (deskbar.MODULES_DIRS)
+mlist = ModuleList ()
+mloader.connect ("module-loaded", on_module_loaded)
+
+mloader.load_all()
+
+#
+# Callback when somehting is typed into the entry
+#
+def on_entry_changed (entry):
+	# FIXME: We should store the expandedness state of the categories somehow
+	cmodel.clear()
+	text = entry.get_text().strip()
+	
+	if text == "":
+		cwindow.hide ()
+		return
+	
+	for ctx in modules:
+		if not ctx.enabled:
+			continue
+			
+		if ctx.module.is_async ():
+			ctx.module.query_async (text, 10)
+		else:
+			cmodel.append (ctx.module.query (text, 10))
+	
+	if not cwindow.is_shown ():
+		cwindow.show_all ()
+#
+# Callback to monitor special keys (like Esc)
+#
+def on_entry_key_press (entry, event):
+	if event.keyval == gtk.keysyms.Escape:
+			# bind Escape to clear the GtkEntry
+			if not entry.get_text().strip() == "":
+				# If we cleared some text, tell async handlers to stop.
+				for ctx in modules:
+					if ctx.module.is_async ():
+						ctx.module.stop_query ()
+			entry.set_text("")
+
+#
+# Setup up the UI and create the Cuemiac
+#
+vbox = gtk.VBox ()
+
+entry = gtk.Entry()
+entry.connect ("changed", on_entry_changed)
+entry.connect ("key-press-event", on_entry_key_press)
+
+cmodel = CuemiacModel ()
+cview = CuemiacTreeView (cmodel)
+cwindow = CuemiacWindow (entry, gnomeapplet.ORIENT_DOWN)
+cwindow.add (cview)
+#cwindow.connect ("focus-out-event", lambda widget,event: cwindow.hide())
+
+#
+# Callback to trigger the action associated to a match
+#
+def do_action(sender, match):
+	if hasattr(match, 'action'):
+		match.action(entry.get_text())
+
+
+#
+# Setup final GUI stuff
+#	
+cview.connect ("match-selected", do_action)
+
+vbox.pack_start (entry, False)
+
+window = gtk.Window()
+window.connect ("destroy", gtk.main_quit)
+window.add (vbox)
+window.show_all()
+
+	
+cview.show_all()
+
+gtk.main ()


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