[gnome-music/wip/jfelder/multimedia-keys: 2/3] window: Create media_keys_proxy only once
- From: Jean Felder <jfelder src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/jfelder/multimedia-keys: 2/3] window: Create media_keys_proxy only once
- Date: Fri, 23 Feb 2018 23:19:47 +0000 (UTC)
commit 27ac5aa18d172bda68fc7b6400b7e22fd9bb5ac9
Author: Jean Felder <jfelder src gnome org>
Date: Wed Feb 21 11:05:50 2018 +0100
window: Create media_keys_proxy only once
Refactor media_player_keys code.
Make all the calls async.
Correctly register warnings and errors from media_keys.
gnomemusic/window.py | 75 +++++++++++++++++++++++++++++++++-------------------
1 file changed, 48 insertions(+), 27 deletions(-)
---
diff --git a/gnomemusic/window.py b/gnomemusic/window.py
index 18a19d1..2882ea5 100644
--- a/gnomemusic/window.py
+++ b/gnomemusic/window.py
@@ -67,7 +67,6 @@ class Window(Gtk.ApplicationWindow):
def __init__(self, app):
super().__init__(application=app, title=_("Music"))
- self.connect('focus-in-event', self._windows_focus_cb)
self.settings = Gio.Settings.new('org.gnome.Music')
self.add_action(self.settings.create_action('repeat'))
self.set_size_request(200, 100)
@@ -93,6 +92,9 @@ class Window(Gtk.ApplicationWindow):
self.notifications_popup = NotificationsPopup()
self._overlay.add_overlay(self.notifications_popup)
+ self._media_keys_proxy = None
+ self._init_media_keys_proxy()
+
self.window_size_update_timeout = None
self.connect("window-state-event", self._on_window_state_event)
self.connect("configure-event", self._on_configure_event)
@@ -144,42 +146,61 @@ class Window(Gtk.ApplicationWindow):
self.settings.set_boolean('window-maximized', 'GDK_WINDOW_STATE_MAXIMIZED' in
event.new_window_state.value_names)
@log
- def _grab_media_player_keys(self):
- self.proxy = Gio.DBusProxy.new_sync(Gio.bus_get_sync(Gio.BusType.SESSION, None),
- Gio.DBusProxyFlags.NONE,
- None,
- 'org.gnome.SettingsDaemon.MediaKeys',
- '/org/gnome/SettingsDaemon/MediaKeys',
- 'org.gnome.SettingsDaemon.MediaKeys',
- None)
- self.proxy.call_sync('GrabMediaPlayerKeys',
- GLib.Variant('(su)', ('Music', 0)),
- Gio.DBusCallFlags.NONE,
- -1,
- None)
- self.proxy.connect('g-signal', self._handle_media_keys)
+ def _init_media_keys_proxy(self):
+ def name_appeared(connection, name, name_owner, data=None):
+ Gio.DBusProxy.new_for_bus(
+ Gio.BusType.SESSION,
+ Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES, None,
+ "org.gnome.SettingsDaemon.MediaKeys",
+ "/org/gnome/SettingsDaemon/MediaKeys",
+ "org.gnome.SettingsDaemon.MediaKeys", None,
+ self._media_keys_proxy_ready)
+
+ Gio.bus_watch_name(
+ Gio.BusType.SESSION, "org.gnome.SettingsDaemon.MediaKeys",
+ Gio.BusNameWatcherFlags.NONE, name_appeared, None)
@log
- def _windows_focus_cb(self, window, event):
+ def _media_keys_proxy_ready(self, proxy, result, data=None):
try:
- self._grab_media_player_keys()
- except GLib.GError:
- # We cannot grab media keys if no settings daemon is running
- pass
+ self._media_keys_proxy = proxy.new_finish(result)
+ except GLib.Error as e:
+ logger.warning(
+ "Error: Failed to contact settings daemon:", e.message)
+ return
+
+ self._grab_media_player_keys()
+ self._media_keys_proxy.connect(
+ "g-signal", self._handle_media_keys)
+ self.connect("focus-in-event", self._grab_media_player_keys)
+
+ @log
+ def _grab_media_player_keys(self, window=None, event=None):
+ def proxy_call_finished(proxy, result, data=None):
+ try:
+ proxy.call_finish(result)
+ except GLib.Error as e:
+ logger.warning(
+ "Error: Failed to grab mediaplayer keys: {}".format(
+ e.message))
+
+ self._media_keys_proxy.call(
+ "GrabMediaPlayerKeys", GLib.Variant("(su)", ("Music", 0)),
+ Gio.DBusCallFlags.NONE, -1, None, proxy_call_finished)
@log
def _handle_media_keys(self, proxy, sender, signal, parameters):
- if signal != 'MediaPlayerKeyPressed':
- print('Received an unexpected signal \'%s\' from media player'.format(signal))
+ app, response = parameters.unpack()
+ if app != "Music":
return
- response = parameters.get_child_value(1).get_string()
- if 'Play' in response:
+
+ if "Play" in response:
self.player.play_pause()
- elif 'Stop' in response:
+ elif "Stop" in response:
self.player.Stop()
- elif 'Next' in response:
+ elif "Next" in response:
self.player.play_next()
- elif 'Previous' in response:
+ elif "Previous" in response:
self.player.play_previous()
@log
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]