Maemo 5: Refactor notification handling

Take advantage of an entry in the file
/etc/hildon-desktop/notification-groups.conf.

If the entry exists, the notification is
layered on top of the (existing) gPodder
window, covering it in the task switcher.
This commit is contained in:
Thomas Perl 2010-08-17 23:52:27 +02:00
parent 3f86b26671
commit b93da51215
6 changed files with 33 additions and 23 deletions

View File

@ -0,0 +1,9 @@
[gpodder-new-episodes]
Destination=Gpodder
Icon=gpodder
Title-Text-Empty=gPodder
Secondary-Text=New episodes available
Text-Domain=gpodder
LED-Pattern=PatternCommonNotification

View File

@ -73,6 +73,7 @@ dbus_gui_object_path = '/gui'
dbus_podcasts_object_path = '/podcasts'
dbus_interface = 'org.gpodder.interface'
dbus_podcasts = 'org.gpodder.podcasts'
dbus_session_bus = None
# Set "win32" to True if we are on Windows
win32 = (platform.system() == 'Windows')

View File

@ -114,7 +114,7 @@ class HeAboutDialog(gtk.Dialog):
self.donate_url = url
def open_webbrowser(self, url):
bus = dbus.SessionBus()
bus = gpodder.dbus_session_bus
proxy = bus.get_object('com.nokia.osso_browser', '/com/nokia/osso_browser/request', 'com.nokia.osso_browser')
proxy.load_url(url, dbus_interface='com.nokia.osso_browser')

View File

@ -31,10 +31,14 @@
import gtk
import gobject
import dbus
import dbus.mainloop
import dbus.service
import dbus.glib
import urllib
import time
import gpodder
class gPodderPlayer(dbus.service.Object):
# Empty class with method definitions to send D-Bus signals
@ -59,7 +63,6 @@ class MafwPlaybackMonitor(object):
MAFW_RENDERER_SIGNAL_STATE = 'state_changed'
MAFW_SENDER_PATH = '/org/gpodder/maemo/mafw'
MAFW_SENDER_NAME = 'org.gpodder.maemo.mafw'
class MafwPlayState(object):
Stopped = 0
@ -75,7 +78,7 @@ class MafwPlaybackMonitor(object):
self._start_position = 0
self._player = gPodderPlayer(self.MAFW_SENDER_PATH, \
dbus.service.BusName(self.MAFW_SENDER_NAME, self.bus))
dbus.service.BusName(gpodder.dbus_bus_name, self.bus))
state, object_id = self.get_status()
@ -111,6 +114,10 @@ class MafwPlaybackMonitor(object):
self.on_state_changed(-1)
self.on_state_changed(self.MafwPlayState.Playing)
# We have to return True here, or otherwise this filter
# would eat all D-Bus method calls to other objects.
return True
def object_id_to_filename(self, object_id):
# Naive, but works for now...
if object_id.startswith('localtagfs::'):
@ -177,11 +184,3 @@ class MafwPlaybackMonitor(object):
self._player.PlaybackStopped(self._start_position, position, 0, self._filename)
self._is_playing = False
if __name__ == "__main__":
from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
monitor = MafwPlaybackMonitor(bus)
gtk.main()

View File

@ -49,7 +49,8 @@ except ImportError:
pass
class glib:
class DBusGMainLoop:
pass
def __init__(self, *args, **kwargs):
pass
class service:
@staticmethod
def method(*args, **kwargs):
@ -238,8 +239,7 @@ class gPodder(BuilderWidget, dbus.service.Object):
# Create a D-Bus monitoring object that takes care of
# tracking MAFW (Nokia Media Player) playback events
# and sends episode playback status events via D-Bus
session_bus = dbus.SessionBus(mainloop=dbus.glib.DBusGMainLoop())
self.mafw_monitor = MafwPlaybackMonitor(session_bus)
self.mafw_monitor = MafwPlaybackMonitor(gpodder.dbus_session_bus)
self.gPodder.connect('key-press-event', self.on_key_press)
@ -2115,8 +2115,7 @@ class gPodder(BuilderWidget, dbus.service.Object):
PANUCCI_NAME = 'org.panucci.panucciInterface'
PANUCCI_PATH = '/panucciInterface'
PANUCCI_INTF = 'org.panucci.panucciInterface'
session_bus = dbus.SessionBus(mainloop=dbus.glib.DBusGMainLoop())
o = session_bus.get_object(PANUCCI_NAME, PANUCCI_PATH)
o = gpodder.dbus_session_bus.get_object(PANUCCI_NAME, PANUCCI_PATH)
i = dbus.Interface(o, PANUCCI_INTF)
def on_reply(*args):
@ -2144,8 +2143,7 @@ class gPodder(BuilderWidget, dbus.service.Object):
MEDIABOX_NAME = 'de.pycage.mediabox'
MEDIABOX_PATH = '/de/pycage/mediabox/control'
MEDIABOX_INTF = 'de.pycage.mediabox.control'
session_bus = dbus.SessionBus(mainloop=dbus.glib.DBusGMainLoop())
o = session_bus.get_object(MEDIABOX_NAME, MEDIABOX_PATH)
o = gpodder.dbus_session_bus.get_object(MEDIABOX_NAME, MEDIABOX_PATH)
i = dbus.Interface(o, MEDIABOX_INTF)
def on_reply(*args):
@ -2694,11 +2692,11 @@ class gPodder(BuilderWidget, dbus.service.Object):
n.set_urgency(pynotify.URGENCY_CRITICAL)
n.set_hint('dbus-callback-default', ' '.join([
gpodder.dbus_bus_name,
gpodder.gui_object_path,
gpodder.dbus_gui_object_path,
gpodder.dbus_interface,
'offer_new_episodes',
]))
n.set_hint('led-pattern', 'PatternCommunicationCall')
n.set_category('gpodder-new-episodes')
n.show()
except Exception, e:
log('Error: %s', str(e), sender=self, traceback=True)
@ -3982,8 +3980,10 @@ def main(options=None):
gtk.about_dialog_set_url_hook(lambda dlg, link, data: util.open_website(link), None)
try:
session_bus = dbus.SessionBus(mainloop=dbus.glib.DBusGMainLoop())
bus_name = dbus.service.BusName(gpodder.dbus_bus_name, bus=session_bus)
dbus_main_loop = dbus.glib.DBusGMainLoop(set_as_default=True)
gpodder.dbus_session_bus = dbus.SessionBus(dbus_main_loop)
bus_name = dbus.service.BusName(gpodder.dbus_bus_name, bus=gpodder.dbus_session_bus)
except dbus.exceptions.DBusException, dbe:
log('Warning: Cannot get "on the bus".', traceback=True)
dlg = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, \

View File

@ -31,6 +31,7 @@ except ImportError:
# Import Mock D-Bus interfaces when D-Bus bindings are not installed
from gpodder.gui import dbus
import gpodder
class MediaPlayerDBusReceiver(object):
INTERFACE = 'org.gpodder.player'
@ -40,7 +41,7 @@ class MediaPlayerDBusReceiver(object):
def __init__(self, on_play_event):
self.on_play_event = on_play_event
self.bus = dbus.SessionBus()
self.bus = gpodder.dbus_session_bus
self.bus.add_signal_receiver(self.on_playback_started, \
self.SIGNAL_STARTED, \
self.INTERFACE, \