diff --git a/src/common/dbus_support.py b/src/common/dbus_support.py index be69564ace2522840683e5a935d7cc12a06dcccf..fd9f8111d85b3201f77fe2c84bb232fb0c3e2200 100644 --- a/src/common/dbus_support.py +++ b/src/common/dbus_support.py @@ -113,7 +113,7 @@ class SessionBus: session_bus = SessionBus() -def get_interface(interface, path): +def get_interface(interface, path, start_service=True): '''Returns an interface on the current SessionBus. If the interface isn\'t running, it tries to start it first.''' if not supported: @@ -129,7 +129,7 @@ def get_interface(interface, path): started = True if interface not in running_services: # try to start the service - if dbus_iface.StartServiceByName(interface, dbus.UInt32(0)) == 1: + if start_service and dbus_iface.StartServiceByName(interface, dbus.UInt32(0)) == 1: started = True else: started = False @@ -142,10 +142,24 @@ def get_interface(interface, path): return None -def get_notifications_interface(): - '''Returns the notifications interface.''' - return get_interface('org.freedesktop.Notifications', - '/org/freedesktop/Notifications') +def get_notifications_interface(notif=None): + '''Returns the notifications interface. + + :param notif: DesktopNotification instance''' + # try to see if KDE notifications are available + iface = get_interface('org.kde.VisualNotifications', '/VisualNotifications', + start_service=False) + if iface != None: + if notif != None: + notif.kde_notifications = True + return iface + # KDE notifications don't seem to be available, falling back to + # notification-daemon + else: + if notif != None: + notif.kde_notifications = False + return get_interface('org.freedesktop.Notifications', + '/org/freedesktop/Notifications') if supported: class MissingArgument(dbus.DBusException): diff --git a/src/notify.py b/src/notify.py index 3473375f2e7c38db14f775401ba9542d8fdb7813..55d62ef3ce904c452ca3da126e0e9be2f4cb7ce5 100644 --- a/src/notify.py +++ b/src/notify.py @@ -481,7 +481,8 @@ class DesktopNotification: ntype = 'transfer' elif event_type == _('File Transfer Error'): ntype = 'transfer.error' - elif event_type in (_('File Transfer Completed'), _('File Transfer Stopped')): + elif event_type in (_('File Transfer Completed'), + _('File Transfer Stopped')): ntype = 'transfer.complete' elif event_type == _('New E-mail'): ntype = 'email.arrived' @@ -498,17 +499,41 @@ class DesktopNotification: 'chat_msg_recv.png')) # img to display ntype = 'im' # Notification Type - self.notif = dbus_support.get_notifications_interface() + self.notif = dbus_support.get_notifications_interface(self) if self.notif is None: raise dbus.DBusException('unable to get notifications interface') self.ntype = ntype - self.get_version() + if self.kde_notifications: + self.attempt_notify() + else: + self.get_version() def attempt_notify(self): - version = self.version timeout = gajim.config.get('notification_timeout') # in seconds ntype = self.ntype + if self.kde_notifications: + notification_text = '<html><img src="%(image)s" align=left />' + \ + '%(title)s<br/>%(text)s</html>' % {'title': self.title, + 'text': self.text, 'image': self.path_to_image} + gajim_icon = os.path.abspath(os.path.join(gajim.DATA_DIR, 'pixmaps', + 'gajim.png')) + self.notif.Notify( + dbus.String(_('Gajim')), # app_name (string) + dbus.UInt32(0), # replaces_id (uint) + ntype, # event_id (string) + dbus.String(gajim_icon), # app_icon (string) + dbus.String(_('')), # summary (string) + dbus.String(notification_text), # body (string) + # actions (stringlist) + (dbus.String('default'), dbus.String(self.event_type), + dbus.String('ignore'), dbus.String(_('Ignore'))), + [], # hints (not used in KDE yet) + dbus.UInt32(timeout*1000), # timeout (int), in ms + reply_handler=self.attach_by_id, + error_handler=self.notify_another_way) + return + version = self.version if version[:2] == [0, 2]: try: self.notif.Notify( @@ -586,6 +611,9 @@ class DesktopNotification: self.notif.CloseNotification(dbus.UInt32(id_)) self.notif = None + if reason == 'ignore': + return + gajim.interface.handle_event(self.account, self.jid, self.msg_type) def version_reply_handler(self, name, vendor, version, spec_version=None):