From 88140696b14c5d20622cd36e99c2db354fbd0437 Mon Sep 17 00:00:00 2001 From: Gergely Imreh Date: Mon, 1 Jun 2009 14:05:37 +0800 Subject: [PATCH] systray icon notification, Closes #15 Alternate systray icon is shown on receiving any new status update if window is hidden. Notification is removed when user checks the app window. --- minibook.py | 39 ++++++++++++++++++++++++++++++++++++--- pixmaps/minibook_notify.png | Bin 0 -> 10336 bytes 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 pixmaps/minibook_notify.png diff --git a/minibook.py b/minibook.py index 414068b..81ea616 100755 --- a/minibook.py +++ b/minibook.py @@ -394,6 +394,7 @@ class MainWindow: first_iter = model.get_iter_first() first_path = model.get_path(first_iter) self.treeview.scroll_to_cell(first_path) + self.new_status_notify() self.statusbar.pop(self.statusbar_context) @@ -630,6 +631,30 @@ class MainWindow: _log.debug('Copying to clipboard: %s' % (text)) clipboard.set_text(text) + def new_status_notify(self): + """ + Handle notification upon new status updates + """ + + # Announce to the rest of the program + self.new_notify = True + + # Set system tray icon to the notification version, if + # user is not looking at the window at the moment. + if not self.window.get_property('is-active'): + self._systray.set_from_pixbuf(self._app_icon_notify) + + def expose_notify(self, widget, event, user=None): + """ + Called when the window is shown + """ + + # Remove systray notification if there's any and + # user checks window: expose_event AND is-active = true + if self.new_notify and self.window.get_property('is-active'): + self.new_notify = False + self._systray.set_from_pixbuf(self._app_icon) + #-------------------- # Interface functions #-------------------- @@ -1105,15 +1130,19 @@ class MainWindow: self.window.show_all() # Set up systray icon - self._app_icon = 'pixmaps/minibook.png' + _app_icon_file = 'pixmaps/minibook.png' + _app_icon_notify_file = 'pixmaps/minibook_notify.png' + self._app_icon = gtk.gdk.pixbuf_new_from_file(_app_icon_file) + self._app_icon_notify = \ + gtk.gdk.pixbuf_new_from_file(_app_icon_notify_file) self._systray = gtk.StatusIcon() - self._systray.set_from_file(self._app_icon) + self._systray.set_from_pixbuf(self._app_icon) self._systray.set_tooltip('%s\n' \ 'Left-click: toggle window hiding' % (APPNAME)) self._systray.connect('activate', self.systray_click) self._systray.set_visible(True) - self.window.set_icon_from_file(self._app_icon) + self.window.set_icon(self._app_icon) # Enable thread manager self._threads = _ThreadManager() @@ -1135,6 +1164,10 @@ class MainWindow: self._refresh_id = None self.set_auto_refresh() + # Storing notification state + self.new_notify = False + # Used to remove systray notification on window show + self.window.connect("expose-event", self.expose_notify) def main(facebook): """ diff --git a/pixmaps/minibook_notify.png b/pixmaps/minibook_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..af822061f7e923739dc782589b1d645822603b48 GIT binary patch literal 10336 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