[hamster-applet] bug 529401 - with help and initiative from Ludwig Ortmann added option to change activity on desktop



commit 5e63f701d4e03bfc0a1d0375c49ab4b045f6c78e
Author: Toms Bauģis <toms baugis gmail com>
Date:   Sun Jan 17 17:55:16 2010 +0000

    bug 529401 - with help and initiative from Ludwig Ortmann added option to change activity on desktop switch

 hamster/applet.py |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 56 insertions(+), 0 deletions(-)
---
diff --git a/hamster/applet.py b/hamster/applet.py
index 1bf0081..fc77ad5 100755
--- a/hamster/applet.py
+++ b/hamster/applet.py
@@ -239,6 +239,7 @@ class HamsterApplet(object):
         self.notify_interval = conf.get("notify_interval")
         self.day_start = conf.get("day_start_minutes")
         self.day_start = dt.time(self.day_start / 60, self.day_start % 60) # it comes in as minutes
+        self.workspace_tracking = conf.get("workspace_tracking")
 
         runtime.dispatcher.add_handler('conf_changed', self.on_conf_changed)
 
@@ -258,9 +259,30 @@ class HamsterApplet(object):
         runtime.dispatcher.add_handler('day_updated', self.after_fact_update)
         runtime.dispatcher.add_handler('keybinding_activated', self.on_keybinding_activated)
 
+        self.screen = None
+        if self.workspace_tracking:
+            gobject.timeout_add(50, self.init_workspace_tracking)
+
+
         self._gui.connect_signals(self)
 
 
+    def init_workspace_tracking(self):
+        """call this using timeout_add, because it takes a little while until
+           wnck is ready (flushing events will cause hang when performed while
+           mainloop is running)"""
+        if not self.screen:
+            self.screen = wnck.screen_get_default()
+
+        active_workspace = self.screen.get_active_workspace()
+        if not active_workspace:
+            return True # come back again
+
+        self.screen.workspace_handler = self.screen.connect("active-workspace-changed", self.on_workspace_changed)
+        self.workspace_activities = {}
+        return False # done
+
+
     """UI functions"""
     def refresh_hamster(self):
         """refresh hamster every x secs - load today, check last activity etc."""
@@ -559,6 +581,31 @@ class HamsterApplet(object):
             runtime.storage.touch_fact(self.last_activity,
                                        end_time = self.dbusIdleListener.getIdleFrom())
 
+    def on_workspace_changed(self, screen, previous_workspace):
+        if not self.workspace_tracking or self.workspace_tracking not in (1,2):
+            return # default to not doing anything
+
+        # rely on workspace numbers as names change
+        prev = previous_workspace.get_number()
+        new = screen.get_active_workspace().get_number()
+
+        # on switch, update our mapping between spaces and activities
+        self.workspace_activities[prev] = self.last_activity
+
+        # if the new workspace is in our dict, switch to the specified activity
+        if new in self.workspace_activities and self.workspace_activities[new]:
+            activity = self.workspace_activities[new]
+
+            runtime.storage.add_fact(activity['name'],
+                                     ", ".join(activity['tags']),
+                                     category_name = activity['category'],
+                                     description = activity['description'])
+
+            if PYNOTIFY:
+                pynotify.Notification(_("Changed activity"),
+                                      _("Switched to '%s'") % activity['name'],
+                                      "hamster-applet").show()
+
     """global shortcuts"""
     def on_keybinding_activated(self, event, data):
         self.__show_toggle(None, not self.button.get_active())
@@ -577,6 +624,15 @@ class HamsterApplet(object):
             self.day_start = dt.time(value / 60, value % 60)
             self.load_day()
             self.update_label()
+        elif key == "workspace_tracking":
+            self.workspace_tracking = value
+            if self.workspace_tracking and not self.screen:
+                gobject.timeout_add(50, self.init_workspace_tracking)
+            elif not self.workspace_tracking:
+                if self.screen:
+                    self.screen.disconnect(self.screen.workspace_handler)
+                    self.screen = None
+
 
     def on_activity_text_changed(self, widget):
         self.get_widget("switch_activity").set_sensitive(widget.get_text() != "")



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