File: | plugins/media-keys/csd_media-keys-manager.c |
Warning: | line 602, column 25 Value stored to 'score' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* |
2 | * Copyright (C) 2001-2003 Bastien Nocera <hadess@hadess.net> |
3 | * Copyright (C) 2006-2007 William Jon McCann <mccann@jhu.edu> |
4 | * Copyright (C) 2014 Michal Ratajsky <michal.ratajsky@gmail.com> |
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 St, Fifth Floor, Boston, MA 02110-1301, USA. |
19 | * |
20 | */ |
21 | |
22 | #include "config.h" |
23 | |
24 | #include <glib.h> |
25 | #include <glib/gi18n.h> |
26 | #include <cdk/cdk.h> |
27 | #include <cdk/cdkx.h> |
28 | #include <ctk/ctk.h> |
29 | #include <gio/gio.h> |
30 | |
31 | #include <dbus/dbus-glib.h> |
32 | #include <dbus/dbus-glib-lowlevel.h> |
33 | |
34 | #ifdef HAVE_LIBCAFEMIXER1 |
35 | #include <libcafemixer/cafemixer.h> |
36 | #endif |
37 | |
38 | #ifdef HAVE_LIBKANBERRA1 |
39 | #include <kanberra-ctk.h> |
40 | #endif |
41 | |
42 | #include "cafe-settings-profile.h" |
43 | #include "csd_marshal.h" |
44 | #include "csd_media-keys-manager.h" |
45 | #include "csd_media-keys-manager-glue.h" |
46 | |
47 | #include "eggaccelerators.h" |
48 | #include "acme.h" |
49 | #include "csd_media-keys-window.h" |
50 | #include "csd_input-helper.h" |
51 | |
52 | #define CSD_DBUS_PATH"/org/cafe/SettingsDaemon" "/org/cafe/SettingsDaemon" |
53 | #define CSD_DBUS_NAME"org.cafe.SettingsDaemon" "org.cafe.SettingsDaemon" |
54 | #define CSD_MEDIA_KEYS_DBUS_PATH"/org/cafe/SettingsDaemon" "/MediaKeys" CSD_DBUS_PATH"/org/cafe/SettingsDaemon" "/MediaKeys" |
55 | #define CSD_MEDIA_KEYS_DBUS_NAME"org.cafe.SettingsDaemon" ".MediaKeys" CSD_DBUS_NAME"org.cafe.SettingsDaemon" ".MediaKeys" |
56 | |
57 | #define TOUCHPAD_SCHEMA"org.cafe.peripherals-touchpad" "org.cafe.peripherals-touchpad" |
58 | #define TOUCHPAD_ENABLED_KEY"touchpad-enabled" "touchpad-enabled" |
59 | |
60 | typedef struct { |
61 | char *application; |
62 | guint32 time; |
63 | } MediaPlayer; |
64 | |
65 | struct _CsdMediaKeysManagerPrivate |
66 | { |
67 | #ifdef HAVE_LIBCAFEMIXER1 |
68 | /* Volume bits */ |
69 | CafeMixerContext *context; |
70 | CafeMixerStream *stream; |
71 | CafeMixerStream *source_stream; |
72 | CafeMixerStreamControl *control; |
73 | CafeMixerStreamControl *source_control; |
74 | #endif |
75 | CtkWidget *dialog; |
76 | GSettings *settings; |
77 | GVolumeMonitor *volume_monitor; |
78 | |
79 | /* Multihead stuff */ |
80 | CdkScreen *current_screen; |
81 | GSList *screens; |
82 | |
83 | /* RFKill stuff */ |
84 | guint rfkill_watch_id; |
85 | GDBusProxy *rfkill_proxy; |
86 | GCancellable *rfkill_cancellable; |
87 | |
88 | GList *media_players; |
89 | |
90 | DBusGConnection *connection; |
91 | guint notify[HANDLED_KEYS]; |
92 | }; |
93 | |
94 | enum { |
95 | MEDIA_PLAYER_KEY_PRESSED, |
96 | LAST_SIGNAL |
97 | }; |
98 | |
99 | static guint signals[LAST_SIGNAL] = { 0 }; |
100 | |
101 | G_DEFINE_TYPE_WITH_PRIVATE (CsdMediaKeysManager, csd_media_keys_manager, G_TYPE_OBJECT)static void csd_media_keys_manager_init (CsdMediaKeysManager * self); static void csd_media_keys_manager_class_init (CsdMediaKeysManagerClass *klass); static GType csd_media_keys_manager_get_type_once ( void); static gpointer csd_media_keys_manager_parent_class = ( (void*)0); static gint CsdMediaKeysManager_private_offset; static void csd_media_keys_manager_class_intern_init (gpointer klass ) { csd_media_keys_manager_parent_class = g_type_class_peek_parent (klass); if (CsdMediaKeysManager_private_offset != 0) g_type_class_adjust_private_offset (klass, &CsdMediaKeysManager_private_offset); csd_media_keys_manager_class_init ((CsdMediaKeysManagerClass*) klass); } __attribute__ ((__unused__ )) static inline gpointer csd_media_keys_manager_get_instance_private (CsdMediaKeysManager *self) { return (((gpointer) ((guint8*) (self) + (glong) (CsdMediaKeysManager_private_offset)))); } GType csd_media_keys_manager_get_type (void) { static GType static_g_define_type_id = 0; if ((__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id ) == sizeof (gpointer), "Expression evaluates to false"); (void ) (0 ? (gpointer) * (&static_g_define_type_id) : ((void*) 0)); (!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id ) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (*(&static_g_define_type_id)) gapg_temp_newval; __typeof__ ((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id ); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5) ; gapg_temp_newval; })) && g_once_init_enter_pointer ( &static_g_define_type_id)); })) ) { GType g_define_type_id = csd_media_keys_manager_get_type_once (); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id) == sizeof (gpointer), "Expression evaluates to false"); 0 ? (void) (*( &static_g_define_type_id) = (g_define_type_id)) : (void) 0 ; g_once_init_leave_pointer ((&static_g_define_type_id), ( gpointer) (guintptr) (g_define_type_id)); })) ; } return static_g_define_type_id ; } __attribute__ ((__noinline__)) static GType csd_media_keys_manager_get_type_once (void) { GType g_define_type_id = g_type_register_static_simple (((GType) ((20) << (2))), g_intern_static_string ("CsdMediaKeysManager" ), sizeof (CsdMediaKeysManagerClass), (GClassInitFunc)(void ( *)(void)) csd_media_keys_manager_class_intern_init, sizeof (CsdMediaKeysManager ), (GInstanceInitFunc)(void (*)(void)) csd_media_keys_manager_init , (GTypeFlags) 0); { {{ CsdMediaKeysManager_private_offset = g_type_add_instance_private (g_define_type_id, sizeof (CsdMediaKeysManagerPrivate)); };} } return g_define_type_id; } |
102 | |
103 | static gpointer manager_object = NULL((void*)0); |
104 | |
105 | static void |
106 | init_screens (CsdMediaKeysManager *manager) |
107 | { |
108 | CdkDisplay *display; |
109 | |
110 | display = cdk_display_get_default (); |
111 | |
112 | CdkScreen *screen; |
113 | |
114 | screen = cdk_display_get_default_screen (display); |
115 | |
116 | if (screen != NULL((void*)0)) { |
117 | manager->priv->screens = g_slist_append (manager->priv->screens, screen); |
118 | } |
119 | |
120 | manager->priv->current_screen = manager->priv->screens->data; |
121 | } |
122 | |
123 | static void |
124 | acme_error (char * msg) |
125 | { |
126 | CtkWidget *error_dialog; |
127 | |
128 | error_dialog = ctk_message_dialog_new (NULL((void*)0), |
129 | CTK_DIALOG_MODAL, |
130 | CTK_MESSAGE_ERROR, |
131 | CTK_BUTTONS_OK, |
132 | msg, NULL((void*)0)); |
133 | ctk_dialog_set_default_response (CTK_DIALOG (error_dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((error_dialog)), ((ctk_dialog_get_type ())))))), |
134 | CTK_RESPONSE_OK); |
135 | ctk_widget_show (error_dialog); |
136 | g_signal_connect (error_dialog,g_signal_connect_data ((error_dialog), ("response"), (((GCallback ) (ctk_widget_destroy))), (((void*)0)), ((void*)0), (GConnectFlags ) 0) |
137 | "response",g_signal_connect_data ((error_dialog), ("response"), (((GCallback ) (ctk_widget_destroy))), (((void*)0)), ((void*)0), (GConnectFlags ) 0) |
138 | G_CALLBACK (ctk_widget_destroy),g_signal_connect_data ((error_dialog), ("response"), (((GCallback ) (ctk_widget_destroy))), (((void*)0)), ((void*)0), (GConnectFlags ) 0) |
139 | NULL)g_signal_connect_data ((error_dialog), ("response"), (((GCallback ) (ctk_widget_destroy))), (((void*)0)), ((void*)0), (GConnectFlags ) 0); |
140 | } |
141 | |
142 | static char * |
143 | get_term_command (CsdMediaKeysManager *manager G_GNUC_UNUSED__attribute__ ((__unused__))) |
144 | { |
145 | char *cmd_term, *cmd_args; |
146 | char *cmd = NULL((void*)0); |
147 | GSettings *settings; |
148 | |
149 | settings = g_settings_new ("org.cafe.applications-terminal"); |
150 | cmd_term = g_settings_get_string (settings, "exec"); |
151 | cmd_args = g_settings_get_string (settings, "exec-arg"); |
152 | |
153 | if (cmd_term[0] != '\0') { |
154 | cmd = g_strdup_printf ("%s %s -e", cmd_term, cmd_args); |
155 | } else { |
156 | cmd = g_strdup_printf ("cafe-terminal -e"); |
157 | } |
158 | |
159 | g_free (cmd_args); |
160 | g_free (cmd_term); |
161 | g_object_unref (settings); |
162 | |
163 | return cmd; |
164 | } |
165 | |
166 | static void |
167 | execute (CsdMediaKeysManager *manager, |
168 | char *cmd, |
169 | gboolean sync, |
170 | gboolean need_term) |
171 | { |
172 | gboolean retval; |
173 | char **argv; |
174 | int argc; |
175 | char *exec; |
176 | char *term = NULL((void*)0); |
177 | |
178 | retval = FALSE(0); |
179 | |
180 | if (need_term) { |
181 | term = get_term_command (manager); |
182 | if (term == NULL((void*)0)) { |
183 | acme_error (_("Could not get default terminal. Verify that your default "gettext ("Could not get default terminal. Verify that your default " "terminal command is set and points to a valid application." ) |
184 | "terminal command is set and points to a valid application.")gettext ("Could not get default terminal. Verify that your default " "terminal command is set and points to a valid application." )); |
185 | return; |
186 | } |
187 | } |
188 | |
189 | if (term) { |
190 | exec = g_strdup_printf ("%s %s", term, cmd); |
191 | g_free (term); |
192 | } else { |
193 | exec = g_strdup (cmd)g_strdup_inline (cmd); |
194 | } |
195 | |
196 | if (g_shell_parse_argv (exec, &argc, &argv, NULL((void*)0))) { |
197 | if (sync != FALSE(0)) { |
198 | retval = g_spawn_sync (g_get_home_dir (), |
199 | argv, |
200 | NULL((void*)0), |
201 | G_SPAWN_SEARCH_PATH, |
202 | NULL((void*)0), |
203 | NULL((void*)0), |
204 | NULL((void*)0), |
205 | NULL((void*)0), |
206 | NULL((void*)0), |
207 | NULL((void*)0)); |
208 | } else { |
209 | retval = g_spawn_async (g_get_home_dir (), |
210 | argv, |
211 | NULL((void*)0), |
212 | G_SPAWN_SEARCH_PATH, |
213 | NULL((void*)0), |
214 | NULL((void*)0), |
215 | NULL((void*)0), |
216 | NULL((void*)0)); |
217 | } |
218 | g_strfreev (argv); |
219 | } |
220 | |
221 | if (retval == FALSE(0)) { |
222 | char *msg; |
223 | msg = g_strdup_printf (_("Couldn't execute command: %s\n"gettext ("Couldn't execute command: %s\n" "Verify that this is a valid command." ) |
224 | "Verify that this is a valid command.")gettext ("Couldn't execute command: %s\n" "Verify that this is a valid command." ), |
225 | exec); |
226 | |
227 | acme_error (msg); |
228 | g_free (msg); |
229 | } |
230 | g_free (exec); |
231 | } |
232 | |
233 | static void |
234 | dialog_init (CsdMediaKeysManager *manager) |
235 | { |
236 | if (manager->priv->dialog != NULL((void*)0) |
237 | && !csd_osd_window_is_valid (CSD_OSD_WINDOW (manager->priv->dialog)((((CsdOsdWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((manager->priv->dialog)), ((csd_osd_window_get_type ())))))))) { |
238 | ctk_widget_destroy (manager->priv->dialog); |
239 | manager->priv->dialog = NULL((void*)0); |
240 | } |
241 | |
242 | if (manager->priv->dialog == NULL((void*)0)) { |
243 | manager->priv->dialog = csd_media_keys_window_new (); |
244 | } |
245 | } |
246 | |
247 | static gboolean |
248 | is_valid_shortcut (const char *string) |
249 | { |
250 | if (string == NULL((void*)0) || string[0] == '\0') { |
251 | return FALSE(0); |
252 | } |
253 | if (strcmp (string, "disabled") == 0) { |
254 | return FALSE(0); |
255 | } |
256 | |
257 | return TRUE(!(0)); |
258 | } |
259 | |
260 | static void |
261 | update_kbd_cb (GSettings *settings, |
262 | gchar *settings_key, |
263 | CsdMediaKeysManager *manager) |
264 | { |
265 | int i; |
266 | CdkDisplay *dpy; |
267 | gboolean need_flush = TRUE(!(0)); |
268 | |
269 | g_return_if_fail (settings_key != NULL)do { if ((settings_key != ((void*)0))) { } else { g_return_if_fail_warning (((gchar*) 0), ((const char*) (__func__)), "settings_key != NULL" ); return; } } while (0); |
270 | |
271 | dpy = cdk_display_get_default (); |
272 | cdk_x11_display_error_trap_push (dpy); |
273 | |
274 | /* Find the key that was modified */ |
275 | for (i = 0; i < HANDLED_KEYS; i++) { |
276 | if (g_strcmp0 (settings_key, keys[i].settings_key) == 0) { |
277 | char *tmp; |
278 | Key *key; |
279 | |
280 | if (keys[i].key != NULL((void*)0)) { |
281 | need_flush = TRUE(!(0)); |
282 | grab_key_unsafe (keys[i].key, FALSE(0), manager->priv->screens); |
283 | } |
284 | |
285 | g_free (keys[i].key); |
286 | keys[i].key = NULL((void*)0); |
287 | |
288 | /* We can't have a change in a hard-coded key */ |
289 | g_assert (keys[i].settings_key != NULL)do { if (keys[i].settings_key != ((void*)0)) ; else g_assertion_message_expr (((gchar*) 0), "csd_media-keys-manager.c", 289, ((const char *) (__func__)), "keys[i].settings_key != NULL"); } while (0); |
290 | |
291 | tmp = g_settings_get_string (settings, |
292 | keys[i].settings_key); |
293 | |
294 | if (is_valid_shortcut (tmp) == FALSE(0)) { |
295 | g_free (tmp); |
296 | break; |
297 | } |
298 | |
299 | key = g_new0 (Key, 1)((Key *) g_malloc0_n ((1), sizeof (Key))); |
300 | if (!egg_accelerator_parse_virtual (tmp, &key->keysym, &key->keycodes, &key->state)) { |
301 | g_free (tmp); |
302 | g_free (key); |
303 | break; |
304 | } |
305 | |
306 | need_flush = TRUE(!(0)); |
307 | grab_key_unsafe (key, TRUE(!(0)), manager->priv->screens); |
308 | keys[i].key = key; |
309 | |
310 | g_free (tmp); |
311 | |
312 | break; |
313 | } |
314 | } |
315 | |
316 | if (need_flush) |
317 | cdk_display_flush (dpy); |
318 | if (cdk_x11_display_error_trap_pop (dpy)) |
319 | g_warning ("Grab failed for some keys, another application may already have access the them."); |
320 | } |
321 | |
322 | static void init_kbd(CsdMediaKeysManager* manager) |
323 | { |
324 | int i; |
325 | CdkDisplay *dpy; |
326 | gboolean need_flush = FALSE(0); |
327 | |
328 | cafe_settings_profile_start(NULL); |
329 | |
330 | dpy = cdk_display_get_default (); |
331 | cdk_x11_display_error_trap_push (dpy); |
332 | |
333 | for (i = 0; i < HANDLED_KEYS; i++) |
334 | { |
335 | char* tmp; |
336 | Key* key; |
337 | |
338 | gchar* signal_name; |
339 | signal_name = g_strdup_printf ("changed::%s", keys[i].settings_key); |
340 | g_signal_connect (manager->priv->settings,g_signal_connect_data ((manager->priv->settings), (signal_name ), (((GCallback) (update_kbd_cb))), (manager), ((void*)0), (GConnectFlags ) 0) |
341 | signal_name,g_signal_connect_data ((manager->priv->settings), (signal_name ), (((GCallback) (update_kbd_cb))), (manager), ((void*)0), (GConnectFlags ) 0) |
342 | G_CALLBACK (update_kbd_cb),g_signal_connect_data ((manager->priv->settings), (signal_name ), (((GCallback) (update_kbd_cb))), (manager), ((void*)0), (GConnectFlags ) 0) |
343 | manager)g_signal_connect_data ((manager->priv->settings), (signal_name ), (((GCallback) (update_kbd_cb))), (manager), ((void*)0), (GConnectFlags ) 0); |
344 | g_free (signal_name); |
345 | |
346 | if (keys[i].settings_key != NULL((void*)0)) { |
347 | tmp = g_settings_get_string (manager->priv->settings, keys[i].settings_key); |
348 | } else { |
349 | tmp = g_strdup (keys[i].hard_coded)g_strdup_inline (keys[i].hard_coded); |
350 | } |
351 | |
352 | if (!is_valid_shortcut(tmp)) |
353 | { |
354 | g_debug("Not a valid shortcut: '%s'", tmp); |
355 | g_free(tmp); |
356 | continue; |
357 | } |
358 | |
359 | key = g_new0(Key, 1)((Key *) g_malloc0_n ((1), sizeof (Key))); |
360 | |
361 | if (!egg_accelerator_parse_virtual(tmp, &key->keysym, &key->keycodes, &key->state)) |
362 | { |
363 | g_debug("Unable to parse: '%s'", tmp); |
364 | g_free(tmp); |
365 | g_free(key); |
366 | continue; |
367 | } |
368 | |
369 | g_free(tmp); |
370 | |
371 | keys[i].key = key; |
372 | |
373 | need_flush = TRUE(!(0)); |
374 | grab_key_unsafe(key, TRUE(!(0)), manager->priv->screens); |
375 | } |
376 | |
377 | if (need_flush) |
378 | { |
379 | cdk_display_flush (dpy); |
380 | } |
381 | |
382 | if (cdk_x11_display_error_trap_pop (dpy)) |
383 | { |
384 | g_warning("Grab failed for some keys, another application may already have access the them."); |
385 | } |
386 | |
387 | cafe_settings_profile_end(NULL); |
388 | } |
389 | |
390 | static void |
391 | ensure_cancellable (GCancellable **cancellable) |
392 | { |
393 | if (*cancellable == NULL((void*)0)) { |
394 | *cancellable = g_cancellable_new (); |
395 | g_object_add_weak_pointer (G_OBJECT (*cancellable)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((*cancellable)), (((GType) ((20) << (2)))))))), |
396 | (gpointer *)cancellable); |
397 | } else { |
398 | g_object_ref (*cancellable)((__typeof__ (*cancellable)) (g_object_ref) (*cancellable)); |
399 | } |
400 | } |
401 | |
402 | static void |
403 | dialog_show (CsdMediaKeysManager *manager) |
404 | { |
405 | int orig_w; |
406 | int orig_h; |
407 | int screen_w; |
408 | int screen_h; |
409 | int x; |
410 | int y; |
411 | CdkDisplay *display; |
412 | CdkSeat *seat; |
413 | CdkDevice *pointer; |
414 | int pointer_x; |
415 | int pointer_y; |
416 | CtkRequisition win_req; |
417 | CdkScreen *pointer_screen; |
418 | CdkRectangle geometry; |
419 | CdkMonitor *monitor; |
420 | |
421 | ctk_window_set_screen (CTK_WINDOW (manager->priv->dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((manager->priv->dialog)), ((ctk_window_get_type ()) ))))), |
422 | manager->priv->current_screen); |
423 | |
424 | /* Return if OSD notifications are disabled */ |
425 | if (!g_settings_get_boolean (manager->priv->settings, "enable-osd")) |
426 | return; |
427 | |
428 | /* |
429 | * get the window size |
430 | * if the window hasn't been mapped, it doesn't necessarily |
431 | * know its true size, yet, so we need to jump through hoops |
432 | */ |
433 | ctk_window_get_default_size (CTK_WINDOW (manager->priv->dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((manager->priv->dialog)), ((ctk_window_get_type ()) ))))), &orig_w, &orig_h); |
434 | ctk_widget_get_preferred_size (manager->priv->dialog, NULL((void*)0), &win_req); |
435 | |
436 | if (win_req.width > orig_w) { |
437 | orig_w = win_req.width; |
438 | } |
439 | if (win_req.height > orig_h) { |
440 | orig_h = win_req.height; |
441 | } |
442 | |
443 | pointer_screen = NULL((void*)0); |
444 | display = cdk_screen_get_display (manager->priv->current_screen); |
445 | seat = cdk_display_get_default_seat (display); |
446 | pointer = cdk_seat_get_pointer (seat); |
447 | |
448 | cdk_device_get_position (pointer, |
449 | &pointer_screen, |
450 | &pointer_x, |
451 | &pointer_y); |
452 | |
453 | if (pointer_screen != manager->priv->current_screen) { |
454 | /* The pointer isn't on the current screen, so just |
455 | * assume the default monitor |
456 | */ |
457 | monitor = cdk_display_get_monitor (display, 0); |
458 | } else { |
459 | monitor = cdk_display_get_monitor_at_point (display, pointer_x, pointer_y); |
460 | } |
461 | |
462 | cdk_monitor_get_geometry (monitor, &geometry); |
463 | |
464 | screen_w = geometry.width; |
465 | screen_h = geometry.height; |
466 | |
467 | x = ((screen_w - orig_w) / 2) + geometry.x; |
468 | y = geometry.y + (screen_h / 2) + (screen_h / 2 - orig_h) / 2; |
469 | |
470 | ctk_window_move (CTK_WINDOW (manager->priv->dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((manager->priv->dialog)), ((ctk_window_get_type ()) ))))), x, y); |
471 | |
472 | ctk_widget_show (manager->priv->dialog); |
473 | |
474 | cdk_display_sync (cdk_screen_get_display (manager->priv->current_screen)); |
475 | } |
476 | |
477 | static void |
478 | do_url_action (CsdMediaKeysManager *manager G_GNUC_UNUSED__attribute__ ((__unused__)), |
479 | const gchar *scheme) |
480 | { |
481 | GError *error = NULL((void*)0); |
482 | GAppInfo *app_info; |
483 | |
484 | app_info = g_app_info_get_default_for_uri_scheme (scheme); |
485 | |
486 | if (app_info != NULL((void*)0)) { |
487 | if (!g_app_info_launch (app_info, NULL((void*)0), NULL((void*)0), &error)) { |
488 | g_warning ("Could not launch '%s': %s", |
489 | g_app_info_get_commandline (app_info), |
490 | error->message); |
491 | g_object_unref (app_info); |
492 | g_error_free (error); |
493 | } |
494 | } |
495 | else { |
496 | g_warning ("Could not find default application for '%s' scheme", scheme); |
497 | } |
498 | } |
499 | |
500 | static void |
501 | do_media_action (CsdMediaKeysManager *manager G_GNUC_UNUSED__attribute__ ((__unused__))) |
502 | { |
503 | GError *error = NULL((void*)0); |
504 | GAppInfo *app_info; |
505 | |
506 | app_info = g_app_info_get_default_for_type ("audio/x-vorbis+ogg", FALSE(0)); |
507 | |
508 | if (app_info != NULL((void*)0)) { |
509 | if (!g_app_info_launch (app_info, NULL((void*)0), NULL((void*)0), &error)) { |
510 | g_warning ("Could not launch '%s': %s", |
511 | g_app_info_get_commandline (app_info), |
512 | error->message); |
513 | g_error_free (error); |
514 | } |
515 | } |
516 | else { |
517 | g_warning ("Could not find default application for '%s' mime-type", "audio/x-vorbis+ogg"); |
518 | } |
519 | } |
520 | |
521 | static void |
522 | do_calculator_action (CsdMediaKeysManager *manager) |
523 | { |
524 | GSettings *settings; |
525 | char *calc; |
526 | |
527 | settings = g_settings_new ("org.cafe.applications-calculator"); |
528 | calc = g_settings_get_string (settings, "exec"); |
529 | |
530 | if (calc) |
531 | execute (manager, calc, FALSE(0), FALSE(0)); |
532 | |
533 | g_free (calc); |
534 | g_object_unref (settings); |
535 | } |
536 | |
537 | static void |
538 | do_messenger_action (CsdMediaKeysManager *manager) |
539 | { |
540 | GSettings *settings; |
541 | char *messenger; |
542 | |
543 | settings = g_settings_new ("org.cafe.applications-messenger"); |
544 | messenger = g_settings_get_string (settings, "exec"); |
545 | |
546 | if (messenger) |
547 | execute (manager, messenger, FALSE(0), FALSE(0)); |
548 | |
549 | g_free (messenger); |
550 | g_object_unref (settings); |
551 | } |
552 | |
553 | static void |
554 | do_shutdown_action (CsdMediaKeysManager *manager) |
555 | { |
556 | execute (manager, "cafe-session-save --shutdown-dialog", FALSE(0), FALSE(0)); |
557 | } |
558 | |
559 | static void |
560 | do_logout_action (CsdMediaKeysManager *manager) |
561 | { |
562 | execute (manager, "cafe-session-save --logout-dialog", FALSE(0), FALSE(0)); |
563 | } |
564 | |
565 | static void |
566 | do_eject_action_cb (GDrive *drive, |
567 | GAsyncResult *res, |
568 | CsdMediaKeysManager *manager G_GNUC_UNUSED__attribute__ ((__unused__))) |
569 | { |
570 | g_drive_eject_with_operation_finish (drive, res, NULL((void*)0)); |
571 | } |
572 | |
573 | #define NO_SCORE0 0 |
574 | #define SCORE_CAN_EJECT50 50 |
575 | #define SCORE_HAS_MEDIA100 100 |
576 | static void |
577 | do_eject_action (CsdMediaKeysManager *manager) |
578 | { |
579 | GList *drives, *l; |
580 | GDrive *fav_drive; |
581 | guint score; |
582 | |
583 | /* Find the best drive to eject */ |
584 | fav_drive = NULL((void*)0); |
585 | score = NO_SCORE0; |
586 | drives = g_volume_monitor_get_connected_drives (manager->priv->volume_monitor); |
587 | for (l = drives; l != NULL((void*)0); l = l->next) { |
588 | GDrive *drive = l->data; |
589 | |
590 | if (g_drive_can_eject (drive) == FALSE(0)) |
591 | continue; |
592 | if (g_drive_is_media_removable (drive) == FALSE(0)) |
593 | continue; |
594 | if (score < SCORE_CAN_EJECT50) { |
595 | fav_drive = drive; |
596 | score = SCORE_CAN_EJECT50; |
597 | } |
598 | if (g_drive_has_media (drive) == FALSE(0)) |
599 | continue; |
600 | if (score < SCORE_HAS_MEDIA100) { |
601 | fav_drive = drive; |
602 | score = SCORE_HAS_MEDIA100; |
Value stored to 'score' is never read | |
603 | break; |
604 | } |
605 | } |
606 | |
607 | /* Show the dialogue */ |
608 | dialog_init (manager); |
609 | csd_media_keys_window_set_action_custom (CSD_MEDIA_KEYS_WINDOW (manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((manager->priv->dialog)), ((csd_media_keys_window_get_type ())))))), |
610 | "media-eject", |
611 | NULL((void*)0)); |
612 | dialog_show (manager); |
613 | |
614 | /* Clean up the drive selection and exit if no suitable |
615 | * drives are found */ |
616 | if (fav_drive != NULL((void*)0)) |
617 | fav_drive = g_object_ref (fav_drive)((__typeof__ (fav_drive)) (g_object_ref) (fav_drive)); |
618 | |
619 | g_list_foreach (drives, (GFunc) g_object_unref, NULL((void*)0)); |
620 | if (fav_drive == NULL((void*)0)) |
621 | return; |
622 | |
623 | /* Eject! */ |
624 | g_drive_eject_with_operation (fav_drive, G_MOUNT_UNMOUNT_FORCE, |
625 | NULL((void*)0), NULL((void*)0), |
626 | (GAsyncReadyCallback) do_eject_action_cb, |
627 | manager); |
628 | g_object_unref (fav_drive); |
629 | } |
630 | |
631 | static void |
632 | do_touchpad_osd_action (CsdMediaKeysManager *manager, gboolean state) |
633 | { |
634 | dialog_init (manager); |
635 | csd_media_keys_window_set_action_custom (CSD_MEDIA_KEYS_WINDOW (manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((manager->priv->dialog)), ((csd_media_keys_window_get_type ())))))), |
636 | state ? "input-touchpad" : "touchpad-disabled", |
637 | state ? _("Touchpad enabled")gettext ("Touchpad enabled") : _("Touchpad disabled")gettext ("Touchpad disabled")); |
638 | dialog_show (manager); |
639 | } |
640 | |
641 | static void |
642 | do_touchpad_action (CsdMediaKeysManager *manager) |
643 | { |
644 | GSettings *settings = g_settings_new (TOUCHPAD_SCHEMA"org.cafe.peripherals-touchpad"); |
645 | gboolean state = g_settings_get_boolean (settings, TOUCHPAD_ENABLED_KEY"touchpad-enabled"); |
646 | |
647 | if (touchpad_is_present () == FALSE(0)) { |
648 | do_touchpad_osd_action (manager, FALSE(0)); |
649 | return; |
650 | } |
651 | |
652 | do_touchpad_osd_action (manager, !state); |
653 | |
654 | g_settings_set_boolean (settings, TOUCHPAD_ENABLED_KEY"touchpad-enabled", !state); |
655 | g_object_unref (settings); |
656 | } |
657 | |
658 | #ifdef HAVE_LIBCAFEMIXER1 |
659 | static void |
660 | update_dialog (CsdMediaKeysManager *manager, |
661 | guint volume, |
662 | gboolean muted, |
663 | gboolean sound_changed, |
664 | gboolean quiet, |
665 | gboolean is_mic) |
666 | { |
667 | if (muted) |
668 | volume = 0.0; |
669 | |
670 | dialog_init (manager); |
671 | |
672 | if (is_mic) |
673 | csd_media_keys_window_set_mic_muted (CSD_MEDIA_KEYS_WINDOW (manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((manager->priv->dialog)), ((csd_media_keys_window_get_type ())))))), |
674 | muted); |
675 | else |
676 | csd_media_keys_window_set_volume_muted (CSD_MEDIA_KEYS_WINDOW (manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((manager->priv->dialog)), ((csd_media_keys_window_get_type ())))))), |
677 | muted); |
678 | |
679 | csd_media_keys_window_set_volume_level (CSD_MEDIA_KEYS_WINDOW (manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((manager->priv->dialog)), ((csd_media_keys_window_get_type ())))))), |
680 | volume); |
681 | |
682 | csd_media_keys_window_set_action (CSD_MEDIA_KEYS_WINDOW (manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((manager->priv->dialog)), ((csd_media_keys_window_get_type ())))))), |
683 | CSD_MEDIA_KEYS_WINDOW_ACTION_VOLUME); |
684 | dialog_show (manager); |
685 | |
686 | #ifdef HAVE_LIBKANBERRA1 |
687 | if (quiet == FALSE(0) && sound_changed != FALSE(0) && muted == FALSE(0) && is_mic == FALSE(0)) |
688 | ka_ctk_play_for_widget (manager->priv->dialog, 0, |
689 | KA_PROP_EVENT_ID"event.id", "audio-volume-change", |
690 | KA_PROP_EVENT_DESCRIPTION"event.description", "Volume changed through key press", |
691 | KA_PROP_APPLICATION_NAME"application.name", PACKAGE_NAME"cafe-settings-daemon", |
692 | KA_PROP_APPLICATION_VERSION"application.version", PACKAGE_VERSION"1.25.2", |
693 | KA_PROP_APPLICATION_ID"application.id", "org.cafe.SettingsDaemon", |
694 | NULL((void*)0)); |
695 | #endif |
696 | } |
697 | |
698 | static void |
699 | do_sound_action (CsdMediaKeysManager *manager, |
700 | int type, |
701 | gboolean quiet) |
702 | { |
703 | gboolean muted; |
704 | gboolean muted_last; |
705 | gboolean sound_changed = FALSE(0); |
706 | guint volume; |
707 | guint volume_min, volume_max; |
708 | guint volume_step; |
709 | guint volume_last; |
710 | CafeMixerStreamControl *control; |
711 | |
712 | gboolean is_input_control = |
713 | type == MIC_MUTE_KEY ? TRUE(!(0)) : FALSE(0); |
714 | if (is_input_control) |
715 | control = manager->priv->source_control; |
716 | else |
717 | control = manager->priv->control; |
718 | if (control == NULL((void*)0)) |
719 | return; |
720 | |
721 | /* Theoretically the volume limits might be different for different |
722 | * streams, also the minimum might not always start at 0 */ |
723 | volume_min = cafe_mixer_stream_control_get_min_volume (control); |
724 | volume_max = cafe_mixer_stream_control_get_normal_volume (control); |
725 | |
726 | volume_step = g_settings_get_int (manager->priv->settings, "volume-step"); |
727 | if (volume_step <= 0 || volume_step > 100) { |
728 | GVariant *variant = g_settings_get_default_value (manager->priv->settings, "volume-step"); |
729 | volume_step = g_variant_get_int32 (variant); |
730 | g_variant_unref (variant); |
731 | } |
732 | |
733 | /* Scale the volume step size accordingly to the range used by the control */ |
734 | volume_step = (volume_max - volume_min) * volume_step / 100; |
735 | |
736 | volume = volume_last = |
737 | cafe_mixer_stream_control_get_volume (control); |
738 | muted = muted_last = |
739 | cafe_mixer_stream_control_get_mute (control); |
740 | |
741 | switch (type) { |
742 | case MUTE_KEY: |
743 | case MIC_MUTE_KEY: |
744 | muted = !muted; |
745 | break; |
746 | case VOLUME_DOWN_KEY: |
747 | if (volume <= (volume_min + volume_step)) { |
748 | volume = volume_min; |
749 | muted = TRUE(!(0)); |
750 | } else { |
751 | volume -= volume_step; |
752 | muted = FALSE(0); |
753 | } |
754 | break; |
755 | case VOLUME_UP_KEY: |
756 | if (muted) { |
757 | muted = FALSE(0); |
758 | if (volume <= volume_min) |
759 | volume = volume_min + volume_step; |
760 | } else |
761 | volume = CLAMP (volume + volume_step,(((volume + volume_step) > (volume_max)) ? (volume_max) : ( ((volume + volume_step) < (volume_min)) ? (volume_min) : ( volume + volume_step))) |
762 | volume_min,(((volume + volume_step) > (volume_max)) ? (volume_max) : ( ((volume + volume_step) < (volume_min)) ? (volume_min) : ( volume + volume_step))) |
763 | volume_max)(((volume + volume_step) > (volume_max)) ? (volume_max) : ( ((volume + volume_step) < (volume_min)) ? (volume_min) : ( volume + volume_step))); |
764 | break; |
765 | } |
766 | |
767 | if (muted != muted_last) { |
768 | if (cafe_mixer_stream_control_set_mute (control, muted)) |
769 | sound_changed = TRUE(!(0)); |
770 | else |
771 | muted = muted_last; |
772 | } |
773 | |
774 | if (volume != cafe_mixer_stream_control_get_volume (control)) { |
775 | if (cafe_mixer_stream_control_set_volume (control, volume)) |
776 | sound_changed = TRUE(!(0)); |
777 | else |
778 | volume = volume_last; |
779 | } |
780 | |
781 | update_dialog (manager, |
782 | CLAMP (100 * volume / (volume_max - volume_min), 0, 100)(((100 * volume / (volume_max - volume_min)) > (100)) ? (100 ) : (((100 * volume / (volume_max - volume_min)) < (0)) ? ( 0) : (100 * volume / (volume_max - volume_min)))), |
783 | muted, |
784 | sound_changed, |
785 | quiet, |
786 | is_input_control); |
787 | } |
788 | |
789 | static void |
790 | update_default_output (CsdMediaKeysManager *manager) |
791 | { |
792 | CafeMixerStream *stream; |
793 | CafeMixerStreamControl *control = NULL((void*)0); |
794 | |
795 | stream = cafe_mixer_context_get_default_output_stream (manager->priv->context); |
796 | if (stream != NULL((void*)0)) |
797 | control = cafe_mixer_stream_get_default_control (stream); |
798 | |
799 | if (stream == manager->priv->stream) |
800 | return; |
801 | |
802 | g_clear_object (&manager->priv->stream)do { _Static_assert (sizeof *((&manager->priv->stream )) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&manager->priv->stream))) _pp = ((&manager-> priv->stream)); __typeof__ (*((&manager->priv->stream ))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref ) (_ptr); } while (0); |
803 | g_clear_object (&manager->priv->control)do { _Static_assert (sizeof *((&manager->priv->control )) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&manager->priv->control))) _pp = ((&manager ->priv->control)); __typeof__ (*((&manager->priv ->control))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref ) (_ptr); } while (0); |
804 | |
805 | if (control != NULL((void*)0)) { |
806 | CafeMixerStreamControlFlags flags = cafe_mixer_stream_control_get_flags (control); |
807 | |
808 | /* Do not use the stream if it is not possible to mute it or |
809 | * change the volume */ |
810 | if (!(flags & CAFE_MIXER_STREAM_CONTROL_MUTE_WRITABLE) && |
811 | !(flags & CAFE_MIXER_STREAM_CONTROL_VOLUME_WRITABLE)) |
812 | return; |
813 | |
814 | manager->priv->stream = g_object_ref (stream)((__typeof__ (stream)) (g_object_ref) (stream)); |
815 | manager->priv->control = g_object_ref (control)((__typeof__ (control)) (g_object_ref) (control)); |
816 | g_debug ("Default output stream updated to %s", |
817 | cafe_mixer_stream_get_name (stream)); |
818 | } else |
819 | g_debug ("Default output stream unset"); |
820 | } |
821 | |
822 | static void |
823 | update_default_input (CsdMediaKeysManager *manager) |
824 | { |
825 | CafeMixerStream *stream; |
826 | CafeMixerStreamControl *control = NULL((void*)0); |
827 | |
828 | stream = cafe_mixer_context_get_default_input_stream (manager->priv->context); |
829 | if (stream != NULL((void*)0)) |
830 | control = cafe_mixer_stream_get_default_control (stream); |
831 | |
832 | if (stream == manager->priv->source_stream) |
833 | return; |
834 | |
835 | g_clear_object (&manager->priv->source_stream)do { _Static_assert (sizeof *((&manager->priv->source_stream )) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&manager->priv->source_stream))) _pp = ((&manager ->priv->source_stream)); __typeof__ (*((&manager-> priv->source_stream))) _ptr = *_pp; *_pp = ((void*)0); if ( _ptr) (g_object_unref) (_ptr); } while (0); |
836 | g_clear_object (&manager->priv->source_control)do { _Static_assert (sizeof *((&manager->priv->source_control )) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&manager->priv->source_control))) _pp = ((& manager->priv->source_control)); __typeof__ (*((&manager ->priv->source_control))) _ptr = *_pp; *_pp = ((void*)0 ); if (_ptr) (g_object_unref) (_ptr); } while (0); |
837 | |
838 | if (control != NULL((void*)0)) { |
839 | CafeMixerStreamControlFlags flags = cafe_mixer_stream_control_get_flags (control); |
840 | |
841 | /* Do not use the stream if it is not possible to mute it or |
842 | * change the volume */ |
843 | if (!(flags & CAFE_MIXER_STREAM_CONTROL_MUTE_WRITABLE)) |
844 | return; |
845 | |
846 | manager->priv->source_stream = g_object_ref (stream)((__typeof__ (stream)) (g_object_ref) (stream)); |
847 | manager->priv->source_control = g_object_ref (control)((__typeof__ (control)) (g_object_ref) (control)); |
848 | g_debug ("Default input stream updated to %s", |
849 | cafe_mixer_stream_get_name (stream)); |
850 | } else |
851 | g_debug ("Default input stream unset"); |
852 | } |
853 | |
854 | static void |
855 | on_context_state_notify (CafeMixerContext *context G_GNUC_UNUSED__attribute__ ((__unused__)), |
856 | GParamSpec *pspec G_GNUC_UNUSED__attribute__ ((__unused__)), |
857 | CsdMediaKeysManager *manager) |
858 | { |
859 | update_default_output (manager); |
860 | update_default_input (manager); |
861 | } |
862 | |
863 | static void |
864 | on_context_default_output_notify (CafeMixerContext *context G_GNUC_UNUSED__attribute__ ((__unused__)), |
865 | GParamSpec *pspec G_GNUC_UNUSED__attribute__ ((__unused__)), |
866 | CsdMediaKeysManager *manager) |
867 | { |
868 | update_default_output (manager); |
869 | } |
870 | |
871 | static void |
872 | on_context_default_input_notify (CafeMixerContext *context G_GNUC_UNUSED__attribute__ ((__unused__)), |
873 | GParamSpec *pspec G_GNUC_UNUSED__attribute__ ((__unused__)), |
874 | CsdMediaKeysManager *manager) |
875 | { |
876 | update_default_input (manager); |
877 | } |
878 | |
879 | static void |
880 | on_context_stream_removed (CafeMixerContext *context G_GNUC_UNUSED__attribute__ ((__unused__)), |
881 | const gchar *name, |
882 | CsdMediaKeysManager *manager) |
883 | { |
884 | if (manager->priv->stream != NULL((void*)0)) { |
885 | CafeMixerStream *stream = |
886 | cafe_mixer_context_get_stream (manager->priv->context, name); |
887 | |
888 | if (stream == manager->priv->stream) { |
889 | g_clear_object (&manager->priv->stream)do { _Static_assert (sizeof *((&manager->priv->stream )) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&manager->priv->stream))) _pp = ((&manager-> priv->stream)); __typeof__ (*((&manager->priv->stream ))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref ) (_ptr); } while (0); |
890 | g_clear_object (&manager->priv->control)do { _Static_assert (sizeof *((&manager->priv->control )) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&manager->priv->control))) _pp = ((&manager ->priv->control)); __typeof__ (*((&manager->priv ->control))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref ) (_ptr); } while (0); |
891 | } |
892 | } |
893 | if (manager->priv->source_stream != NULL((void*)0)) { |
894 | CafeMixerStream *stream = |
895 | cafe_mixer_context_get_stream (manager->priv->context, name); |
896 | |
897 | if (stream == manager->priv->source_stream) { |
898 | g_clear_object (&manager->priv->source_stream)do { _Static_assert (sizeof *((&manager->priv->source_stream )) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&manager->priv->source_stream))) _pp = ((&manager ->priv->source_stream)); __typeof__ (*((&manager-> priv->source_stream))) _ptr = *_pp; *_pp = ((void*)0); if ( _ptr) (g_object_unref) (_ptr); } while (0); |
899 | g_clear_object (&manager->priv->source_control)do { _Static_assert (sizeof *((&manager->priv->source_control )) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&manager->priv->source_control))) _pp = ((& manager->priv->source_control)); __typeof__ (*((&manager ->priv->source_control))) _ptr = *_pp; *_pp = ((void*)0 ); if (_ptr) (g_object_unref) (_ptr); } while (0); |
900 | } |
901 | } |
902 | } |
903 | #endif /* HAVE_LIBCAFEMIXER */ |
904 | |
905 | static gboolean |
906 | get_rfkill_property (CsdMediaKeysManager *manager, |
907 | const char *property) |
908 | { |
909 | GVariant *v; |
910 | gboolean ret; |
911 | |
912 | v = g_dbus_proxy_get_cached_property (manager->priv->rfkill_proxy, property); |
913 | if (!v) |
914 | return FALSE(0); |
915 | ret = g_variant_get_boolean (v); |
916 | g_variant_unref (v); |
917 | |
918 | return ret; |
919 | } |
920 | |
921 | typedef struct { |
922 | CsdMediaKeysManager *manager; |
923 | char *property; |
924 | gboolean bluetooth; |
925 | gboolean target_state; |
926 | } RfkillData; |
927 | |
928 | static void |
929 | set_rfkill_complete (GObject *object, |
930 | GAsyncResult *result, |
931 | gpointer user_data) |
932 | { |
933 | GError *error = NULL((void*)0); |
934 | GVariant *variant; |
935 | RfkillData *data = user_data; |
936 | |
937 | variant = g_dbus_proxy_call_finish (G_DBUS_PROXY (object)((((GDBusProxy*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((g_dbus_proxy_get_type ())))))), result, &error); |
938 | |
939 | if (variant == NULL((void*)0)) { |
940 | if (!g_error_matches (error, G_IO_ERRORg_io_error_quark(), G_IO_ERROR_CANCELLED)) |
941 | g_warning ("Failed to set '%s' property: %s", data->property, error->message); |
942 | g_error_free (error); |
943 | goto out; |
944 | } |
945 | g_variant_unref (variant); |
946 | |
947 | g_debug ("Finished changing rfkill, property %s is now %s", |
948 | data->property, data->target_state ? "true" : "false"); |
949 | |
950 | if (data->bluetooth){ |
951 | if (data->target_state) |
952 | csd_media_keys_window_set_action_custom (CSD_MEDIA_KEYS_WINDOW (data->manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((data->manager->priv->dialog)), (( csd_media_keys_window_get_type ())))))), |
953 | "bluetooth-disabled-symbolic", _("Bluetooth disabled")gettext ("Bluetooth disabled")); |
954 | else |
955 | csd_media_keys_window_set_action_custom (CSD_MEDIA_KEYS_WINDOW (data->manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((data->manager->priv->dialog)), (( csd_media_keys_window_get_type ())))))), |
956 | "bluetooth-active-symbolic", _("Bluetooth enabled")gettext ("Bluetooth enabled")); |
957 | } else { |
958 | if (data->target_state) |
959 | csd_media_keys_window_set_action_custom (CSD_MEDIA_KEYS_WINDOW (data->manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((data->manager->priv->dialog)), (( csd_media_keys_window_get_type ())))))), |
960 | "airplane-mode-symbolic", _("Airplane mode enabled")gettext ("Airplane mode enabled")); |
961 | else |
962 | csd_media_keys_window_set_action_custom (CSD_MEDIA_KEYS_WINDOW (data->manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((data->manager->priv->dialog)), (( csd_media_keys_window_get_type ())))))), |
963 | "network-wireless-signal-excellent-symbolic", _("Airplane mode disabled")gettext ("Airplane mode disabled")); |
964 | } |
965 | dialog_show (data->manager); |
966 | out: |
967 | g_free (data->property); |
968 | g_free (data); |
969 | } |
970 | |
971 | static void |
972 | do_rfkill_action (CsdMediaKeysManager *manager, |
973 | gboolean bluetooth) |
974 | { |
975 | const char *has_mode, *hw_mode, *mode; |
976 | gboolean new_state; |
977 | RfkillData *data; |
978 | |
979 | dialog_init (manager); |
980 | |
981 | has_mode = bluetooth ? "BluetoothHasAirplaneMode" : "HasAirplaneMode"; |
982 | hw_mode = bluetooth ? "BluetoothHardwareAirplaneMode" : "HardwareAirplaneMode"; |
983 | mode = bluetooth ? "BluetoothAirplaneMode" : "AirplaneMode"; |
984 | |
985 | if (manager->priv->rfkill_proxy == NULL((void*)0)) |
986 | return; |
987 | |
988 | if (get_rfkill_property (manager, has_mode) == FALSE(0)) |
989 | return; |
990 | |
991 | if (get_rfkill_property (manager, hw_mode)) { |
992 | csd_media_keys_window_set_action_custom (CSD_MEDIA_KEYS_WINDOW (manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((manager->priv->dialog)), ((csd_media_keys_window_get_type ())))))), |
993 | "airplane-mode-symbolic", |
994 | _("Hardware Airplane Mode")gettext ("Hardware Airplane Mode")); |
995 | dialog_show (manager); |
996 | return; |
997 | } |
998 | |
999 | new_state = !get_rfkill_property (manager, mode); |
1000 | data = g_new0 (RfkillData, 1)((RfkillData *) g_malloc0_n ((1), sizeof (RfkillData))); |
1001 | data->manager = manager; |
1002 | data->property = g_strdup (mode)g_strdup_inline (mode); |
1003 | data->bluetooth = bluetooth; |
1004 | data->target_state = new_state; |
1005 | g_dbus_proxy_call (manager->priv->rfkill_proxy, |
1006 | "org.freedesktop.DBus.Properties.Set", |
1007 | g_variant_new ("(ssv)", |
1008 | "org.cafe.SettingsDaemon.Rfkill", |
1009 | data->property, |
1010 | g_variant_new_boolean (new_state)), |
1011 | G_DBUS_CALL_FLAGS_NONE, -1, |
1012 | manager->priv->rfkill_cancellable, |
1013 | set_rfkill_complete, data); |
1014 | |
1015 | g_debug ("Setting rfkill property %s to %s", |
1016 | data->property, new_state ? "true" : "false"); |
1017 | } |
1018 | |
1019 | static void |
1020 | do_display_osd_action (CsdMediaKeysManager *manager) |
1021 | { |
1022 | CdkDisplay *display; |
1023 | int n_monitors; |
1024 | |
1025 | display = cdk_display_get_default (); |
1026 | n_monitors = cdk_display_get_n_monitors (display); |
1027 | |
1028 | dialog_init (manager); |
1029 | if (n_monitors > 1) |
1030 | csd_media_keys_window_set_action_custom (CSD_MEDIA_KEYS_WINDOW (manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((manager->priv->dialog)), ((csd_media_keys_window_get_type ())))))), |
1031 | "video-joined-displays-symbolic", |
1032 | _("Changing Screen Layout")gettext ("Changing Screen Layout")); |
1033 | else |
1034 | csd_media_keys_window_set_action_custom (CSD_MEDIA_KEYS_WINDOW (manager->priv->dialog)((((CsdMediaKeysWindow*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((manager->priv->dialog)), ((csd_media_keys_window_get_type ())))))), |
1035 | "video-single-display-symbolic", |
1036 | _("No External Display")gettext ("No External Display")); |
1037 | dialog_show (manager); |
1038 | } |
1039 | |
1040 | static gint |
1041 | find_by_application (gconstpointer a, |
1042 | gconstpointer b) |
1043 | { |
1044 | return strcmp (((MediaPlayer *)a)->application, b); |
1045 | } |
1046 | |
1047 | static gint |
1048 | find_by_time (gconstpointer a, |
1049 | gconstpointer b) |
1050 | { |
1051 | return ((MediaPlayer *)a)->time < ((MediaPlayer *)b)->time; |
1052 | } |
1053 | |
1054 | /* |
1055 | * Register a new media player. Most applications will want to call |
1056 | * this with time = CDK_CURRENT_TIME. This way, the last registered |
1057 | * player will receive media events. In some cases, applications |
1058 | * may want to register with a lower priority (usually 1), to grab |
1059 | * events only nobody is interested. |
1060 | */ |
1061 | gboolean |
1062 | csd_media_keys_manager_grab_media_player_keys (CsdMediaKeysManager *manager, |
1063 | const char *application, |
1064 | guint32 time, |
1065 | GError **error G_GNUC_UNUSED__attribute__ ((__unused__))) |
1066 | { |
1067 | GList *iter; |
1068 | MediaPlayer *media_player; |
1069 | |
1070 | if (time == CDK_CURRENT_TIME0L) { |
1071 | GTimeVal tv; |
1072 | |
1073 | g_get_current_time (&tv); |
1074 | time = tv.tv_sec * 1000 + tv.tv_usec / 1000; |
1075 | } |
1076 | |
1077 | iter = g_list_find_custom (manager->priv->media_players, |
1078 | application, |
1079 | find_by_application); |
1080 | |
1081 | if (iter != NULL((void*)0)) { |
1082 | if (((MediaPlayer *)iter->data)->time < time) { |
1083 | g_free (((MediaPlayer *)iter->data)->application); |
1084 | g_free (iter->data); |
1085 | manager->priv->media_players = g_list_delete_link (manager->priv->media_players, iter); |
1086 | } else { |
1087 | return TRUE(!(0)); |
1088 | } |
1089 | } |
1090 | |
1091 | g_debug ("Registering %s at %u", application, time); |
1092 | media_player = g_new0 (MediaPlayer, 1)((MediaPlayer *) g_malloc0_n ((1), sizeof (MediaPlayer))); |
1093 | media_player->application = g_strdup (application)g_strdup_inline (application); |
1094 | media_player->time = time; |
1095 | |
1096 | manager->priv->media_players = g_list_insert_sorted (manager->priv->media_players, |
1097 | media_player, |
1098 | find_by_time); |
1099 | |
1100 | return TRUE(!(0)); |
1101 | } |
1102 | |
1103 | gboolean |
1104 | csd_media_keys_manager_release_media_player_keys (CsdMediaKeysManager *manager, |
1105 | const char *application, |
1106 | GError **error G_GNUC_UNUSED__attribute__ ((__unused__))) |
1107 | { |
1108 | GList *iter; |
1109 | |
1110 | iter = g_list_find_custom (manager->priv->media_players, |
1111 | application, |
1112 | find_by_application); |
1113 | |
1114 | if (iter != NULL((void*)0)) { |
1115 | g_debug ("Deregistering %s", application); |
1116 | g_free (((MediaPlayer *)iter->data)->application); |
1117 | g_free (iter->data); |
1118 | manager->priv->media_players = g_list_delete_link (manager->priv->media_players, iter); |
1119 | } |
1120 | |
1121 | return TRUE(!(0)); |
1122 | } |
1123 | |
1124 | static gboolean |
1125 | csd_media_player_key_pressed (CsdMediaKeysManager *manager, |
1126 | const char *key) |
1127 | { |
1128 | const char *application = NULL((void*)0); |
1129 | gboolean have_listeners; |
1130 | |
1131 | have_listeners = (manager->priv->media_players != NULL((void*)0)); |
1132 | |
1133 | if (have_listeners) { |
1134 | application = ((MediaPlayer *)manager->priv->media_players->data)->application; |
1135 | } |
1136 | |
1137 | g_signal_emit (manager, signals[MEDIA_PLAYER_KEY_PRESSED], 0, application, key); |
1138 | |
1139 | return !have_listeners; |
1140 | } |
1141 | |
1142 | static gboolean |
1143 | do_multimedia_player_action (CsdMediaKeysManager *manager, |
1144 | const char *key) |
1145 | { |
1146 | return csd_media_player_key_pressed (manager, key); |
1147 | } |
1148 | |
1149 | static void |
1150 | do_toggle_accessibility_key (const char *key) |
1151 | { |
1152 | GSettings *settings; |
1153 | gboolean state; |
1154 | |
1155 | settings = g_settings_new ("org.gnome.desktop.a11y.applications"); |
1156 | state = g_settings_get_boolean (settings, key); |
1157 | g_settings_set_boolean (settings, key, !state); |
1158 | g_object_unref (settings); |
1159 | } |
1160 | |
1161 | static void |
1162 | do_magnifier_action (CsdMediaKeysManager *manager G_GNUC_UNUSED__attribute__ ((__unused__))) |
1163 | { |
1164 | do_toggle_accessibility_key ("screen-magnifier-enabled"); |
1165 | } |
1166 | |
1167 | static void |
1168 | do_screenreader_action (CsdMediaKeysManager *manager G_GNUC_UNUSED__attribute__ ((__unused__))) |
1169 | { |
1170 | do_toggle_accessibility_key ("screen-reader-enabled"); |
1171 | } |
1172 | |
1173 | static void |
1174 | do_on_screen_keyboard_action (CsdMediaKeysManager *manager G_GNUC_UNUSED__attribute__ ((__unused__))) |
1175 | { |
1176 | do_toggle_accessibility_key ("screen-keyboard-enabled"); |
1177 | } |
1178 | |
1179 | static gboolean |
1180 | do_action (CsdMediaKeysManager *manager, |
1181 | int type) |
1182 | { |
1183 | char *cmd; |
1184 | char *path; |
1185 | |
1186 | switch (type) { |
1187 | case TOUCHPAD_KEY: |
1188 | do_touchpad_action (manager); |
1189 | break; |
1190 | case TOUCHPAD_ON_KEY: |
1191 | do_touchpad_osd_action(manager, TRUE(!(0))); |
1192 | break; |
1193 | case TOUCHPAD_OFF_KEY: |
1194 | do_touchpad_osd_action(manager, FALSE(0)); |
1195 | break; |
1196 | case MUTE_KEY: |
1197 | case VOLUME_DOWN_KEY: |
1198 | case VOLUME_UP_KEY: |
1199 | case MIC_MUTE_KEY: |
1200 | #ifdef HAVE_LIBCAFEMIXER1 |
1201 | do_sound_action (manager, type, FALSE(0)); |
1202 | #endif |
1203 | break; |
1204 | case MUTE_QUIET_KEY: |
1205 | #ifdef HAVE_LIBCAFEMIXER1 |
1206 | do_sound_action (manager, MUTE_KEY, TRUE(!(0))); |
1207 | #endif |
1208 | break; |
1209 | case VOLUME_DOWN_QUIET_KEY: |
1210 | #ifdef HAVE_LIBCAFEMIXER1 |
1211 | do_sound_action (manager, VOLUME_DOWN_KEY, TRUE(!(0))); |
1212 | #endif |
1213 | break; |
1214 | case VOLUME_UP_QUIET_KEY: |
1215 | #ifdef HAVE_LIBCAFEMIXER1 |
1216 | do_sound_action (manager, VOLUME_UP_KEY, TRUE(!(0))); |
1217 | #endif |
1218 | break; |
1219 | case POWER_KEY: |
1220 | do_shutdown_action (manager); |
1221 | break; |
1222 | case LOGOUT_KEY: |
1223 | do_logout_action (manager); |
1224 | break; |
1225 | case EJECT_KEY: |
1226 | do_eject_action (manager); |
1227 | break; |
1228 | case HOME_KEY: |
1229 | path = g_shell_quote (g_get_home_dir ()); |
1230 | cmd = g_strconcat ("baul --no-desktop ", path, NULL((void*)0)); |
1231 | g_free (path); |
1232 | execute (manager, cmd, FALSE(0), FALSE(0)); |
1233 | g_free (cmd); |
1234 | break; |
1235 | case SEARCH_KEY: |
1236 | cmd = NULL((void*)0); |
1237 | if ((cmd = g_find_program_in_path ("beagle-search"))) { |
1238 | execute (manager, "beagle-search", FALSE(0), FALSE(0)); |
1239 | } else if ((cmd = g_find_program_in_path ("tracker-search-tool"))) { |
1240 | execute (manager, "tracker-search-tool", FALSE(0), FALSE(0)); |
1241 | } else { |
1242 | execute (manager, "cafe-search-tool", FALSE(0), FALSE(0)); |
1243 | } |
1244 | g_free (cmd); |
1245 | break; |
1246 | case EMAIL_KEY: |
1247 | do_url_action (manager, "mailto"); |
1248 | break; |
1249 | case CONTROL_CENTER_KEY: |
1250 | if ((cmd = g_find_program_in_path ("cafe-control-center"))) |
1251 | execute (manager, "cafe-control-center", FALSE(0), FALSE(0)); |
1252 | |
1253 | g_free (cmd); |
1254 | break; |
1255 | case SCREENSAVER_KEY: |
1256 | if ((cmd = g_find_program_in_path ("cafe-screensaver-command"))) { |
1257 | execute (manager, "cafe-screensaver-command --lock", FALSE(0), FALSE(0)); |
1258 | } else { |
1259 | execute (manager, "xscreensaver-command -lock", FALSE(0), FALSE(0)); |
1260 | } |
1261 | |
1262 | g_free (cmd); |
1263 | break; |
1264 | case HELP_KEY: |
1265 | do_url_action (manager, "help"); |
1266 | break; |
1267 | case WWW_KEY: |
1268 | do_url_action (manager, "http"); |
1269 | break; |
1270 | case MEDIA_KEY: |
1271 | do_media_action (manager); |
1272 | break; |
1273 | case CALCULATOR_KEY: |
1274 | do_calculator_action (manager); |
1275 | break; |
1276 | case MESSENGER_KEY: |
1277 | do_messenger_action (manager); |
1278 | break; |
1279 | case PLAY_KEY: |
1280 | return do_multimedia_player_action (manager, "Play"); |
1281 | case PAUSE_KEY: |
1282 | return do_multimedia_player_action (manager, "Pause"); |
1283 | case STOP_KEY: |
1284 | return do_multimedia_player_action (manager, "Stop"); |
1285 | case PREVIOUS_KEY: |
1286 | return do_multimedia_player_action (manager, "Previous"); |
1287 | case NEXT_KEY: |
1288 | return do_multimedia_player_action (manager, "Next"); |
1289 | case REWIND_KEY: |
1290 | return do_multimedia_player_action (manager, "Rewind"); |
1291 | case FORWARD_KEY: |
1292 | return do_multimedia_player_action (manager, "FastForward"); |
1293 | case REPEAT_KEY: |
1294 | return do_multimedia_player_action (manager, "Repeat"); |
1295 | case RANDOM_KEY: |
1296 | return do_multimedia_player_action (manager, "Shuffle"); |
1297 | case MAGNIFIER_KEY: |
1298 | do_magnifier_action (manager); |
1299 | break; |
1300 | case SCREENREADER_KEY: |
1301 | do_screenreader_action (manager); |
1302 | break; |
1303 | case ON_SCREEN_KEYBOARD_KEY: |
1304 | do_on_screen_keyboard_action (manager); |
1305 | break; |
1306 | case RFKILL_KEY: |
1307 | do_rfkill_action (manager, FALSE(0)); |
1308 | break; |
1309 | case BLUETOOTH_RFKILL_KEY: |
1310 | do_rfkill_action (manager, TRUE(!(0))); |
1311 | break; |
1312 | case DISPLAY_KEY: |
1313 | do_display_osd_action (manager); |
1314 | break; |
1315 | default: |
1316 | g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "csd_media-keys-manager.c" , 1316, ((const char*) (__func__)), ((void*)0)); } while (0); |
1317 | } |
1318 | |
1319 | return FALSE(0); |
1320 | } |
1321 | |
1322 | static CdkScreen * |
1323 | acme_get_screen_from_event (CsdMediaKeysManager *manager, |
1324 | XAnyEvent *xanyev) |
1325 | { |
1326 | CdkWindow *window; |
1327 | CdkScreen *screen; |
1328 | GSList *l; |
1329 | |
1330 | /* Look for which screen we're receiving events */ |
1331 | for (l = manager->priv->screens; l != NULL((void*)0); l = l->next) { |
1332 | screen = (CdkScreen *) l->data; |
1333 | window = cdk_screen_get_root_window (screen); |
1334 | |
1335 | if (CDK_WINDOW_XID (window)(cdk_x11_window_get_xid (window)) == xanyev->window) { |
1336 | return screen; |
1337 | } |
1338 | } |
1339 | |
1340 | return NULL((void*)0); |
1341 | } |
1342 | |
1343 | static CdkFilterReturn |
1344 | acme_filter_events (CdkXEvent *xevent, |
1345 | CdkEvent *event G_GNUC_UNUSED__attribute__ ((__unused__)), |
1346 | CsdMediaKeysManager *manager) |
1347 | { |
1348 | XEvent *xev = (XEvent *) xevent; |
1349 | XAnyEvent *xany = (XAnyEvent *) xevent; |
1350 | int i; |
1351 | |
1352 | /* verify we have a key event */ |
1353 | if (xev->type != KeyPress2) { |
1354 | return CDK_FILTER_CONTINUE; |
1355 | } |
1356 | |
1357 | for (i = 0; i < HANDLED_KEYS; i++) { |
1358 | if (match_key (keys[i].key, xev)) { |
1359 | switch (keys[i].key_type) { |
1360 | case VOLUME_DOWN_KEY: |
1361 | case VOLUME_UP_KEY: |
1362 | case VOLUME_DOWN_QUIET_KEY: |
1363 | case VOLUME_UP_QUIET_KEY: |
1364 | /* auto-repeatable keys */ |
1365 | if (xev->type != KeyPress2) { |
1366 | return CDK_FILTER_CONTINUE; |
1367 | } |
1368 | break; |
1369 | } |
1370 | |
1371 | manager->priv->current_screen = acme_get_screen_from_event (manager, xany); |
1372 | |
1373 | if (do_action (manager, keys[i].key_type) == FALSE(0)) { |
1374 | return CDK_FILTER_REMOVE; |
1375 | } else { |
1376 | return CDK_FILTER_CONTINUE; |
1377 | } |
1378 | } |
1379 | } |
1380 | |
1381 | return CDK_FILTER_CONTINUE; |
1382 | } |
1383 | |
1384 | static void |
1385 | on_rfkill_proxy_ready (GObject *source G_GNUC_UNUSED__attribute__ ((__unused__)), |
1386 | GAsyncResult *result, |
1387 | gpointer data) |
1388 | { |
1389 | CsdMediaKeysManager *manager = data; |
1390 | |
1391 | manager->priv->rfkill_proxy = |
1392 | g_dbus_proxy_new_for_bus_finish (result, NULL((void*)0)); |
1393 | } |
1394 | |
1395 | static void |
1396 | rfkill_appeared_cb (GDBusConnection *connection G_GNUC_UNUSED__attribute__ ((__unused__)), |
1397 | const gchar *name G_GNUC_UNUSED__attribute__ ((__unused__)), |
1398 | const gchar *name_owner G_GNUC_UNUSED__attribute__ ((__unused__)), |
1399 | gpointer user_data) |
1400 | { |
1401 | CsdMediaKeysManager *manager = user_data; |
1402 | |
1403 | g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, |
1404 | 0, NULL((void*)0), |
1405 | "org.cafe.SettingsDaemon.Rfkill", |
1406 | "/org/cafe/SettingsDaemon/Rfkill", |
1407 | "org.cafe.SettingsDaemon.Rfkill", |
1408 | manager->priv->rfkill_cancellable, |
1409 | on_rfkill_proxy_ready, manager); |
1410 | } |
1411 | |
1412 | static gboolean |
1413 | start_media_keys_idle_cb (CsdMediaKeysManager *manager) |
1414 | { |
1415 | GSList *l; |
1416 | CdkDisplay *dpy; |
1417 | Display *xdpy; |
1418 | |
1419 | g_debug ("Starting media_keys manager"); |
1420 | cafe_settings_profile_start (NULL); |
1421 | |
1422 | dpy = cdk_display_get_default (); |
1423 | xdpy = CDK_DISPLAY_XDISPLAY (dpy)(cdk_x11_display_get_xdisplay (dpy)); |
1424 | |
1425 | manager->priv->volume_monitor = g_volume_monitor_get (); |
1426 | manager->priv->settings = g_settings_new (BINDING_SCHEMA"org.cafe.SettingsDaemon.plugins.media-keys"); |
1427 | |
1428 | ensure_cancellable (&manager->priv->rfkill_cancellable); |
1429 | |
1430 | init_screens (manager); |
1431 | init_kbd (manager); |
1432 | |
1433 | /* Start filtering the events */ |
1434 | for (l = manager->priv->screens; l != NULL((void*)0); l = l->next) { |
1435 | CdkWindow *window; |
1436 | Window xwindow; |
1437 | XWindowAttributes atts; |
1438 | |
1439 | cafe_settings_profile_start ("cdk_window_add_filter"); |
1440 | |
1441 | window = cdk_screen_get_root_window (l->data); |
1442 | xwindow = CDK_WINDOW_XID (window)(cdk_x11_window_get_xid (window)); |
1443 | |
1444 | g_debug ("adding key filter for screen: %d", |
1445 | cdk_x11_screen_get_screen_number (l->data)); |
1446 | |
1447 | cdk_window_add_filter (window, |
1448 | (CdkFilterFunc)acme_filter_events, |
1449 | manager); |
1450 | |
1451 | cdk_x11_display_error_trap_push (dpy); |
1452 | /* Add KeyPressMask to the currently reportable event masks */ |
1453 | XGetWindowAttributes (xdpy, xwindow, &atts); |
1454 | XSelectInput (xdpy, xwindow, atts.your_event_mask | KeyPressMask(1L<<0)); |
1455 | cdk_x11_display_error_trap_pop_ignored (dpy); |
1456 | |
1457 | cafe_settings_profile_end ("cdk_window_add_filter"); |
1458 | } |
1459 | |
1460 | manager->priv->rfkill_watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION, |
1461 | "org.cafe.SettingsDaemon.Rfkill", |
1462 | G_BUS_NAME_WATCHER_FLAGS_NONE, |
1463 | rfkill_appeared_cb, |
1464 | NULL((void*)0), |
1465 | manager, NULL((void*)0)); |
1466 | |
1467 | cafe_settings_profile_end (NULL); |
1468 | |
1469 | return FALSE(0); |
1470 | } |
1471 | |
1472 | gboolean |
1473 | csd_media_keys_manager_start (CsdMediaKeysManager *manager, |
1474 | GError **error G_GNUC_UNUSED__attribute__ ((__unused__))) |
1475 | { |
1476 | cafe_settings_profile_start (NULL); |
1477 | |
1478 | #ifdef HAVE_LIBCAFEMIXER1 |
1479 | if (G_LIKELY (cafe_mixer_is_initialized ())(cafe_mixer_is_initialized ())) { |
1480 | cafe_settings_profile_start ("cafe_mixer_context_new"); |
1481 | |
1482 | manager->priv->context = cafe_mixer_context_new (); |
1483 | |
1484 | g_signal_connect (manager->priv->context,g_signal_connect_data ((manager->priv->context), ("notify::state" ), (((GCallback) (on_context_state_notify))), (manager), ((void *)0), (GConnectFlags) 0) |
1485 | "notify::state",g_signal_connect_data ((manager->priv->context), ("notify::state" ), (((GCallback) (on_context_state_notify))), (manager), ((void *)0), (GConnectFlags) 0) |
1486 | G_CALLBACK (on_context_state_notify),g_signal_connect_data ((manager->priv->context), ("notify::state" ), (((GCallback) (on_context_state_notify))), (manager), ((void *)0), (GConnectFlags) 0) |
1487 | manager)g_signal_connect_data ((manager->priv->context), ("notify::state" ), (((GCallback) (on_context_state_notify))), (manager), ((void *)0), (GConnectFlags) 0); |
1488 | g_signal_connect (manager->priv->context,g_signal_connect_data ((manager->priv->context), ("notify::default-output-stream" ), (((GCallback) (on_context_default_output_notify))), (manager ), ((void*)0), (GConnectFlags) 0) |
1489 | "notify::default-output-stream",g_signal_connect_data ((manager->priv->context), ("notify::default-output-stream" ), (((GCallback) (on_context_default_output_notify))), (manager ), ((void*)0), (GConnectFlags) 0) |
1490 | G_CALLBACK (on_context_default_output_notify),g_signal_connect_data ((manager->priv->context), ("notify::default-output-stream" ), (((GCallback) (on_context_default_output_notify))), (manager ), ((void*)0), (GConnectFlags) 0) |
1491 | manager)g_signal_connect_data ((manager->priv->context), ("notify::default-output-stream" ), (((GCallback) (on_context_default_output_notify))), (manager ), ((void*)0), (GConnectFlags) 0); |
1492 | g_signal_connect (manager->priv->context,g_signal_connect_data ((manager->priv->context), ("notify::default-input-stream" ), (((GCallback) (on_context_default_input_notify))), (manager ), ((void*)0), (GConnectFlags) 0) |
1493 | "notify::default-input-stream",g_signal_connect_data ((manager->priv->context), ("notify::default-input-stream" ), (((GCallback) (on_context_default_input_notify))), (manager ), ((void*)0), (GConnectFlags) 0) |
1494 | G_CALLBACK (on_context_default_input_notify),g_signal_connect_data ((manager->priv->context), ("notify::default-input-stream" ), (((GCallback) (on_context_default_input_notify))), (manager ), ((void*)0), (GConnectFlags) 0) |
1495 | manager)g_signal_connect_data ((manager->priv->context), ("notify::default-input-stream" ), (((GCallback) (on_context_default_input_notify))), (manager ), ((void*)0), (GConnectFlags) 0); |
1496 | g_signal_connect (manager->priv->context,g_signal_connect_data ((manager->priv->context), ("stream-removed" ), (((GCallback) (on_context_stream_removed))), (manager), (( void*)0), (GConnectFlags) 0) |
1497 | "stream-removed",g_signal_connect_data ((manager->priv->context), ("stream-removed" ), (((GCallback) (on_context_stream_removed))), (manager), (( void*)0), (GConnectFlags) 0) |
1498 | G_CALLBACK (on_context_stream_removed),g_signal_connect_data ((manager->priv->context), ("stream-removed" ), (((GCallback) (on_context_stream_removed))), (manager), (( void*)0), (GConnectFlags) 0) |
1499 | manager)g_signal_connect_data ((manager->priv->context), ("stream-removed" ), (((GCallback) (on_context_stream_removed))), (manager), (( void*)0), (GConnectFlags) 0); |
1500 | |
1501 | cafe_mixer_context_open (manager->priv->context); |
1502 | |
1503 | cafe_settings_profile_end ("cafe_mixer_context_new"); |
1504 | } |
1505 | #endif |
1506 | g_idle_add ((GSourceFunc) start_media_keys_idle_cb, manager); |
1507 | |
1508 | cafe_settings_profile_end (NULL); |
1509 | |
1510 | return TRUE(!(0)); |
1511 | } |
1512 | |
1513 | void |
1514 | csd_media_keys_manager_stop (CsdMediaKeysManager *manager) |
1515 | { |
1516 | CsdMediaKeysManagerPrivate *priv = manager->priv; |
1517 | CdkDisplay *dpy; |
1518 | GSList *ls; |
1519 | GList *l; |
1520 | int i; |
1521 | gboolean need_flush; |
1522 | |
1523 | g_debug ("Stopping media_keys manager"); |
1524 | |
1525 | for (ls = priv->screens; ls != NULL((void*)0); ls = ls->next) { |
1526 | cdk_window_remove_filter (cdk_screen_get_root_window (ls->data), |
1527 | (CdkFilterFunc) acme_filter_events, |
1528 | manager); |
1529 | } |
1530 | |
1531 | if (manager->priv->rfkill_watch_id > 0) { |
1532 | g_bus_unwatch_name (manager->priv->rfkill_watch_id); |
1533 | manager->priv->rfkill_watch_id = 0; |
1534 | } |
1535 | |
1536 | if (priv->settings != NULL((void*)0)) { |
1537 | g_object_unref (priv->settings); |
1538 | priv->settings = NULL((void*)0); |
1539 | } |
1540 | |
1541 | if (priv->volume_monitor != NULL((void*)0)) { |
1542 | g_object_unref (priv->volume_monitor); |
1543 | priv->volume_monitor = NULL((void*)0); |
1544 | } |
1545 | |
1546 | if (priv->connection != NULL((void*)0)) { |
1547 | dbus_g_connection_unref (priv->connection); |
1548 | priv->connection = NULL((void*)0); |
1549 | } |
1550 | |
1551 | need_flush = FALSE(0); |
1552 | dpy = cdk_display_get_default (); |
1553 | cdk_x11_display_error_trap_push (dpy); |
1554 | |
1555 | for (i = 0; i < HANDLED_KEYS; ++i) { |
1556 | if (keys[i].key) { |
1557 | need_flush = TRUE(!(0)); |
1558 | grab_key_unsafe (keys[i].key, FALSE(0), priv->screens); |
1559 | |
1560 | g_free (keys[i].key->keycodes); |
1561 | g_free (keys[i].key); |
1562 | keys[i].key = NULL((void*)0); |
1563 | } |
1564 | } |
1565 | |
1566 | if (need_flush) |
1567 | cdk_display_flush (dpy); |
1568 | |
1569 | cdk_x11_display_error_trap_pop_ignored (dpy); |
1570 | |
1571 | g_slist_free (priv->screens); |
1572 | priv->screens = NULL((void*)0); |
1573 | |
1574 | if (priv->rfkill_cancellable != NULL((void*)0)) { |
1575 | g_cancellable_cancel (priv->rfkill_cancellable); |
1576 | g_clear_object (&priv->rfkill_cancellable)do { _Static_assert (sizeof *((&priv->rfkill_cancellable )) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&priv->rfkill_cancellable))) _pp = ((&priv-> rfkill_cancellable)); __typeof__ (*((&priv->rfkill_cancellable ))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref ) (_ptr); } while (0); |
1577 | } |
1578 | |
1579 | #ifdef HAVE_LIBCAFEMIXER1 |
1580 | g_clear_object (&priv->stream)do { _Static_assert (sizeof *((&priv->stream)) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ ((( &priv->stream))) _pp = ((&priv->stream)); __typeof__ (*((&priv->stream))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref) (_ptr); } while (0); |
1581 | g_clear_object (&priv->source_stream)do { _Static_assert (sizeof *((&priv->source_stream)) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&priv->source_stream))) _pp = ((&priv->source_stream )); __typeof__ (*((&priv->source_stream))) _ptr = *_pp ; *_pp = ((void*)0); if (_ptr) (g_object_unref) (_ptr); } while (0); |
1582 | g_clear_object (&priv->control)do { _Static_assert (sizeof *((&priv->control)) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ ((( &priv->control))) _pp = ((&priv->control)); __typeof__ (*((&priv->control))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref) (_ptr); } while (0); |
1583 | g_clear_object (&priv->source_control)do { _Static_assert (sizeof *((&priv->source_control)) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&priv->source_control))) _pp = ((&priv->source_control )); __typeof__ (*((&priv->source_control))) _ptr = *_pp ; *_pp = ((void*)0); if (_ptr) (g_object_unref) (_ptr); } while (0); |
1584 | g_clear_object (&priv->context)do { _Static_assert (sizeof *((&priv->context)) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ ((( &priv->context))) _pp = ((&priv->context)); __typeof__ (*((&priv->context))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref) (_ptr); } while (0); |
1585 | #endif |
1586 | |
1587 | if (priv->dialog != NULL((void*)0)) { |
1588 | ctk_widget_destroy (priv->dialog); |
1589 | priv->dialog = NULL((void*)0); |
1590 | } |
1591 | |
1592 | for (l = priv->media_players; l; l = l->next) { |
1593 | MediaPlayer *mp = l->data; |
1594 | g_free (mp->application); |
1595 | g_free (mp); |
1596 | } |
1597 | g_list_free (priv->media_players); |
1598 | priv->media_players = NULL((void*)0); |
1599 | } |
1600 | |
1601 | static void |
1602 | csd_media_keys_manager_class_init (CsdMediaKeysManagerClass *klass) |
1603 | { |
1604 | signals[MEDIA_PLAYER_KEY_PRESSED] = |
1605 | g_signal_new ("media-player-key-pressed", |
1606 | G_OBJECT_CLASS_TYPE (klass)((((GTypeClass*) (klass))->g_type)), |
1607 | G_SIGNAL_RUN_LAST, |
1608 | G_STRUCT_OFFSET (CsdMediaKeysManagerClass, media_player_key_pressed)((glong) __builtin_offsetof(CsdMediaKeysManagerClass, media_player_key_pressed )), |
1609 | NULL((void*)0), |
1610 | NULL((void*)0), |
1611 | csd_marshal_VOID__STRING_STRING, |
1612 | G_TYPE_NONE((GType) ((1) << (2))), |
1613 | 2, |
1614 | G_TYPE_STRING((GType) ((16) << (2))), |
1615 | G_TYPE_STRING((GType) ((16) << (2)))); |
1616 | |
1617 | dbus_g_object_type_install_info (CSD_TYPE_MEDIA_KEYS_MANAGER(csd_media_keys_manager_get_type ()), &dbus_glib_csd_media_keys_manager_object_info); |
1618 | } |
1619 | |
1620 | static void |
1621 | csd_media_keys_manager_init (CsdMediaKeysManager *manager) |
1622 | { |
1623 | manager->priv = csd_media_keys_manager_get_instance_private (manager); |
1624 | } |
1625 | |
1626 | static gboolean |
1627 | register_manager (CsdMediaKeysManager *manager) |
1628 | { |
1629 | GError *error = NULL((void*)0); |
1630 | |
1631 | manager->priv->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); |
1632 | if (manager->priv->connection == NULL((void*)0)) { |
1633 | if (error != NULL((void*)0)) { |
1634 | g_error ("Error getting session bus: %s", error->message); |
1635 | g_error_free (error); |
1636 | } |
1637 | return FALSE(0); |
1638 | } |
1639 | |
1640 | dbus_g_connection_register_g_object (manager->priv->connection, CSD_MEDIA_KEYS_DBUS_PATH"/org/cafe/SettingsDaemon" "/MediaKeys", G_OBJECT (manager)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((manager)), (((GType) ((20) << (2))))))))); |
1641 | |
1642 | return TRUE(!(0)); |
1643 | } |
1644 | |
1645 | CsdMediaKeysManager * |
1646 | csd_media_keys_manager_new (void) |
1647 | { |
1648 | if (manager_object != NULL((void*)0)) { |
1649 | g_object_ref (manager_object)((__typeof__ (manager_object)) (g_object_ref) (manager_object )); |
1650 | } else { |
1651 | gboolean res; |
1652 | |
1653 | manager_object = g_object_new (CSD_TYPE_MEDIA_KEYS_MANAGER(csd_media_keys_manager_get_type ()), NULL((void*)0)); |
1654 | g_object_add_weak_pointer (manager_object, |
1655 | (gpointer *) &manager_object); |
1656 | res = register_manager (manager_object); |
1657 | if (! res) { |
1658 | g_object_unref (manager_object); |
1659 | return NULL((void*)0); |
1660 | } |
1661 | } |
1662 | |
1663 | return CSD_MEDIA_KEYS_MANAGER (manager_object)((((CsdMediaKeysManager*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((manager_object)), ((csd_media_keys_manager_get_type ())))))); |
1664 | } |