1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2007 Jan Arne Petersen <jap@gnome.org>
4 * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
5 * Copyright © 2010 Christian Persch
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 #include "ev-media-player-keys.h"
31 #define SD_NAME "org.gnome.SettingsDaemon"
32 #define SD_OBJECT_PATH "/org/gnome/SettingsDaemon/MediaKeys"
33 #define SD_INTERFACE "org.gnome.SettingsDaemon.MediaKeys"
40 struct _EvMediaPlayerKeys
45 gboolean has_name_owner;
48 struct _EvMediaPlayerKeysClass
50 GObjectClass parent_class;
53 void (* key_pressed) (EvMediaPlayerKeys *keys,
57 static guint signals[LAST_SIGNAL];
59 G_DEFINE_TYPE (EvMediaPlayerKeys, ev_media_player_keys, G_TYPE_OBJECT)
61 static void ev_media_player_keys_finalize (GObject *object);
64 ev_media_player_keys_class_init (EvMediaPlayerKeysClass *klass)
66 GObjectClass *object_class = G_OBJECT_CLASS (klass);
68 object_class->finalize = ev_media_player_keys_finalize;
70 signals[KEY_PRESSED] =
71 g_signal_new ("key_pressed",
72 EV_TYPE_MEDIA_PLAYER_KEYS,
74 G_STRUCT_OFFSET (EvMediaPlayerKeysClass, key_pressed),
76 g_cclosure_marshal_VOID__STRING,
82 ev_media_player_keys_update_has_name_owner (EvMediaPlayerKeys *keys)
87 keys->has_name_owner = FALSE;
91 name_owner = g_dbus_proxy_get_name_owner (keys->proxy);
92 keys->has_name_owner = (name_owner != NULL);
97 ev_media_player_keys_grab_keys (EvMediaPlayerKeys *keys)
99 if (!keys->has_name_owner)
103 * The uint as second argument is time. We give a very low value so that
104 * if a media player is there it gets higher priority on the keys (0 is
105 * a special value having maximum priority).
107 g_dbus_proxy_call (keys->proxy,
108 "GrabMediaPlayerKeys",
109 g_variant_new ("(su)", "Evince", 1),
110 G_DBUS_CALL_FLAGS_NO_AUTO_START,
116 ev_media_player_keys_release_keys (EvMediaPlayerKeys *keys)
118 if (!keys->has_name_owner)
121 g_dbus_proxy_call (keys->proxy,
122 "ReleaseMediaPlayerKeys",
123 g_variant_new ("(s)", "Evince"),
124 G_DBUS_CALL_FLAGS_NO_AUTO_START,
130 media_player_key_pressed_cb (GDBusProxy *proxy,
133 GVariant *parameters,
136 const char *application, *key;
138 if (g_strcmp0 (sender_name, SD_NAME) != 0)
141 if (g_strcmp0 (signal_name, "MediaPlayerKeyPressed") != 0)
144 if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(ss)")))
147 g_variant_get (parameters, "(&s&s)", &application, &key);
149 if (strcmp ("Evince", application) == 0) {
150 g_signal_emit (user_data, signals[KEY_PRESSED], 0, key);
155 mediakeys_name_owner_changed (GObject *object,
159 EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (user_data);
161 ev_media_player_keys_update_has_name_owner (keys);
165 mediakeys_service_appeared_cb (GObject *source_object,
169 EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (user_data);
172 proxy = g_dbus_proxy_new_for_bus_finish (res, NULL);
178 g_signal_connect (proxy, "g-signal",
179 G_CALLBACK (media_player_key_pressed_cb),
181 g_signal_connect (proxy, "notify::g-name-owner",
182 G_CALLBACK (mediakeys_name_owner_changed),
186 ev_media_player_keys_update_has_name_owner (keys);
187 ev_media_player_keys_grab_keys (keys);
191 ev_media_player_keys_init (EvMediaPlayerKeys *keys)
193 g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
194 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
200 mediakeys_service_appeared_cb,
205 ev_media_player_keys_focused (EvMediaPlayerKeys *keys)
207 if (keys->proxy == NULL)
210 ev_media_player_keys_grab_keys (keys);
214 ev_media_player_keys_finalize (GObject *object)
216 EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (object);
218 if (keys->proxy != NULL) {
219 ev_media_player_keys_release_keys (keys);
220 g_object_unref (keys->proxy);
222 keys->has_name_owner = FALSE;
225 G_OBJECT_CLASS (ev_media_player_keys_parent_class)->finalize (object);
229 ev_media_player_keys_new (void)
231 return g_object_new (EV_TYPE_MEDIA_PLAYER_KEYS, NULL);