summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorHuang Peng <shawn.p.huang@gmail.com>2008-10-07 18:48:00 +0800
committerHuang Peng <shawn.p.huang@gmail.com>2008-10-07 18:48:00 +0800
commit76ae87c4634e7f8594fd663e6c05b369fda4948b (patch)
tree0fba0d5e84c5718b65e26376ef963a28708ff760 /ui
parent796614baeb0002f77522b196e974e68f37b16646 (diff)
downloadibus-76ae87c4634e7f8594fd663e6c05b369fda4948b.tar.gz
ibus-76ae87c4634e7f8594fd663e6c05b369fda4948b.tar.xz
ibus-76ae87c4634e7f8594fd663e6c05b369fda4948b.zip
Fix problem when org.freedesktop.Notifications does not exist.
Diffstat (limited to 'ui')
-rw-r--r--ui/gtk/notifications.py52
1 files changed, 43 insertions, 9 deletions
diff --git a/ui/gtk/notifications.py b/ui/gtk/notifications.py
index 71fb626..cebedf5 100644
--- a/ui/gtk/notifications.py
+++ b/ui/gtk/notifications.py
@@ -34,27 +34,55 @@ from gettext import dgettext
_ = lambda a : dgettext("ibus", a)
N_ = lambda a : a
+BUS_NOTIFICATIONS_NAME = "org.freedesktop.Notifications"
+BUS_NOTIFICATIONS_PATH = "/org/freedesktop/Notifications"
+BUS_NOTIFICATIONS_IFACE = "org.freedesktop.Notifications"
+
class Notifications(ibus.NotificationsBase):
def __init__ (self, bus):
super(Notifications, self).__init__(bus)
self.__bus = bus
- self.__dbus = dbus.SessionBus()
- self.__notifications = self.__dbus.get_object(
- "org.freedesktop.Notifications", "/org/freedesktop/Notifications")
- self.__notifications.connect_to_signal("NotificationClosed",
- self.__notification_closed_cb,
- dbus_interface="org.freedesktop.Notifications")
- self.__notifications.connect_to_signal("ActionInvoked",
- self.__action_invoked_cb,
- dbus_interface="org.freedesktop.Notifications")
+ try:
+ self.__dbus = dbus.SessionBus()
+ self.__dbus.watch_name_owner(BUS_NOTIFICATIONS_NAME,
+ self.__notifications_name_owner_changed_cb)
+ except:
+ self.__dbus = None
+ self.__notifications = None
self.__ids = set([])
+ self.__init_notifications()
self.__status_icons = None
self.__bus.request_name(ibus.IBUS_NOTIFICATIONS_NAME, 0)
+ def __notifications_name_owner_changed_cb(self, unique_name):
+ if unique_name:
+ self.__init_notifications()
+ else:
+ self.__notifications = None
+
+ def __init_notifications(self):
+ if self.__dbus == None:
+ return
+
+ try:
+ self.__notifications = self.__dbus.get_object(
+ BUS_NOTIFICATIONS_NAME, BUS_NOTIFICATIONS_PATH)
+ self.__notifications.connect_to_signal("NotificationClosed",
+ self.__notification_closed_cb,
+ dbus_interface=BUS_NOTIFICATIONS_IFACE)
+ self.__notifications.connect_to_signal("ActionInvoked",
+ self.__action_invoked_cb,
+ dbus_interface=BUS_NOTIFICATIONS_IFACE)
+ self.__ids = set([])
+ except:
+ self.__notifications = None
+
def set_status_icon(self, status_icon):
self.__status_icon = status_icon
def notify(self, replaces_id, app_icon, summary, body, actions, expire_timeout):
+ if self.__notifications == None:
+ return 0
if app_icon == "":
app_icon = "ibus"
hints = dbus.Dictionary(signature="sv")
@@ -74,13 +102,19 @@ class Notifications(ibus.NotificationsBase):
return id
def close_notification(self, id):
+ if self.__notifications == None:
+ return
return self.__notifications.CloseNotifications(id)
def __notification_closed_cb(self, id, reason):
+ if self.__notifications == None:
+ return
if id in self.__ids:
self.notification_closed(id, reason)
def __action_invoked_cb(self, id, action_key):
+ if self.__notifications == None:
+ return
if id in self.__ids:
self.action_invoked(id, action_key)