X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-media-player-keys.c;h=647a6186795e423bb37e797828ebc3003fed8a90;hb=6935cbce7dce37600abe92eec6344ffde0cc6bae;hp=a022eafb405d46ef65b91874054bea9747915232;hpb=da0bcf04db79c1ae4141422537379cef8abd252a;p=evince.git diff --git a/shell/ev-media-player-keys.c b/shell/ev-media-player-keys.c index a022eafb..647a6186 100644 --- a/shell/ev-media-player-keys.c +++ b/shell/ev-media-player-keys.c @@ -42,6 +42,7 @@ struct _EvMediaPlayerKeys GObject parent; GDBusProxy *proxy; + gboolean has_name_owner; }; struct _EvMediaPlayerKeysClass @@ -77,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 @@ -96,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"), @@ -129,6 +151,16 @@ media_player_key_pressed_cb (GDBusProxy *proxy, } } +static void +mediakeys_name_owner_changed (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (user_data); + + ev_media_player_keys_update_has_name_owner (keys); +} + static void mediakeys_service_appeared_cb (GObject *source_object, GAsyncResult *res, @@ -146,8 +178,12 @@ mediakeys_service_appeared_cb (GObject *source_object, 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); } @@ -183,6 +219,7 @@ ev_media_player_keys_finalize (GObject *object) 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);