Bug Summary

File:plugins/media-keys/csd_media-keys-manager.c
Warning:line 602, column 25
Value stored to 'score' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name csd_media-keys-manager.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/rootdir/plugins/media-keys -fcoverage-compilation-dir=/rootdir/plugins/media-keys -resource-dir /usr/lib/llvm-19/lib/clang/19 -D HAVE_CONFIG_H -I . -I ../.. -I ../../cafe-settings-daemon -I ../../plugins/common -D PIXMAPDIR="/usr/share/cafe-settings-daemon" -D CTKBUILDERDIR="/usr/share/cafe-settings-daemon" -D CAFE_SETTINGS_LOCALEDIR="/usr/share/locale" -I /usr/include/ctk-3.0 -I /usr/include/pango-1.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/gio-unix-2.0 -I /usr/include/atk-1.0 -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/cafe-mixer -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -D _REENTRANT -I /usr/include/ctk-3.0 -I /usr/include/pango-1.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/gio-unix-2.0 -I /usr/include/atk-1.0 -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -internal-isystem /usr/lib/llvm-19/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/15/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2025-09-14-115532-64160-1 -x c csd_media-keys-manager.c
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
60typedef struct {
61 char *application;
62 guint32 time;
63} MediaPlayer;
64
65struct _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
94enum {
95 MEDIA_PLAYER_KEY_PRESSED,
96 LAST_SIGNAL
97};
98
99static guint signals[LAST_SIGNAL] = { 0 };
100
101G_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
103static gpointer manager_object = NULL((void*)0);
104
105static void
106init_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
123static void
124acme_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
142static char *
143get_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
166static void
167execute (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
233static void
234dialog_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
247static gboolean
248is_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
260static void
261update_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
322static 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
390static void
391ensure_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
402static void
403dialog_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
477static void
478do_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
500static void
501do_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
521static void
522do_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
537static void
538do_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
553static void
554do_shutdown_action (CsdMediaKeysManager *manager)
555{
556 execute (manager, "cafe-session-save --shutdown-dialog", FALSE(0), FALSE(0));
557}
558
559static void
560do_logout_action (CsdMediaKeysManager *manager)
561{
562 execute (manager, "cafe-session-save --logout-dialog", FALSE(0), FALSE(0));
563}
564
565static void
566do_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
576static void
577do_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
631static void
632do_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
641static void
642do_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
659static void
660update_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
698static void
699do_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
789static void
790update_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
822static void
823update_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
854static void
855on_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
863static void
864on_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
871static void
872on_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
879static void
880on_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
905static gboolean
906get_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
921typedef struct {
922 CsdMediaKeysManager *manager;
923 char *property;
924 gboolean bluetooth;
925 gboolean target_state;
926} RfkillData;
927
928static void
929set_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);
966out:
967 g_free (data->property);
968 g_free (data);
969}
970
971static void
972do_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
1019static void
1020do_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
1040static gint
1041find_by_application (gconstpointer a,
1042 gconstpointer b)
1043{
1044 return strcmp (((MediaPlayer *)a)->application, b);
1045}
1046
1047static gint
1048find_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 */
1061gboolean
1062csd_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
1103gboolean
1104csd_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
1124static gboolean
1125csd_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
1142static gboolean
1143do_multimedia_player_action (CsdMediaKeysManager *manager,
1144 const char *key)
1145{
1146 return csd_media_player_key_pressed (manager, key);
1147}
1148
1149static void
1150do_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
1161static void
1162do_magnifier_action (CsdMediaKeysManager *manager G_GNUC_UNUSED__attribute__ ((__unused__)))
1163{
1164 do_toggle_accessibility_key ("screen-magnifier-enabled");
1165}
1166
1167static void
1168do_screenreader_action (CsdMediaKeysManager *manager G_GNUC_UNUSED__attribute__ ((__unused__)))
1169{
1170 do_toggle_accessibility_key ("screen-reader-enabled");
1171}
1172
1173static void
1174do_on_screen_keyboard_action (CsdMediaKeysManager *manager G_GNUC_UNUSED__attribute__ ((__unused__)))
1175{
1176 do_toggle_accessibility_key ("screen-keyboard-enabled");
1177}
1178
1179static gboolean
1180do_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
1322static CdkScreen *
1323acme_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
1343static CdkFilterReturn
1344acme_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
1384static void
1385on_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
1395static void
1396rfkill_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
1412static gboolean
1413start_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
1472gboolean
1473csd_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
1513void
1514csd_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
1601static void
1602csd_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
1620static void
1621csd_media_keys_manager_init (CsdMediaKeysManager *manager)
1622{
1623 manager->priv = csd_media_keys_manager_get_instance_private (manager);
1624}
1625
1626static gboolean
1627register_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
1645CsdMediaKeysManager *
1646csd_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}