]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-media-player-keys.c
[dualscreen] fix crash on ctrl+w and fix control window closing
[evince.git] / shell / ev-media-player-keys.c
index 3df271d2911e5a1e75240a6691f1e5592eee5c0d..647a6186795e423bb37e797828ebc3003fed8a90 100644 (file)
@@ -42,7 +42,7 @@ struct _EvMediaPlayerKeys
        GObject        parent;
 
         GDBusProxy *proxy;
-        guint watch_id;
+       gboolean    has_name_owner;
 };
 
 struct _EvMediaPlayerKeysClass
@@ -78,9 +78,27 @@ ev_media_player_keys_class_init (EvMediaPlayerKeysClass *klass)
                              1, G_TYPE_STRING);
 }
 
+static void
+ev_media_player_keys_update_has_name_owner (EvMediaPlayerKeys *keys)
+{
+       gchar *name_owner;
+
+       if (!keys->proxy) {
+               keys->has_name_owner = FALSE;
+               return;
+       }
+
+       name_owner = g_dbus_proxy_get_name_owner (keys->proxy);
+       keys->has_name_owner = (name_owner != NULL);
+       g_free (name_owner);
+}
+
 static void
 ev_media_player_keys_grab_keys (EvMediaPlayerKeys *keys)
 {
+       if (!keys->has_name_owner)
+               return;
+
        /*
         * The uint as second argument is time. We give a very low value so that
         * if a media player is there it gets higher priority on the keys (0 is
@@ -97,6 +115,9 @@ ev_media_player_keys_grab_keys (EvMediaPlayerKeys *keys)
 static void
 ev_media_player_keys_release_keys (EvMediaPlayerKeys *keys)
 {
+       if (!keys->has_name_owner)
+               return;
+
         g_dbus_proxy_call (keys->proxy,
                           "ReleaseMediaPlayerKeys",
                           g_variant_new ("(s)", "Evince"),
@@ -131,48 +152,53 @@ media_player_key_pressed_cb (GDBusProxy *proxy,
 }
 
 static void
-mediakeys_service_appeared_cb (GDBusConnection *connection,
-                              const gchar     *name,
-                              const gchar     *name_owner,
-                              GDBusProxy      *proxy,
-                              gpointer         user_data)
+mediakeys_name_owner_changed (GObject    *object,
+                             GParamSpec *pspec,
+                             gpointer    user_data)
 {
-        EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (user_data);
-
-       keys->proxy = g_object_ref (proxy);
-       g_signal_connect (keys->proxy, "g-signal",
-                         G_CALLBACK (media_player_key_pressed_cb),
-                         keys);
+       EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (user_data);
 
-       ev_media_player_keys_grab_keys (keys);
+       ev_media_player_keys_update_has_name_owner (keys);
 }
 
 static void
-mediakeys_service_disappeared_cb (GDBusConnection *connection,
-                                 const gchar     *name,
-                                 gpointer         user_data)
+mediakeys_service_appeared_cb (GObject      *source_object,
+                              GAsyncResult *res,
+                              gpointer      user_data)
 {
         EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (user_data);
+       GDBusProxy *proxy;
 
-       if (keys->proxy) {
-               g_object_unref (keys->proxy);
-               keys->proxy = NULL;
+       proxy = g_dbus_proxy_new_for_bus_finish (res, NULL);
+
+       if (proxy == NULL) {
+               return;
        }
+
+       g_signal_connect (proxy, "g-signal",
+                         G_CALLBACK (media_player_key_pressed_cb),
+                         keys);
+       g_signal_connect (proxy, "notify::g-name-owner",
+                         G_CALLBACK (mediakeys_name_owner_changed),
+                         keys);
+
+       keys->proxy = proxy;
+       ev_media_player_keys_update_has_name_owner (keys);
+       ev_media_player_keys_grab_keys (keys);
 }
 
 static void
 ev_media_player_keys_init (EvMediaPlayerKeys *keys)
 {
-       keys->watch_id = g_bus_watch_proxy (G_BUS_TYPE_SESSION,
-                                           SD_NAME,
-                                           G_BUS_NAME_WATCHER_FLAGS_NONE,
-                                           SD_OBJECT_PATH,
-                                           SD_INTERFACE,
-                                           G_TYPE_DBUS_PROXY,
-                                           G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
-                                           mediakeys_service_appeared_cb,
-                                           mediakeys_service_disappeared_cb,
-                                           keys, NULL);
+       g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+                                 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+                                 NULL,
+                                 SD_NAME,
+                                 SD_OBJECT_PATH,
+                                 SD_INTERFACE,
+                                 NULL,
+                                 mediakeys_service_appeared_cb,
+                                 keys);
 }
 
 void
@@ -189,13 +215,12 @@ ev_media_player_keys_finalize (GObject *object)
 {
        EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (object);
 
-        ev_media_player_keys_release_keys (keys);
-
-       if (keys->watch_id > 0)
-               g_bus_unwatch_name (keys->watch_id);
-
-        if (keys->proxy != NULL)
+        if (keys->proxy != NULL) {
+               ev_media_player_keys_release_keys (keys);
                 g_object_unref (keys->proxy);
+               keys->proxy = NULL;
+               keys->has_name_owner = FALSE;
+       }
 
        G_OBJECT_CLASS (ev_media_player_keys_parent_class)->finalize (object);
 }