X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-media-player-keys.c;h=647a6186795e423bb37e797828ebc3003fed8a90;hb=4f8bc8db98020835d2c4d39c902a296b784cf030;hp=da334b6cf14ccade8dcaff6eff8ae67ea053a5ec;hpb=6510e36591c3187ddb926011c0f6e1d4c78a57c7;p=evince.git diff --git a/shell/ev-media-player-keys.c b/shell/ev-media-player-keys.c index da334b6c..647a6186 100644 --- a/shell/ev-media-player-keys.c +++ b/shell/ev-media-player-keys.c @@ -2,6 +2,7 @@ /* * Copyright (C) 2007 Jan Arne Petersen * Copyright (C) 2008 Bastien Nocera + * Copyright © 2010 Christian Persch * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,9 +41,8 @@ struct _EvMediaPlayerKeys { GObject parent; - GDBusConnection *connection; - guint watch_id; - guint subscription_id; + GDBusProxy *proxy; + gboolean has_name_owner; }; struct _EvMediaPlayerKeysClass @@ -65,6 +65,8 @@ ev_media_player_keys_class_init (EvMediaPlayerKeysClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = ev_media_player_keys_finalize; + signals[KEY_PRESSED] = g_signal_new ("key_pressed", EV_TYPE_MEDIA_PLAYER_KEYS, @@ -74,56 +76,68 @@ ev_media_player_keys_class_init (EvMediaPlayerKeysClass *klass) g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); - - object_class->finalize = ev_media_player_keys_finalize; +} + +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 * a special value having maximum priority). */ - g_dbus_connection_call (keys->connection, - SD_NAME, - SD_OBJECT_PATH, - SD_INTERFACE, - "GrabMediaPlayerKeys", - g_variant_new ("(su)", "Evince", 1), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - -1, - NULL, NULL, NULL); + g_dbus_proxy_call (keys->proxy, + "GrabMediaPlayerKeys", + g_variant_new ("(su)", "Evince", 1), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, + NULL, NULL, NULL); } static void ev_media_player_keys_release_keys (EvMediaPlayerKeys *keys) { - g_dbus_connection_call (keys->connection, - SD_NAME, - SD_OBJECT_PATH, - SD_INTERFACE, - "ReleaseMediaPlayerKeys", - g_variant_new ("(s)", "Evince"), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - -1, - NULL, NULL, NULL); + if (!keys->has_name_owner) + return; + + g_dbus_proxy_call (keys->proxy, + "ReleaseMediaPlayerKeys", + g_variant_new ("(s)", "Evince"), + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, + NULL, NULL, NULL); } static void -media_player_key_pressed_cb (GDBusConnection *connection, - const gchar *sender_name, - const gchar *object_path, - const gchar *interface_name, - const gchar *signal_name, - GVariant *parameters, - gpointer user_data) +media_player_key_pressed_cb (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) { const char *application, *key; if (g_strcmp0 (sender_name, SD_NAME) != 0) return; + if (g_strcmp0 (signal_name, "MediaPlayerKeyPressed") != 0) return; @@ -138,61 +152,59 @@ media_player_key_pressed_cb (GDBusConnection *connection, } static void -mediakeys_service_appeared_cb (GDBusConnection *connection, - const char *name, - const char *name_owner, - gpointer user_data) +mediakeys_name_owner_changed (GObject *object, + GParamSpec *pspec, + gpointer user_data) { - EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (user_data); + EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (user_data); - keys->connection = g_object_ref (connection); - - keys->subscription_id = g_dbus_connection_signal_subscribe (connection, - name_owner, - SD_INTERFACE, - "MediaPlayerKeyPressed", - SD_OBJECT_PATH, - NULL, - media_player_key_pressed_cb, - keys, NULL); - - 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 char *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->connection == NULL) - return; + proxy = g_dbus_proxy_new_for_bus_finish (res, NULL); - g_assert (keys->connection == connection); + if (proxy == NULL) { + return; + } - g_dbus_connection_signal_unsubscribe (connection, keys->subscription_id); - keys->subscription_id = 0; + 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); - g_object_unref (keys->connection); - keys->connection = NULL; + 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_name (G_BUS_TYPE_SESSION, - SD_NAME, - G_BUS_NAME_WATCHER_FLAGS_NONE, - 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 ev_media_player_keys_focused (EvMediaPlayerKeys *keys) { - if (keys->connection == NULL) + if (keys->proxy == NULL) return; ev_media_player_keys_grab_keys (keys); @@ -203,15 +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->subscription_id != 0) { - g_assert (keys->connection != NULL); - g_dbus_connection_signal_unsubscribe (keys->connection, keys->subscription_id); - g_object_unref (keys->connection); - } - - g_bus_unwatch_name (keys->watch_id); + 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); }