3
This plugin implements D-Bus features for Sonata:
5
* Check that only one instance of Sonata is running at a time
6
* Allow other programs to request the info popup, and to show or to toggle
7
the main window visibility
8
* Listen to Gnome 2.18+ multimedia key events
10
XXX Not a real plugin yet.
13
import dbus_plugin as dbus
14
self.dbus_service = dbus.SonataDBus(self.dbus_show, self.dbus_toggle, self.dbus_popup)
15
dbus.start_dbus_interface(toggle_arg, popup_arg)
16
dbus.init_gnome_mediakeys(self.mpd_pp, self.mpd_stop, self.mpd_prev, self.mpd_next)
17
if not dbus.using_gnome_mediakeys():
18
# do something else instead...
24
import dbus, dbus.service
25
if getattr(dbus, "version", (0, 0, 0)) >= (0, 41, 0):
27
if getattr(dbus, "version", (0, 0, 0)) >= (0, 80, 0):
28
import _dbus_bindings as dbus_bindings
31
import dbus.dbus_bindings as dbus_bindings
40
HAVE_GNOME_MMKEYS = False
42
def using_gnome_mediakeys():
43
return HAVE_GNOME_MMKEYS
45
def init_gnome_mediakeys(mpd_pp, mpd_stop, mpd_prev, mpd_next):
46
global HAVE_GNOME_MMKEYS
49
bus = dbus.SessionBus()
50
dbusObj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
51
dbusInterface = dbus.Interface(dbusObj, 'org.freedesktop.DBus')
52
if dbusInterface.NameHasOwner('org.gnome.SettingsDaemon'):
54
# mmkeys for gnome 2.22+
55
settingsDaemonObj = bus.get_object('org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys')
56
settingsDaemonInterface = dbus.Interface(settingsDaemonObj, 'org.gnome.SettingsDaemon.MediaKeys')
57
settingsDaemonInterface.GrabMediaPlayerKeys('Sonata', 0)
59
# mmkeys for gnome 2.18+
60
settingsDaemonObj = bus.get_object('org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon')
61
settingsDaemonInterface = dbus.Interface(settingsDaemonObj, 'org.gnome.SettingsDaemon')
62
settingsDaemonInterface.GrabMediaPlayerKeys('Sonata', 0)
63
settingsDaemonInterface.connect_to_signal('MediaPlayerKeyPressed', lambda app, key:mediaPlayerKeysCallback(mpd_pp, mpd_stop, mpd_prev, mpd_next, app, key))
64
HAVE_GNOME_MMKEYS = True
68
def mediaPlayerKeysCallback(mpd_pp, mpd_stop, mpd_prev, mpd_next, app, key):
70
if key in ('Play', 'PlayPause', 'Pause'):
74
elif key == 'Previous':
79
def get_session_bus():
81
return dbus.SessionBus()
83
print _("Sonata failed to connect to the D-BUS session bus: Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)")
86
def execute_remote_commands(toggle=False, popup=False, start=False):
88
bus = get_session_bus()
89
obj = bus.get_object('org.MPD', '/org/MPD/Sonata')
91
obj.toggle(dbus_interface='org.MPD.SonataInterface')
93
obj.popup(dbus_interface='org.MPD.SonataInterface')
96
print _("Failed to execute remote commands.")
97
if start is None or start:
98
print _("Starting Sonata instead...")
100
print _("Maybe Sonata is not running?")
103
def start_dbus_interface():
106
bus = get_session_bus()
108
retval = bus.request_name("org.MPD.Sonata", dbus_bindings.NAME_FLAG_DO_NOT_QUEUE)
110
retval = dbus_bindings.bus_request_name(bus.get_connection(), "org.MPD.Sonata", dbus_bindings.NAME_FLAG_DO_NOT_QUEUE)
111
if retval in (dbus_bindings.REQUEST_NAME_REPLY_PRIMARY_OWNER, dbus_bindings.REQUEST_NAME_REPLY_ALREADY_OWNER):
113
elif retval in (dbus_bindings.REQUEST_NAME_REPLY_EXISTS, dbus_bindings.REQUEST_NAME_REPLY_IN_QUEUE):
114
print _("An instance of Sonata is already running. Showing it...")
116
obj = bus.get_object('org.MPD', '/org/MPD/Sonata')
117
obj.show(dbus_interface='org.MPD.SonataInterface')
120
print _("Failed to execute remote command.")
128
class SonataDBus(dbus.service.Object):
129
def __init__(self, dbus_show, dbus_toggle, dbus_popup):
130
self.dbus_show = dbus_show
131
self.dbus_toggle = dbus_toggle
132
self.dbus_popup = dbus_popup
133
session_bus = get_session_bus()
134
bus_name = dbus.service.BusName('org.MPD', bus=session_bus)
135
object_path = '/org/MPD/Sonata'
136
dbus.service.Object.__init__(self, bus_name, object_path)
138
@dbus.service.method('org.MPD.SonataInterface')
142
@dbus.service.method('org.MPD.SonataInterface')
146
@dbus.service.method('org.MPD.SonataInterface')