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)
91 dbus_g_proxy_call (keys->proxy,
92 "GrabMediaPlayerKeys", NULL,
93 G_TYPE_STRING, "Evince",
95 G_TYPE_INVALID, G_TYPE_INVALID);
99 ev_media_player_keys_release_keys (EvMediaPlayerKeys *keys)
101 dbus_g_proxy_call (keys->proxy,
102 "ReleaseMediaPlayerKeys", NULL,
103 G_TYPE_STRING, "Evince",
104 G_TYPE_INVALID, G_TYPE_INVALID);
108 ev_media_player_keys_init (EvMediaPlayerKeys *keys)
110 DBusGConnection *connection;
113 connection = dbus_g_bus_get (DBUS_BUS_SESSION, &err);
114 if (connection == NULL) {
115 g_warning ("Error connecting to D-Bus: %s", err->message);
119 /* Try the gnome-settings-daemon version,
120 * then the gnome-control-center version of things */
121 keys->proxy = dbus_g_proxy_new_for_name_owner (connection,
122 "org.gnome.SettingsDaemon",
123 "/org/gnome/SettingsDaemon/MediaKeys",
124 "org.gnome.SettingsDaemon.MediaKeys",
126 if (keys->proxy == NULL) {
127 keys->proxy = dbus_g_proxy_new_for_name_owner (connection,
128 "org.gnome.SettingsDaemon",
129 "/org/gnome/SettingsDaemon",
130 "org.gnome.SettingsDaemon",
134 dbus_g_connection_unref (connection);
136 g_warning ("Failed to create dbus proxy for org.gnome.SettingsDaemon: %s",
141 g_object_unref (keys->proxy);
148 g_object_add_weak_pointer (G_OBJECT (keys->proxy),
149 (gpointer) &(keys->proxy));
151 ev_media_player_keys_grab_keys (keys);
153 dbus_g_object_register_marshaller (ev_marshal_VOID__STRING_STRING,
154 G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
155 dbus_g_proxy_add_signal (keys->proxy, "MediaPlayerKeyPressed",
156 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
158 dbus_g_proxy_connect_signal (keys->proxy, "MediaPlayerKeyPressed",
159 G_CALLBACK (on_media_player_key_pressed), keys, NULL);
163 ev_media_player_keys_focused (EvMediaPlayerKeys *keys)
168 ev_media_player_keys_grab_keys (keys);
172 ev_media_player_keys_finalize (GObject *object)
174 EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (object);
177 ev_media_player_keys_release_keys (keys);
178 g_object_unref (keys->proxy);
182 G_OBJECT_CLASS (ev_media_player_keys_parent_class)->finalize (object);
186 ev_media_player_keys_new (void)
188 return g_object_new (EV_TYPE_MEDIA_PLAYER_KEYS, NULL);