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>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 #include <dbus/dbus-glib.h>
28 #include "ev-media-player-keys.h"
30 #include "ev-marshal.h"
37 struct _EvMediaPlayerKeys
44 struct _EvMediaPlayerKeysClass
46 GObjectClass parent_class;
49 void (* key_pressed) (EvMediaPlayerKeys *keys,
53 static guint signals[LAST_SIGNAL] = { 0 };
55 G_DEFINE_TYPE (EvMediaPlayerKeys, ev_media_player_keys, G_TYPE_OBJECT)
57 static void ev_media_player_keys_finalize (GObject *object);
60 ev_media_player_keys_class_init (EvMediaPlayerKeysClass *klass)
62 GObjectClass *object_class = G_OBJECT_CLASS (klass);
64 signals[KEY_PRESSED] =
65 g_signal_new ("key_pressed",
66 EV_TYPE_MEDIA_PLAYER_KEYS,
68 G_STRUCT_OFFSET (EvMediaPlayerKeysClass, key_pressed),
70 g_cclosure_marshal_VOID__STRING,
74 object_class->finalize = ev_media_player_keys_finalize;
78 on_media_player_key_pressed (DBusGProxy *proxy,
79 const gchar *application,
81 EvMediaPlayerKeys *keys)
83 if (strcmp ("Evince", application) == 0) {
84 g_signal_emit (keys, signals[KEY_PRESSED], 0, key);
89 ev_media_player_keys_grab_keys (EvMediaPlayerKeys *keys)
92 * The uint as second argument is time. We give a very low value so that
93 * if a media player is there it gets higher priority on the keys (0 is
94 * a special value having maximum priority).
96 dbus_g_proxy_call (keys->proxy,
97 "GrabMediaPlayerKeys", NULL,
98 G_TYPE_STRING, "Evince",
100 G_TYPE_INVALID, G_TYPE_INVALID);
104 ev_media_player_keys_release_keys (EvMediaPlayerKeys *keys)
106 dbus_g_proxy_call (keys->proxy,
107 "ReleaseMediaPlayerKeys", NULL,
108 G_TYPE_STRING, "Evince",
109 G_TYPE_INVALID, G_TYPE_INVALID);
113 ev_media_player_keys_init (EvMediaPlayerKeys *keys)
115 DBusGConnection *connection;
118 connection = dbus_g_bus_get (DBUS_BUS_SESSION, &err);
119 if (connection == NULL) {
120 g_warning ("Error connecting to D-Bus: %s", err->message);
124 /* Try the gnome-settings-daemon version,
125 * then the gnome-control-center version of things */
126 keys->proxy = dbus_g_proxy_new_for_name_owner (connection,
127 "org.gnome.SettingsDaemon",
128 "/org/gnome/SettingsDaemon/MediaKeys",
129 "org.gnome.SettingsDaemon.MediaKeys",
131 if (keys->proxy == NULL) {
132 keys->proxy = dbus_g_proxy_new_for_name_owner (connection,
133 "org.gnome.SettingsDaemon",
134 "/org/gnome/SettingsDaemon",
135 "org.gnome.SettingsDaemon",
139 dbus_g_connection_unref (connection);
141 g_warning ("Failed to create dbus proxy for org.gnome.SettingsDaemon: %s",
146 g_object_unref (keys->proxy);
153 g_object_add_weak_pointer (G_OBJECT (keys->proxy),
154 (gpointer) &(keys->proxy));
156 ev_media_player_keys_grab_keys (keys);
158 dbus_g_object_register_marshaller (ev_marshal_VOID__STRING_STRING,
159 G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
160 dbus_g_proxy_add_signal (keys->proxy, "MediaPlayerKeyPressed",
161 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
163 dbus_g_proxy_connect_signal (keys->proxy, "MediaPlayerKeyPressed",
164 G_CALLBACK (on_media_player_key_pressed), keys, NULL);
168 ev_media_player_keys_focused (EvMediaPlayerKeys *keys)
173 ev_media_player_keys_grab_keys (keys);
177 ev_media_player_keys_finalize (GObject *object)
179 EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (object);
182 ev_media_player_keys_release_keys (keys);
183 g_object_unref (keys->proxy);
187 G_OBJECT_CLASS (ev_media_player_keys_parent_class)->finalize (object);
191 ev_media_player_keys_new (void)
193 return g_object_new (EV_TYPE_MEDIA_PLAYER_KEYS, NULL);