? test.html ? deskbar/handlers/debug-blockinginit.py Index: deskbar/handler.py =================================================================== RCS file: /cvs/gnome/deskbar-applet/deskbar/handler.py,v retrieving revision 1.3 diff -u -p -r1.3 handler.py --- deskbar/handler.py 14 Oct 2005 13:22:57 -0000 1.3 +++ deskbar/handler.py 14 Oct 2005 13:36:51 -0000 @@ -103,6 +103,10 @@ class Handler: Handler.initialize() is guarantied to be called before the handler is queried. + + If you need to perform gtk-related function you might want to use + initialize_safe() instead of initialize(), the module loader will ensure + gtk.threads_enter/leave is called appropriately. """ pass Index: deskbar/module_list.py =================================================================== RCS file: /cvs/gnome/deskbar-applet/deskbar/module_list.py,v retrieving revision 1.4 diff -u -p -r1.4 module_list.py --- deskbar/module_list.py 14 Oct 2005 13:22:57 -0000 1.4 +++ deskbar/module_list.py 14 Oct 2005 13:36:51 -0000 @@ -261,13 +261,9 @@ class ModuleLoader (gobject.GObject): while True: task = self.task_queue.get() try: - gtk.threads_enter () - try: - task () - except Exception, msg: - print 'Error:consume_queue:Got an error while processing item:', msg - finally: - gtk.threads_leave () + task () + except Exception, msg: + print 'Error:consume_queue:Got an error while processing item:', msg def build_filelist (self): """Returns a list containing the filenames of all qualified modules. @@ -315,12 +311,12 @@ class ModuleLoader (gobject.GObject): print >> sys.stderr, "***" return - try: - if (getattr(mod, mod.EXPORTED_CLASS).initialize) : pass - except AttributeError: + if hasattr(getattr(mod, mod.EXPORTED_CLASS), "initialize") or hasattr(getattr(mod, mod.EXPORTED_CLASS), "initialize_safe"): + pass + else: print >> sys.stderr, "Class %s in file %s does not have an initialize(self) method. Skipping." % (mod.EXPORTED_CLASS, filename) return - + return mod def load_all (self): @@ -362,7 +358,17 @@ class ModuleLoader (gobject.GObject): """ print "Initializing '%s'" % context.name - context.module.initialize () + + # First we check if the module must be called in a thread safe way + if hasattr(context.module, "initialize_safe"): + gtk.threads_enter () + try: + context.module.initialize_safe() + finally: + gtk.threads_leave () + # Else we use the simple non-locked method + else: + context.module.initialize () context.enabled = True gobject.idle_add (self.emit, "module-initialized", context) Index: deskbar/handlers/networkplaces.py =================================================================== RCS file: /cvs/gnome/deskbar-applet/deskbar/handlers/networkplaces.py,v retrieving revision 1.2 diff -u -p -r1.2 networkplaces.py --- deskbar/handlers/networkplaces.py 14 Oct 2005 13:22:57 -0000 1.2 +++ deskbar/handlers/networkplaces.py 14 Oct 2005 13:36:51 -0000 @@ -31,7 +31,7 @@ class NetworkPlacesHandler(deskbar.handl self._indexer = deskbar.indexer.Index() - def initialize(self): + def initialize_safe(self): self._scan_network_places() def get_priority(self):