~ubuntu-branches/ubuntu/karmic/sonata/karmic

« back to all changes in this revision

Viewing changes to sonata/dbus_plugin.py

  • Committer: Bazaar Package Importer
  • Author(s): Michal Čihař
  • Date: 2009-05-11 09:10:00 UTC
  • mfrom: (4.2.3 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090511091000-jzspxudws5ngxb5e
Tags: 1.6.2-1
New upstream version (Closes: #528045).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
"""
 
3
This plugin implements D-Bus features for Sonata:
 
4
 
 
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
 
9
 
 
10
XXX Not a real plugin yet.
 
11
 
 
12
Example usage:
 
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...
 
19
"""
 
20
 
 
21
import sys
 
22
 
 
23
try:
 
24
        import dbus, dbus.service
 
25
        if getattr(dbus, "version", (0, 0, 0)) >= (0, 41, 0):
 
26
                import dbus.glib
 
27
        if getattr(dbus, "version", (0, 0, 0)) >= (0, 80, 0):
 
28
                import _dbus_bindings as dbus_bindings
 
29
                NEW_DBUS = True
 
30
        else:
 
31
                import dbus.dbus_bindings as dbus_bindings
 
32
                NEW_DBUS = False
 
33
        HAVE_DBUS = True
 
34
except:
 
35
        HAVE_DBUS = False
 
36
 
 
37
def using_dbus():
 
38
        return HAVE_DBUS
 
39
 
 
40
HAVE_GNOME_MMKEYS = False
 
41
 
 
42
def using_gnome_mediakeys():
 
43
        return HAVE_GNOME_MMKEYS
 
44
 
 
45
def init_gnome_mediakeys(mpd_pp, mpd_stop, mpd_prev, mpd_next):
 
46
        global HAVE_GNOME_MMKEYS
 
47
        if HAVE_DBUS:
 
48
                try:
 
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'):
 
53
                                try:
 
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)
 
58
                                except:
 
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
 
65
                except:
 
66
                        pass
 
67
 
 
68
def mediaPlayerKeysCallback(mpd_pp, mpd_stop, mpd_prev, mpd_next, app, key):
 
69
        if app == 'Sonata':
 
70
                if key in ('Play', 'PlayPause', 'Pause'):
 
71
                        mpd_pp(None)
 
72
                elif key == 'Stop':
 
73
                        mpd_stop(None)
 
74
                elif key == 'Previous':
 
75
                        mpd_prev(None)
 
76
                elif key == 'Next':
 
77
                        mpd_next(None)
 
78
 
 
79
def get_session_bus():
 
80
        try:
 
81
                return dbus.SessionBus()
 
82
        except Exception:
 
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)")
 
84
                raise
 
85
 
 
86
def execute_remote_commands(toggle=False, popup=False, start=False):
 
87
        try:
 
88
                bus = get_session_bus()
 
89
                obj = bus.get_object('org.MPD', '/org/MPD/Sonata')
 
90
                if toggle:
 
91
                        obj.toggle(dbus_interface='org.MPD.SonataInterface')
 
92
                if popup:
 
93
                        obj.popup(dbus_interface='org.MPD.SonataInterface')
 
94
                sys.exit()
 
95
        except Exception:
 
96
                print _("Failed to execute remote commands.")
 
97
                if start is None or start:
 
98
                        print _("Starting Sonata instead...")
 
99
                else:
 
100
                        print _("Maybe Sonata is not running?")
 
101
                        sys.exit(1)
 
102
 
 
103
def start_dbus_interface():
 
104
        if HAVE_DBUS:
 
105
                try:
 
106
                        bus = get_session_bus()
 
107
                        if NEW_DBUS:
 
108
                                retval = bus.request_name("org.MPD.Sonata", dbus_bindings.NAME_FLAG_DO_NOT_QUEUE)
 
109
                        else:
 
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):
 
112
                                pass
 
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...")
 
115
                                try:
 
116
                                        obj = bus.get_object('org.MPD', '/org/MPD/Sonata')
 
117
                                        obj.show(dbus_interface='org.MPD.SonataInterface')
 
118
                                        sys.exit()
 
119
                                except Exception:
 
120
                                        print _("Failed to execute remote command.")
 
121
                                        sys.exit(1)
 
122
                except Exception:
 
123
                        pass
 
124
                except SystemExit:
 
125
                        raise
 
126
 
 
127
if HAVE_DBUS:
 
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)
 
137
 
 
138
                @dbus.service.method('org.MPD.SonataInterface')
 
139
                def show(self):
 
140
                        self.dbus_show()
 
141
 
 
142
                @dbus.service.method('org.MPD.SonataInterface')
 
143
                def toggle(self):
 
144
                        self.dbus_toggle()
 
145
 
 
146
                @dbus.service.method('org.MPD.SonataInterface')
 
147
                def popup(self):
 
148
                        self.dbus_popup()