]> www.fi.muni.cz Git - evince.git/blob - shell/ev-media-player-keys.c
Replace GTK_WIDGET_IS_SENSITIVE() with gtk_widget_is_sensitive()
[evince.git] / shell / ev-media-player-keys.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /* 
3  * Copyright (C) 2007 Jan Arne Petersen <jap@gnome.org>
4  * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
5  *
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.
10  *
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.
15  *
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.
19  *
20  */
21
22 #include "config.h"
23
24 #include <glib.h>
25 #include <dbus/dbus-glib.h>
26 #include <string.h>
27
28 #include "ev-media-player-keys.h"
29
30 #include "ev-marshal.h"
31
32 enum {
33         KEY_PRESSED,
34         LAST_SIGNAL
35 };
36
37 struct _EvMediaPlayerKeys
38 {
39         GObject        parent;
40         
41         DBusGProxy    *proxy;
42 };
43
44 struct _EvMediaPlayerKeysClass
45 {
46         GObjectClass parent_class;
47
48         /* Signals */
49         void (* key_pressed) (EvMediaPlayerKeys *keys,
50                               const gchar       *key);
51 };
52
53 static guint signals[LAST_SIGNAL] = { 0 };
54
55 G_DEFINE_TYPE (EvMediaPlayerKeys, ev_media_player_keys, G_TYPE_OBJECT)
56
57 static void ev_media_player_keys_finalize (GObject *object);
58
59 static void
60 ev_media_player_keys_class_init (EvMediaPlayerKeysClass *klass)
61 {
62         GObjectClass *object_class = G_OBJECT_CLASS (klass);
63
64         signals[KEY_PRESSED] =
65                 g_signal_new ("key_pressed",
66                               EV_TYPE_MEDIA_PLAYER_KEYS,
67                               G_SIGNAL_RUN_LAST,
68                               G_STRUCT_OFFSET (EvMediaPlayerKeysClass, key_pressed),
69                               NULL, NULL,
70                               g_cclosure_marshal_VOID__STRING,
71                               G_TYPE_NONE,
72                               1, G_TYPE_STRING);
73         
74         object_class->finalize = ev_media_player_keys_finalize;
75 }
76
77 static void
78 on_media_player_key_pressed (DBusGProxy        *proxy,
79                              const gchar       *application,
80                              const gchar       *key,
81                              EvMediaPlayerKeys *keys)
82 {
83         if (strcmp ("Evince", application) == 0) {
84                 g_signal_emit (keys, signals[KEY_PRESSED], 0, key);
85         }
86 }
87
88 static void
89 ev_media_player_keys_grab_keys (EvMediaPlayerKeys *keys)
90 {
91         /*
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).
95          */
96         dbus_g_proxy_call (keys->proxy,
97                            "GrabMediaPlayerKeys", NULL,
98                            G_TYPE_STRING, "Evince",
99                            G_TYPE_UINT, 1,
100                            G_TYPE_INVALID, G_TYPE_INVALID);
101 }
102
103 static void
104 ev_media_player_keys_release_keys (EvMediaPlayerKeys *keys)
105 {
106         dbus_g_proxy_call (keys->proxy,
107                            "ReleaseMediaPlayerKeys", NULL,
108                            G_TYPE_STRING, "Evince",
109                            G_TYPE_INVALID, G_TYPE_INVALID);
110 }
111
112 static void
113 ev_media_player_keys_init (EvMediaPlayerKeys *keys)
114 {
115         DBusGConnection *connection;
116         GError *err = NULL;
117
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);
121                 return;
122         }
123
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",
130                                                        NULL);
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",
136                                                                &err);
137         }
138
139         dbus_g_connection_unref (connection);
140         if (err != NULL) {
141                 g_warning ("Failed to create dbus proxy for org.gnome.SettingsDaemon: %s",
142                            err->message);
143                 g_error_free (err);
144                 
145                 if (keys->proxy) {
146                         g_object_unref (keys->proxy);
147                         keys->proxy = NULL;
148                 }
149                 
150                 return;
151         }
152
153         g_object_add_weak_pointer (G_OBJECT (keys->proxy),
154                                    (gpointer) &(keys->proxy));
155
156         ev_media_player_keys_grab_keys (keys);
157
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);
162
163         dbus_g_proxy_connect_signal (keys->proxy, "MediaPlayerKeyPressed",
164                                      G_CALLBACK (on_media_player_key_pressed), keys, NULL);
165 }
166
167 void
168 ev_media_player_keys_focused (EvMediaPlayerKeys *keys)
169 {
170         if (!keys->proxy)
171                 return;
172         
173         ev_media_player_keys_grab_keys (keys);
174 }
175
176 static void
177 ev_media_player_keys_finalize (GObject *object)
178 {
179         EvMediaPlayerKeys *keys = EV_MEDIA_PLAYER_KEYS (object);
180
181         if (keys->proxy) {
182                 ev_media_player_keys_release_keys (keys);
183                 g_object_unref (keys->proxy);
184                 keys->proxy = NULL;
185         }
186
187         G_OBJECT_CLASS (ev_media_player_keys_parent_class)->finalize (object);
188 }
189
190 EvMediaPlayerKeys *
191 ev_media_player_keys_new (void)
192 {
193         return g_object_new (EV_TYPE_MEDIA_PLAYER_KEYS, NULL);
194 }
195