[gnome-music/wip/jfelder/multimedia-keys: 2/3] window: Create media_keys_proxy only once



commit 75ef5a3f1042d2224b43273c015b3bdc4527ff31
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 | 76 +++++++++++++++++++++++++++++++++-------------------
 1 file changed, 49 insertions(+), 27 deletions(-)
---
diff --git a/gnomemusic/window.py b/gnomemusic/window.py
index 18a19d1..cfb6342 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,62 @@ 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_appearead(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_appearead, None)
+        self.connect("focus-in-event", self._grab_media_player_keys)
 
     @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)
+
+        self._grab_media_player_keys()
+        self._media_keys_proxy.connect(
+            "g-signal", self._handle_media_keys)
+
+    @log
+    def _grab_media_player_keys(self, window=None, event=None):
+        if not self._media_keys_proxy:
+            return
+
+        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:", 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]