File: | kanberra-ctk-module.c |
Warning: | line 598, column 22 Access to field 'changed_mask' results in a dereference of a null pointer (loaded from variable 'e') |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /*-*- Mode: C; c-basic-offset: 8 -*-*/ | |||
2 | ||||
3 | /*** | |||
4 | This file is part of libkanberra. | |||
5 | ||||
6 | Copyright 2008 Lennart Poettering | |||
7 | ||||
8 | libkanberra is free software; you can redistribute it and/or modify | |||
9 | it under the terms of the GNU Lesser General Public License as | |||
10 | published by the Free Software Foundation, either version 2.1 of the | |||
11 | License, or (at your option) any later version. | |||
12 | ||||
13 | libkanberra is distributed in the hope that it will be useful, but | |||
14 | WITHOUT ANY WARRANTY; without even the implied warranty of | |||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
16 | Lesser General Public License for more details. | |||
17 | ||||
18 | You should have received a copy of the GNU Lesser General Public | |||
19 | License along with libkanberra. If not, see | |||
20 | <http://www.gnu.org/licenses/>. | |||
21 | ***/ | |||
22 | ||||
23 | #ifdef HAVE_CONFIG_H1 | |||
24 | #include <config.h> | |||
25 | #endif | |||
26 | ||||
27 | #include <ctk/ctk.h> | |||
28 | #include <cdk/cdkx.h> | |||
29 | #include <X11/Xatom.h> | |||
30 | ||||
31 | #include "kanberra-ctk.h" | |||
32 | ||||
33 | typedef struct { | |||
34 | guint signal_id; | |||
35 | gboolean arg1_is_set; | |||
36 | GObject *object; | |||
37 | GValue arg1; | |||
38 | CdkEvent *event; | |||
39 | } SoundEventData; | |||
40 | ||||
41 | /* | |||
42 | We generate these sounds: | |||
43 | ||||
44 | dialog-error | |||
45 | dialog-warning | |||
46 | dialog-information | |||
47 | dialog-question | |||
48 | window-new | |||
49 | window-close | |||
50 | window-minimized | |||
51 | window-unminimized | |||
52 | window-maximized | |||
53 | window-unmaximized | |||
54 | notebook-tab-changed | |||
55 | dialog-ok | |||
56 | dialog-cancel | |||
57 | item-selected | |||
58 | link-pressed | |||
59 | link-released | |||
60 | button-pressed | |||
61 | button-released | |||
62 | menu-click | |||
63 | button-toggle-on | |||
64 | button-toggle-off | |||
65 | menu-popup | |||
66 | menu-popdown | |||
67 | menu-replace | |||
68 | tooltip-popup | |||
69 | tooltip-popdown | |||
70 | drag-start | |||
71 | drag-accept | |||
72 | drag-fail | |||
73 | expander-toggle-on | |||
74 | expander-toggle-off | |||
75 | ||||
76 | TODO: | |||
77 | scroll-xxx | |||
78 | window-switch | |||
79 | window-resize-xxx | |||
80 | window-move-xxx | |||
81 | ||||
82 | */ | |||
83 | ||||
84 | static gboolean disabled = FALSE(0); | |||
85 | ||||
86 | static GQueue sound_event_queue = G_QUEUE_INIT{ ((void*)0), ((void*)0), 0 }; | |||
87 | ||||
88 | static guint idle_id = 0; | |||
89 | ||||
90 | static guint | |||
91 | signal_id_dialog_response, | |||
92 | signal_id_widget_show, | |||
93 | signal_id_widget_hide, | |||
94 | signal_id_check_menu_item_toggled, | |||
95 | signal_id_menu_item_activate, | |||
96 | signal_id_toggle_button_toggled, | |||
97 | signal_id_button_pressed, | |||
98 | signal_id_button_released, | |||
99 | signal_id_widget_window_state_event, | |||
100 | signal_id_notebook_switch_page, | |||
101 | signal_id_tree_view_cursor_changed, | |||
102 | signal_id_icon_view_selection_changed, | |||
103 | signal_id_widget_drag_begin, | |||
104 | signal_id_widget_drag_failed, | |||
105 | signal_id_widget_drag_drop, | |||
106 | signal_id_expander_activate; | |||
107 | ||||
108 | static GQuark | |||
109 | disable_sound_quark, | |||
110 | was_iconized_quark, | |||
111 | is_xembed_quark; | |||
112 | ||||
113 | /* Make sure GCC doesn't warn us about a missing prototype for this | |||
114 | * exported function */ | |||
115 | void ctk_module_init(gint *argc, gchar ***argv[]); | |||
116 | ||||
117 | static const char *translate_message_tye(CtkMessageType mt) { | |||
118 | static const char *const message_type_table[] = { | |||
119 | [CTK_MESSAGE_INFO] = "dialog-information", | |||
120 | [CTK_MESSAGE_WARNING] = "dialog-warning", | |||
121 | [CTK_MESSAGE_QUESTION] = "dialog-question", | |||
122 | [CTK_MESSAGE_ERROR] = "dialog-error", | |||
123 | [CTK_MESSAGE_OTHER] = NULL((void*)0) | |||
124 | }; | |||
125 | ||||
126 | if (mt >= G_N_ELEMENTS(message_type_table)(sizeof (message_type_table) / sizeof ((message_type_table)[0 ]))) | |||
127 | return NULL((void*)0); | |||
128 | ||||
129 | return message_type_table[mt]; | |||
130 | } | |||
131 | ||||
132 | static const char *translate_response(int response) { | |||
133 | static const char *const response_table[] = { | |||
134 | [-CTK_RESPONSE_NONE] = NULL((void*)0), | |||
135 | [-CTK_RESPONSE_REJECT] = "dialog-cancel", | |||
136 | [-CTK_RESPONSE_DELETE_EVENT] = "dialog-cancel", | |||
137 | [-CTK_RESPONSE_ACCEPT] = "dialog-ok", | |||
138 | [-CTK_RESPONSE_OK] = "dialog-ok", | |||
139 | [-CTK_RESPONSE_CANCEL] = "dialog-cancel", | |||
140 | [-CTK_RESPONSE_CLOSE] = "dialog-ok", | |||
141 | [-CTK_RESPONSE_YES] = "dialog-ok", | |||
142 | [-CTK_RESPONSE_NO] = "dialog-cancel", | |||
143 | [-CTK_RESPONSE_APPLY] = "dialog-ok", | |||
144 | [-CTK_RESPONSE_HELP] = NULL((void*)0), | |||
145 | }; | |||
146 | ||||
147 | if (response >= 0) | |||
148 | return NULL((void*)0); | |||
149 | ||||
150 | if ((unsigned) -response >= G_N_ELEMENTS(response_table)(sizeof (response_table) / sizeof ((response_table)[0]))) | |||
151 | return NULL((void*)0); | |||
152 | ||||
153 | return response_table[-response]; | |||
154 | } | |||
155 | ||||
156 | static gboolean is_child_of_combo_box(CtkWidget *w) { | |||
157 | ||||
158 | while (w) { | |||
159 | ||||
160 | if (CTK_IS_COMBO_BOX(w)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (w)); GType __t = ((ctk_combo_box_get_type ())); gboolean __r ; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) | |||
161 | return TRUE(!(0)); | |||
162 | ||||
163 | w = ctk_widget_get_parent(w); | |||
164 | } | |||
165 | ||||
166 | return FALSE(0); | |||
167 | } | |||
168 | ||||
169 | static CtkDialog* find_parent_dialog(CtkWidget *w) { | |||
170 | ||||
171 | while (w) { | |||
172 | ||||
173 | if (CTK_IS_DIALOG(w)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (w)); GType __t = ((ctk_dialog_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst ->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) | |||
174 | return CTK_DIALOG(w)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((w)), ((ctk_dialog_get_type ())))))); | |||
175 | ||||
176 | w = ctk_widget_get_parent(w); | |||
177 | } | |||
178 | ||||
179 | return NULL((void*)0); | |||
180 | } | |||
181 | ||||
182 | static void free_sound_event(SoundEventData *d) { | |||
183 | ||||
184 | g_object_unref(d->object); | |||
185 | ||||
186 | if (d->arg1_is_set) | |||
187 | g_value_unset(&d->arg1); | |||
188 | ||||
189 | if (d->event) | |||
190 | cdk_event_free(d->event); | |||
191 | ||||
192 | g_slice_free(SoundEventData, d)do { if (1) g_slice_free1 (sizeof (SoundEventData), (d)); else (void) ((SoundEventData*) 0 == (d)); } while (0); | |||
193 | } | |||
194 | ||||
195 | static gboolean is_menu_hint(CdkWindowTypeHint hint) { | |||
196 | return | |||
197 | hint == CDK_WINDOW_TYPE_HINT_POPUP_MENU || | |||
198 | hint == CDK_WINDOW_TYPE_HINT_DROPDOWN_MENU || | |||
199 | hint == CDK_WINDOW_TYPE_HINT_MENU; | |||
200 | } | |||
201 | ||||
202 | static SoundEventData* filter_sound_event(SoundEventData *d) { | |||
203 | GList *i, *n; | |||
204 | ||||
205 | do { | |||
206 | ||||
207 | for (i = sound_event_queue.head; i; i = n) { | |||
208 | SoundEventData *j; | |||
209 | ||||
210 | j = i->data; | |||
211 | n = i->next; | |||
212 | ||||
213 | if (d->object == j->object) { | |||
214 | ||||
215 | /* Let's drop a show event immediately followed by a | |||
216 | * hide event */ | |||
217 | ||||
218 | if (d->signal_id == signal_id_widget_show && | |||
219 | j->signal_id == signal_id_widget_hide) { | |||
220 | ||||
221 | free_sound_event(d); | |||
222 | free_sound_event(j); | |||
223 | g_queue_delete_link(&sound_event_queue, i); | |||
224 | ||||
225 | return NULL((void*)0); | |||
226 | } | |||
227 | ||||
228 | /* Let's drop widget hide events in favour of dialog | |||
229 | * response. | |||
230 | * | |||
231 | * Let's drop widget window state events in favour of | |||
232 | * widget hide/show. | |||
233 | * | |||
234 | * Let's drop double events */ | |||
235 | ||||
236 | if ((d->signal_id == signal_id_widget_hide && | |||
237 | j->signal_id == signal_id_dialog_response) || | |||
238 | ||||
239 | (d->signal_id == signal_id_widget_window_state_event && | |||
240 | j->signal_id == signal_id_widget_hide) || | |||
241 | ||||
242 | (d->signal_id == signal_id_widget_window_state_event && | |||
243 | j->signal_id == signal_id_widget_show)) { | |||
244 | ||||
245 | free_sound_event(d); | |||
246 | d = j; | |||
247 | g_queue_delete_link(&sound_event_queue, i); | |||
248 | break; | |||
249 | } | |||
250 | ||||
251 | if ((d->signal_id == signal_id_dialog_response && | |||
252 | j->signal_id == signal_id_widget_hide) || | |||
253 | ||||
254 | (d->signal_id == signal_id_widget_show && | |||
255 | j->signal_id == signal_id_widget_window_state_event) || | |||
256 | ||||
257 | (d->signal_id == signal_id_widget_hide && | |||
258 | j->signal_id == signal_id_widget_window_state_event) || | |||
259 | ||||
260 | (d->signal_id == j->signal_id)) { | |||
261 | ||||
262 | free_sound_event(j); | |||
263 | g_queue_delete_link(&sound_event_queue, i); | |||
264 | } | |||
265 | ||||
266 | } else if (CTK_IS_WINDOW(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_window_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && CTK_IS_WINDOW(j->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (j->object)); GType __t = ((ctk_window_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) { | |||
267 | ||||
268 | CdkWindowTypeHint dhint, jhint; | |||
269 | ||||
270 | dhint = ctk_window_get_type_hint(CTK_WINDOW(d->object)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_window_get_type ()))))))); | |||
271 | jhint = ctk_window_get_type_hint(CTK_WINDOW(j->object)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((j->object)), ((ctk_window_get_type ()))))))); | |||
272 | ||||
273 | if (is_menu_hint(dhint) && is_menu_hint(jhint)) { | |||
274 | ||||
275 | if (d->signal_id == signal_id_widget_hide && | |||
276 | j->signal_id == signal_id_widget_show) { | |||
277 | free_sound_event(d); | |||
278 | d = j; | |||
279 | g_queue_delete_link(&sound_event_queue, i); | |||
280 | break; | |||
281 | } | |||
282 | ||||
283 | if (d->signal_id == signal_id_widget_show && | |||
284 | j->signal_id == signal_id_widget_hide) { | |||
285 | ||||
286 | free_sound_event(j); | |||
287 | g_queue_delete_link(&sound_event_queue, i); | |||
288 | } | |||
289 | } | |||
290 | } | |||
291 | } | |||
292 | ||||
293 | /* If we exited the iteration early, let's retry. */ | |||
294 | ||||
295 | } while (i); | |||
296 | ||||
297 | /* FIXME: Filter menu hide on menu show */ | |||
298 | ||||
299 | return d; | |||
300 | } | |||
301 | ||||
302 | static gint window_get_desktop(CdkDisplay *d, CdkWindow *w) { | |||
303 | Atom type_return; | |||
304 | gint format_return; | |||
305 | gulong nitems_return; | |||
306 | gulong bytes_after_return; | |||
307 | guchar *data = NULL((void*)0); | |||
308 | gint ret = -1; | |||
309 | ||||
310 | #ifdef CDK_IS_X11_DISPLAY | |||
311 | if (!CDK_IS_X11_DISPLAY(d)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d)); GType __t = ((cdk_x11_display_get_type())); gboolean __r ; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) | |||
312 | return 0; | |||
313 | #endif | |||
314 | ||||
315 | if (XGetWindowProperty(CDK_DISPLAY_XDISPLAY(d)(cdk_x11_display_get_xdisplay (d)), CDK_WINDOW_XID(w)(cdk_x11_window_get_xid (w)), | |||
316 | cdk_x11_get_xatom_by_name_for_display(d, "_NET_WM_DESKTOP"), | |||
317 | 0, G_MAXLONG9223372036854775807L, False0, XA_CARDINAL((Atom) 6), &type_return, | |||
318 | &format_return, &nitems_return, &bytes_after_return, | |||
319 | &data) != Success0) | |||
320 | return -1; | |||
321 | ||||
322 | if (type_return == XA_CARDINAL((Atom) 6) && format_return == 32 && data) { | |||
323 | guint32 desktop = *(guint32*) data; | |||
324 | ||||
325 | if (desktop != 0xFFFFFFFF) | |||
326 | ret = (gint) desktop; | |||
327 | } | |||
328 | ||||
329 | if (type_return != None0L && data != NULL((void*)0)) | |||
330 | XFree(data); | |||
331 | ||||
332 | return ret; | |||
333 | } | |||
334 | ||||
335 | static gint display_get_desktop(CdkDisplay *d) { | |||
336 | Atom type_return; | |||
337 | gint format_return; | |||
338 | gulong nitems_return; | |||
339 | gulong bytes_after_return; | |||
340 | guchar *data = NULL((void*)0); | |||
341 | gint ret = -1; | |||
342 | ||||
343 | #ifdef CDK_IS_X11_DISPLAY | |||
344 | if (!CDK_IS_X11_DISPLAY(d)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d)); GType __t = ((cdk_x11_display_get_type())); gboolean __r ; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) | |||
345 | return 0; | |||
346 | #endif | |||
347 | ||||
348 | if (XGetWindowProperty(CDK_DISPLAY_XDISPLAY(d)(cdk_x11_display_get_xdisplay (d)), DefaultRootWindow(CDK_DISPLAY_XDISPLAY(d))((&((_XPrivDisplay)((cdk_x11_display_get_xdisplay (d))))-> screens[(((_XPrivDisplay)((cdk_x11_display_get_xdisplay (d))) )->default_screen)])->root), | |||
349 | cdk_x11_get_xatom_by_name_for_display(d, "_NET_CURRENT_DESKTOP"), | |||
350 | 0, G_MAXLONG9223372036854775807L, False0, XA_CARDINAL((Atom) 6), &type_return, | |||
351 | &format_return, &nitems_return, &bytes_after_return, | |||
352 | &data) != Success0) | |||
353 | return -1; | |||
354 | ||||
355 | if (type_return == XA_CARDINAL((Atom) 6) && format_return == 32 && data) { | |||
356 | ||||
357 | guint32 desktop = *(guint32*) data; | |||
358 | ||||
359 | if (desktop != 0xFFFFFFFF) | |||
360 | ret = (gint) desktop; | |||
361 | } | |||
362 | ||||
363 | if (type_return != None0L && data != NULL((void*)0)) | |||
364 | XFree(data); | |||
365 | ||||
366 | return ret; | |||
367 | } | |||
368 | ||||
369 | static gboolean window_is_xembed(CdkDisplay *d, CdkWindow *w) { | |||
370 | Atom type_return; | |||
371 | gint format_return; | |||
372 | gulong nitems_return; | |||
373 | gulong bytes_after_return; | |||
374 | guchar *data = NULL((void*)0); | |||
375 | gboolean ret = FALSE(0); | |||
376 | Atom xembed; | |||
377 | ||||
378 | #ifdef CDK_IS_X11_DISPLAY | |||
379 | if (!CDK_IS_X11_DISPLAY(d)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d)); GType __t = ((cdk_x11_display_get_type())); gboolean __r ; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) | |||
380 | return FALSE(0); | |||
381 | #endif | |||
382 | ||||
383 | /* Gnome Panel applets are XEMBED windows. We need to make sure we | |||
384 | * ignore them */ | |||
385 | ||||
386 | xembed = cdk_x11_get_xatom_by_name_for_display(d, "_XEMBED_INFO"); | |||
387 | ||||
388 | /* be robust against not existing XIDs (LP: #834403) */ | |||
389 | cdk_x11_display_error_trap_push (d); | |||
390 | if (XGetWindowProperty(CDK_DISPLAY_XDISPLAY(d)(cdk_x11_display_get_xdisplay (d)), CDK_WINDOW_XID(w)(cdk_x11_window_get_xid (w)), | |||
391 | xembed, | |||
392 | 0, 2, False0, xembed, &type_return, | |||
393 | &format_return, &nitems_return, &bytes_after_return, | |||
394 | &data) != Success0) { | |||
395 | return FALSE(0); | |||
396 | } | |||
397 | ||||
398 | cdk_x11_display_error_trap_pop_ignored (d); | |||
399 | ||||
400 | if (type_return == xembed && format_return == 32 && data) | |||
401 | ret = TRUE(!(0)); | |||
402 | ||||
403 | if (type_return != None0L && data != NULL((void*)0)) | |||
404 | XFree(data); | |||
405 | ||||
406 | return ret; | |||
407 | } | |||
408 | ||||
409 | static void dispatch_sound_event(SoundEventData *d) { | |||
410 | int ret = KA_SUCCESS; | |||
411 | static gboolean menu_is_popped_up = FALSE(0); | |||
412 | ||||
413 | if (g_object_get_qdata(d->object, disable_sound_quark)) | |||
| ||||
414 | return; | |||
415 | ||||
416 | /* The CdkWindow of the the widget might have changed while this | |||
417 | * event was queued for us. Make sure to update it from the | |||
418 | * current one if necessary. */ | |||
419 | if (d->event && d->event->any.window) { | |||
420 | CdkWindow *window; | |||
421 | ||||
422 | g_object_unref(G_OBJECT(d->event->any.window)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->event->any.window)), (((GType) ((20) << ( 2))))))))); | |||
423 | ||||
424 | if ((window = ctk_widget_get_window(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ()))))))))) | |||
425 | d->event->any.window = CDK_WINDOW(g_object_ref(G_OBJECT(window)))((((CdkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((((__typeof__ (((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((window)), (((GType) ((20) << (2))) ))))))) (g_object_ref) (((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((window)), (((GType) ((20) << (2))) ))))))))), ((cdk_window_get_type ())))))); | |||
426 | else | |||
427 | d->event->any.window = NULL((void*)0); | |||
428 | } | |||
429 | ||||
430 | if (d->signal_id == signal_id_widget_show) { | |||
431 | CdkWindowTypeHint hint; | |||
432 | ||||
433 | /* Show/hide signals for non-windows have already been filtered out | |||
434 | * by the emission hook! */ | |||
435 | ||||
436 | hint = ctk_window_get_type_hint(CTK_WINDOW(d->object)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_window_get_type ()))))))); | |||
437 | ||||
438 | if (is_menu_hint(hint)) { | |||
439 | ||||
440 | if (!menu_is_popped_up) { | |||
441 | ||||
442 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
443 | KA_PROP_EVENT_ID"event.id", "menu-popup", | |||
444 | KA_PROP_EVENT_DESCRIPTION"event.description", "Menu popped up", | |||
445 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
446 | NULL((void*)0)); | |||
447 | } else { | |||
448 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
449 | KA_PROP_EVENT_ID"event.id", "menu-replace", | |||
450 | KA_PROP_EVENT_DESCRIPTION"event.description", "Menu replaced", | |||
451 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
452 | NULL((void*)0)); | |||
453 | } | |||
454 | ||||
455 | menu_is_popped_up = TRUE(!(0)); | |||
456 | ||||
457 | } else if (hint == CDK_WINDOW_TYPE_HINT_TOOLTIP) { | |||
458 | ||||
459 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
460 | KA_PROP_EVENT_ID"event.id", "tooltip-popup", | |||
461 | KA_PROP_EVENT_DESCRIPTION"event.description", "Tooltip popped up", | |||
462 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
463 | NULL((void*)0)); | |||
464 | ||||
465 | } else if (hint == CDK_WINDOW_TYPE_HINT_NORMAL || | |||
466 | hint == CDK_WINDOW_TYPE_HINT_DIALOG) { | |||
467 | ||||
468 | gboolean played_sound = FALSE(0); | |||
469 | gboolean is_xembed; | |||
470 | ||||
471 | is_xembed = | |||
472 | ctk_widget_get_realized(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ()))))))) && | |||
473 | window_is_xembed( | |||
474 | ctk_widget_get_display(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ()))))))), | |||
475 | ctk_widget_get_window(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))))); | |||
476 | ||||
477 | g_object_set_qdata(d->object, is_xembed_quark, GINT_TO_POINTER(is_xembed)((gpointer) (glong) (is_xembed))); | |||
478 | ||||
479 | if (CTK_IS_MESSAGE_DIALOG(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_message_dialog_get_type () )); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) { | |||
480 | CtkMessageType mt; | |||
481 | const char *id; | |||
482 | ||||
483 | g_object_get(d->object, "message_type", &mt, NULL((void*)0)); | |||
484 | ||||
485 | if ((id = translate_message_tye(mt))) { | |||
486 | ||||
487 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
488 | KA_PROP_EVENT_ID"event.id", id, | |||
489 | KA_PROP_EVENT_DESCRIPTION"event.description", "Message dialog shown", | |||
490 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
491 | NULL((void*)0)); | |||
492 | played_sound = TRUE(!(0)); | |||
493 | } | |||
494 | ||||
495 | } | |||
496 | ||||
497 | if (!played_sound && | |||
498 | !is_xembed && | |||
499 | ctk_window_get_decorated(CTK_WINDOW(d->object)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_window_get_type ())))))))) { | |||
500 | ||||
501 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
502 | KA_PROP_EVENT_ID"event.id", "window-new", | |||
503 | KA_PROP_EVENT_DESCRIPTION"event.description", "Window shown", | |||
504 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
505 | NULL((void*)0)); | |||
506 | ||||
507 | } | |||
508 | } | |||
509 | } | |||
510 | ||||
511 | if (CTK_IS_DIALOG(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_dialog_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && d->signal_id == signal_id_dialog_response) { | |||
512 | ||||
513 | int response; | |||
514 | const char *id; | |||
515 | ||||
516 | response = g_value_get_int(&d->arg1); | |||
517 | ||||
518 | if ((id = translate_response(response))) { | |||
519 | ||||
520 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
521 | KA_PROP_EVENT_ID"event.id", id, | |||
522 | KA_PROP_EVENT_DESCRIPTION"event.description", "Dialog closed", | |||
523 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
524 | NULL((void*)0)); | |||
525 | } else { | |||
526 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
527 | KA_PROP_EVENT_ID"event.id", "window-close", | |||
528 | KA_PROP_EVENT_DESCRIPTION"event.description", "Window closed", | |||
529 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
530 | NULL((void*)0)); | |||
531 | } | |||
532 | ||||
533 | } else if (d->signal_id == signal_id_widget_hide) { | |||
534 | CdkWindowTypeHint hint; | |||
535 | ||||
536 | hint = ctk_window_get_type_hint(CTK_WINDOW(d->object)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_window_get_type ()))))))); | |||
537 | ||||
538 | if (is_menu_hint(hint)) { | |||
539 | ||||
540 | if (CTK_IS_MENU(ctk_bin_get_child(CTK_BIN(d->object)))(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (ctk_bin_get_child(((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((d->object)), ((ctk_bin_get_type ()))) )))))); GType __t = ((ctk_menu_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst ->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) { | |||
541 | ||||
542 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
543 | KA_PROP_EVENT_ID"event.id", "menu-popdown", | |||
544 | KA_PROP_EVENT_DESCRIPTION"event.description", "Menu popped down", | |||
545 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
546 | NULL((void*)0)); | |||
547 | } | |||
548 | ||||
549 | menu_is_popped_up = FALSE(0); | |||
550 | ||||
551 | } else if (hint == CDK_WINDOW_TYPE_HINT_TOOLTIP) { | |||
552 | ||||
553 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
554 | KA_PROP_EVENT_ID"event.id", "tooltip-popdown", | |||
555 | KA_PROP_EVENT_DESCRIPTION"event.description", "Tooltip popped down", | |||
556 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
557 | NULL((void*)0)); | |||
558 | ||||
559 | } else if ((hint == CDK_WINDOW_TYPE_HINT_NORMAL || | |||
560 | hint == CDK_WINDOW_TYPE_HINT_DIALOG)) { | |||
561 | ||||
562 | gboolean is_xembed; | |||
563 | ||||
564 | is_xembed = !!g_object_get_qdata(d->object, is_xembed_quark); | |||
565 | ||||
566 | if (!is_xembed && | |||
567 | ctk_window_get_decorated(CTK_WINDOW(d->object)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_window_get_type ())))))))) | |||
568 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
569 | KA_PROP_EVENT_ID"event.id", "window-close", | |||
570 | KA_PROP_EVENT_DESCRIPTION"event.description", "Window closed", | |||
571 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
572 | NULL((void*)0)); | |||
573 | } | |||
574 | } | |||
575 | ||||
576 | if (CTK_IS_WINDOW(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_window_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && d->signal_id == signal_id_widget_window_state_event) { | |||
577 | CdkEventWindowState *e; | |||
578 | gint w_desktop = -1, c_desktop = -1; | |||
579 | ||||
580 | e = (CdkEventWindowState*) d->event; | |||
581 | ||||
582 | /* Unfortunately CDK_WINDOW_STATE_ICONIFIED is used both for | |||
583 | * proper minimizing and when a window becomes invisible | |||
584 | * because the desktop was switched. To handle this we check | |||
585 | * if the window becoming invisible is actually on the current | |||
586 | * desktop, and only if that's the case we assume it is being | |||
587 | * minimized. We then store this information, so that we know | |||
588 | * later on when the window is unminimized again. */ | |||
589 | ||||
590 | if (ctk_widget_get_realized(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))))) { | |||
591 | CdkDisplay *display; | |||
592 | ||||
593 | display = ctk_widget_get_display(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ()))))))); | |||
594 | w_desktop = window_get_desktop(display, ctk_widget_get_window(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))))); | |||
595 | c_desktop = display_get_desktop(display); | |||
596 | } | |||
597 | ||||
598 | if ((e->changed_mask & CDK_WINDOW_STATE_ICONIFIED) && | |||
| ||||
599 | (e->new_window_state & CDK_WINDOW_STATE_ICONIFIED) && | |||
600 | (w_desktop == c_desktop || w_desktop < 0)) { | |||
601 | ||||
602 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
603 | KA_PROP_EVENT_ID"event.id", "window-minimized", | |||
604 | KA_PROP_EVENT_DESCRIPTION"event.description", "Window minimized", | |||
605 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
606 | NULL((void*)0)); | |||
607 | ||||
608 | g_object_set_qdata(d->object, was_iconized_quark, GINT_TO_POINTER(1)((gpointer) (glong) (1))); | |||
609 | ||||
610 | } else if ((e->changed_mask & (CDK_WINDOW_STATE_MAXIMIZED|CDK_WINDOW_STATE_FULLSCREEN)) && | |||
611 | (e->new_window_state & (CDK_WINDOW_STATE_MAXIMIZED|CDK_WINDOW_STATE_FULLSCREEN))) { | |||
612 | ||||
613 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
614 | KA_PROP_EVENT_ID"event.id", "window-maximized", | |||
615 | KA_PROP_EVENT_DESCRIPTION"event.description", "Window maximized", | |||
616 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
617 | NULL((void*)0)); | |||
618 | ||||
619 | g_object_set_qdata(d->object, was_iconized_quark, GINT_TO_POINTER(0)((gpointer) (glong) (0))); | |||
620 | ||||
621 | } else if ((e->changed_mask & CDK_WINDOW_STATE_ICONIFIED) && | |||
622 | !(e->new_window_state & CDK_WINDOW_STATE_ICONIFIED) && | |||
623 | g_object_get_qdata(d->object, was_iconized_quark)) { | |||
624 | ||||
625 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
626 | KA_PROP_EVENT_ID"event.id", "window-unminimized", | |||
627 | KA_PROP_EVENT_DESCRIPTION"event.description", "Window unminimized", | |||
628 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
629 | NULL((void*)0)); | |||
630 | ||||
631 | g_object_set_qdata(d->object, was_iconized_quark, GINT_TO_POINTER(0)((gpointer) (glong) (0))); | |||
632 | ||||
633 | } else if ((e->changed_mask & (CDK_WINDOW_STATE_MAXIMIZED|CDK_WINDOW_STATE_FULLSCREEN)) && | |||
634 | !(e->new_window_state & (CDK_WINDOW_STATE_MAXIMIZED|CDK_WINDOW_STATE_FULLSCREEN))) { | |||
635 | ||||
636 | ret = ka_ctk_play_for_widget(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))), 0, | |||
637 | KA_PROP_EVENT_ID"event.id", "window-unmaximized", | |||
638 | KA_PROP_EVENT_DESCRIPTION"event.description", "Window unmaximized", | |||
639 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
640 | NULL((void*)0)); | |||
641 | } | |||
642 | } | |||
643 | ||||
644 | if (CTK_IS_CHECK_MENU_ITEM(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_check_menu_item_get_type ( ))); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && d->signal_id == signal_id_check_menu_item_toggled) { | |||
645 | ||||
646 | if (ctk_check_menu_item_get_active(CTK_CHECK_MENU_ITEM(d->object)((((CtkCheckMenuItem*) (void *) g_type_check_instance_cast (( GTypeInstance*) ((d->object)), ((ctk_check_menu_item_get_type ())))))))) | |||
647 | ret = ka_ctk_play_for_event(d->event, 0, | |||
648 | KA_PROP_EVENT_ID"event.id", "button-toggle-on", | |||
649 | KA_PROP_EVENT_DESCRIPTION"event.description", "Check menu item checked", | |||
650 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
651 | NULL((void*)0)); | |||
652 | else | |||
653 | ret = ka_ctk_play_for_event(d->event, 0, | |||
654 | KA_PROP_EVENT_ID"event.id", "button-toggle-off", | |||
655 | KA_PROP_EVENT_DESCRIPTION"event.description", "Check menu item unchecked", | |||
656 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
657 | NULL((void*)0)); | |||
658 | ||||
659 | } else if (CTK_IS_MENU_ITEM(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_menu_item_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && d->signal_id == signal_id_menu_item_activate) { | |||
660 | ||||
661 | if (!ctk_menu_item_get_submenu(CTK_MENU_ITEM(d->object)((((CtkMenuItem*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_menu_item_get_type ())))))))) | |||
662 | ret = ka_ctk_play_for_event(d->event, 0, | |||
663 | KA_PROP_EVENT_ID"event.id", "menu-click", | |||
664 | KA_PROP_EVENT_DESCRIPTION"event.description", "Menu item clicked", | |||
665 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
666 | NULL((void*)0)); | |||
667 | } | |||
668 | ||||
669 | if (CTK_IS_TOGGLE_BUTTON(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_toggle_button_get_type ()) ); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) { | |||
670 | ||||
671 | if (d->signal_id == signal_id_toggle_button_toggled) { | |||
672 | ||||
673 | if (!is_child_of_combo_box(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ())))))))) { | |||
674 | ||||
675 | /* We don't want to play this sound if this is a toggle | |||
676 | * button belonging to combo box. */ | |||
677 | ||||
678 | if (ctk_toggle_button_get_active(CTK_TOGGLE_BUTTON(d->object)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_toggle_button_get_type ())))))))) | |||
679 | ret = ka_ctk_play_for_event(d->event, 0, | |||
680 | KA_PROP_EVENT_ID"event.id", "button-toggle-on", | |||
681 | KA_PROP_EVENT_DESCRIPTION"event.description", "Toggle button checked", | |||
682 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
683 | NULL((void*)0)); | |||
684 | else | |||
685 | ret = ka_ctk_play_for_event(d->event, 0, | |||
686 | KA_PROP_EVENT_ID"event.id", "button-toggle-off", | |||
687 | KA_PROP_EVENT_DESCRIPTION"event.description", "Toggle button unchecked", | |||
688 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
689 | NULL((void*)0)); | |||
690 | } | |||
691 | } | |||
692 | ||||
693 | } else if (CTK_IS_LINK_BUTTON(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_link_button_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0) ); else __r = g_type_check_instance_is_a (__inst, __t); __r; } ))))) { | |||
694 | ||||
695 | if (d->signal_id == signal_id_button_pressed) { | |||
696 | ret = ka_ctk_play_for_event(d->event, 0, | |||
697 | KA_PROP_EVENT_ID"event.id", "link-pressed", | |||
698 | KA_PROP_EVENT_DESCRIPTION"event.description", "Link pressed", | |||
699 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
700 | NULL((void*)0)); | |||
701 | ||||
702 | } else if (d->signal_id == signal_id_button_released) { | |||
703 | ||||
704 | ret = ka_ctk_play_for_event(d->event, 0, | |||
705 | KA_PROP_EVENT_ID"event.id", "link-released", | |||
706 | KA_PROP_EVENT_DESCRIPTION"event.description", "Link released", | |||
707 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
708 | NULL((void*)0)); | |||
709 | } | |||
710 | ||||
711 | } else if (CTK_IS_BUTTON(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_button_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && !CTK_IS_TOGGLE_BUTTON(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_toggle_button_get_type ()) ); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) { | |||
712 | ||||
713 | if (d->signal_id == signal_id_button_pressed) { | |||
714 | ret = ka_ctk_play_for_event(d->event, 0, | |||
715 | KA_PROP_EVENT_ID"event.id", "button-pressed", | |||
716 | KA_PROP_EVENT_DESCRIPTION"event.description", "Button pressed", | |||
717 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
718 | NULL((void*)0)); | |||
719 | ||||
720 | } else if (d->signal_id == signal_id_button_released) { | |||
721 | CtkDialog *dialog; | |||
722 | gboolean dont_play = FALSE(0); | |||
723 | ||||
724 | if ((dialog = find_parent_dialog(CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ()))))))))) { | |||
725 | int response; | |||
726 | ||||
727 | /* Don't play the click sound if this is a response widget | |||
728 | * we will generate a dialog-xxx event sound anyway. */ | |||
729 | ||||
730 | response = ctk_dialog_get_response_for_widget(dialog, CTK_WIDGET(d->object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_widget_get_type ()))))))); | |||
731 | dont_play = !!translate_response(response); | |||
732 | } | |||
733 | ||||
734 | if (!dont_play) | |||
735 | ret = ka_ctk_play_for_event(d->event, 0, | |||
736 | KA_PROP_EVENT_ID"event.id", "button-released", | |||
737 | KA_PROP_EVENT_DESCRIPTION"event.description", "Button released", | |||
738 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
739 | NULL((void*)0)); | |||
740 | } | |||
741 | } | |||
742 | ||||
743 | if (CTK_IS_NOTEBOOK(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_notebook_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && d->signal_id == signal_id_notebook_switch_page) { | |||
744 | ret = ka_ctk_play_for_event(d->event, 0, | |||
745 | KA_PROP_EVENT_ID"event.id", "notebook-tab-changed", | |||
746 | KA_PROP_EVENT_DESCRIPTION"event.description", "Tab changed", | |||
747 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
748 | NULL((void*)0)); | |||
749 | goto finish; | |||
750 | } | |||
751 | ||||
752 | if (CTK_IS_TREE_VIEW(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_tree_view_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && d->signal_id == signal_id_tree_view_cursor_changed) { | |||
753 | ret = ka_ctk_play_for_event(d->event, 0, | |||
754 | KA_PROP_EVENT_ID"event.id", "item-selected", | |||
755 | KA_PROP_EVENT_DESCRIPTION"event.description", "Item selected", | |||
756 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
757 | NULL((void*)0)); | |||
758 | goto finish; | |||
759 | } | |||
760 | ||||
761 | if (CTK_IS_ICON_VIEW(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_icon_view_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && d->signal_id == signal_id_icon_view_selection_changed) { | |||
762 | ret = ka_ctk_play_for_event(d->event, 0, | |||
763 | KA_PROP_EVENT_ID"event.id", "item-selected", | |||
764 | KA_PROP_EVENT_DESCRIPTION"event.description", "Item selected", | |||
765 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
766 | NULL((void*)0)); | |||
767 | goto finish; | |||
768 | } | |||
769 | ||||
770 | if (CTK_IS_EXPANDER(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_expander_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && d->signal_id == signal_id_expander_activate) { | |||
771 | ||||
772 | if (ctk_expander_get_expanded(CTK_EXPANDER(d->object)((((CtkExpander*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((d->object)), ((ctk_expander_get_type ())))))))) | |||
773 | ret = ka_ctk_play_for_event(d->event, 0, | |||
774 | KA_PROP_EVENT_ID"event.id", "expander-toggle-on", | |||
775 | KA_PROP_EVENT_DESCRIPTION"event.description", "Expander expanded", | |||
776 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
777 | NULL((void*)0)); | |||
778 | else | |||
779 | ret = ka_ctk_play_for_event(d->event, 0, | |||
780 | KA_PROP_EVENT_ID"event.id", "expander-toggle-off", | |||
781 | KA_PROP_EVENT_DESCRIPTION"event.description", "Expander unexpanded", | |||
782 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
783 | NULL((void*)0)); | |||
784 | ||||
785 | goto finish; | |||
786 | } | |||
787 | ||||
788 | if (CTK_IS_WIDGET(d->object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (d->object)); GType __t = ((ctk_widget_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) { | |||
789 | ||||
790 | if (d->signal_id == signal_id_widget_drag_begin) { | |||
791 | ||||
792 | ret = ka_ctk_play_for_event(d->event, 0, | |||
793 | KA_PROP_EVENT_ID"event.id", "drag-start", | |||
794 | KA_PROP_EVENT_DESCRIPTION"event.description", "Drag started", | |||
795 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
796 | NULL((void*)0)); | |||
797 | goto finish; | |||
798 | ||||
799 | } else if (d->signal_id == signal_id_widget_drag_drop) { | |||
800 | ||||
801 | ret = ka_ctk_play_for_event(d->event, 0, | |||
802 | KA_PROP_EVENT_ID"event.id", "drag-accept", | |||
803 | KA_PROP_EVENT_DESCRIPTION"event.description", "Drag accepted", | |||
804 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
805 | NULL((void*)0)); | |||
806 | goto finish; | |||
807 | ||||
808 | } else if (d->signal_id == signal_id_widget_drag_failed) { | |||
809 | ||||
810 | ret = ka_ctk_play_for_event(d->event, 0, | |||
811 | KA_PROP_EVENT_ID"event.id", "drag-fail", | |||
812 | KA_PROP_EVENT_DESCRIPTION"event.description", "Drag failed", | |||
813 | KA_PROP_KANBERRA_CACHE_CONTROL"kanberra.cache-control", "permanent", | |||
814 | NULL((void*)0)); | |||
815 | goto finish; | |||
816 | } | |||
817 | } | |||
818 | ||||
819 | finish: | |||
820 | ||||
821 | ; | |||
822 | /* if (ret != KA_SUCCESS) */ | |||
823 | /* g_warning("Failed to play event sound: %s", ka_strerror(ret)); */ | |||
824 | } | |||
825 | ||||
826 | static void dispatch_queue(void) { | |||
827 | SoundEventData *d; | |||
828 | ||||
829 | while ((d = g_queue_pop_head(&sound_event_queue))) { | |||
830 | ||||
831 | if (!(d = filter_sound_event(d))) | |||
832 | continue; | |||
833 | ||||
834 | dispatch_sound_event(d); | |||
835 | free_sound_event(d); | |||
836 | } | |||
837 | } | |||
838 | ||||
839 | static gboolean idle_cb(void *userdata) { | |||
840 | idle_id = 0; | |||
841 | ||||
842 | dispatch_queue(); | |||
843 | ||||
844 | return FALSE(0); | |||
845 | } | |||
846 | ||||
847 | static void connect_settings(void); | |||
848 | ||||
849 | static gboolean emission_hook_cb(GSignalInvocationHint *hint, guint n_param_values, const GValue *param_values, gpointer data) { | |||
850 | static SoundEventData *d = NULL((void*)0); | |||
851 | CdkEvent *e; | |||
852 | GObject *object; | |||
853 | ||||
854 | connect_settings(); | |||
855 | ||||
856 | if (disabled) | |||
857 | return TRUE(!(0)); | |||
858 | ||||
859 | object = g_value_get_object(¶m_values[0]); | |||
860 | ||||
861 | /* g_message("signal '%s' on object of type '%s' with name '%s'", */ | |||
862 | /* g_signal_name(hint->signal_id), */ | |||
863 | /* G_OBJECT_TYPE_NAME(object), */ | |||
864 | /* ctk_widget_get_name(CTK_WIDGET(object))); */ | |||
865 | ||||
866 | /* if (CTK_IS_WINDOW(object)) */ | |||
867 | /* g_message("window role='%s' title='%s' type='%u'", */ | |||
868 | /* ctk_window_get_role(CTK_WINDOW(object)), */ | |||
869 | /* ctk_window_get_title(CTK_WINDOW(object)), */ | |||
870 | /* ctk_window_get_type_hint(CTK_WINDOW(object))); */ | |||
871 | ||||
872 | /* Filter a few very often occuring signals as quickly as possible */ | |||
873 | if ((hint->signal_id == signal_id_widget_hide || | |||
874 | hint->signal_id == signal_id_widget_show || | |||
875 | hint->signal_id == signal_id_widget_window_state_event) && | |||
876 | !CTK_IS_WINDOW(object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (object)); GType __t = ((ctk_window_get_type ())); gboolean __r ; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; }))))) | |||
877 | return TRUE(!(0)); | |||
878 | ||||
879 | if (hint->signal_id != signal_id_widget_hide && | |||
880 | hint->signal_id != signal_id_dialog_response && | |||
881 | !ctk_widget_is_drawable(CTK_WIDGET (object)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((ctk_widget_get_type ())))))))) | |||
882 | return TRUE(!(0)); | |||
883 | ||||
884 | d = g_slice_new0(SoundEventData)((SoundEventData*) g_slice_alloc0 (sizeof (SoundEventData))); | |||
885 | ||||
886 | d->object = g_object_ref(object)((__typeof__ (object)) (g_object_ref) (object)); | |||
887 | ||||
888 | d->signal_id = hint->signal_id; | |||
889 | ||||
890 | if (d->signal_id == signal_id_widget_window_state_event) { | |||
891 | d->event = cdk_event_copy(g_value_peek_pointer(¶m_values[1])); | |||
892 | } else if ((e = ctk_get_current_event())) | |||
893 | d->event = cdk_event_copy(e); | |||
894 | ||||
895 | if (n_param_values > 1) { | |||
896 | g_value_init(&d->arg1, G_VALUE_TYPE(¶m_values[1])(((GValue*) (¶m_values[1]))->g_type)); | |||
897 | g_value_copy(¶m_values[1], &d->arg1); | |||
898 | d->arg1_is_set = TRUE(!(0)); | |||
899 | } | |||
900 | ||||
901 | g_queue_push_tail(&sound_event_queue, d); | |||
902 | ||||
903 | if (idle_id == 0) | |||
904 | idle_id = cdk_threads_add_idle_full(CDK_PRIORITY_REDRAW(100 + 20)-1, (GSourceFunc) idle_cb, NULL((void*)0), NULL((void*)0)); | |||
905 | ||||
906 | return TRUE(!(0)); | |||
907 | } | |||
908 | ||||
909 | static void install_hook(GType type, const char *sig, guint *sn) { | |||
910 | GTypeClass *type_class; | |||
911 | ||||
912 | type_class = g_type_class_ref(type); | |||
913 | ||||
914 | *sn = g_signal_lookup(sig, type); | |||
915 | g_signal_add_emission_hook(*sn, 0, emission_hook_cb, NULL((void*)0), NULL((void*)0)); | |||
916 | ||||
917 | g_type_class_unref(type_class); | |||
918 | } | |||
919 | ||||
920 | static void read_enable_input_feedback_sounds(CtkSettings *s) { | |||
921 | gboolean enabled = !disabled; | |||
922 | ||||
923 | if (g_getenv("KANBERRA_FORCE_INPUT_FEEDBACK_SOUNDS")) | |||
924 | disabled = FALSE(0); | |||
925 | else { | |||
926 | g_object_get(G_OBJECT(s)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((s)), (((GType) ((20) << (2)))))))), "ctk-enable-input-feedback-sounds", &enabled, NULL((void*)0)); | |||
927 | disabled = !enabled; | |||
928 | } | |||
929 | } | |||
930 | ||||
931 | static void enable_input_feedback_sounds_changed(CtkSettings *s, GParamSpec *arg1, gpointer userdata) { | |||
932 | read_enable_input_feedback_sounds(s); | |||
933 | } | |||
934 | ||||
935 | static void connect_settings(void) { | |||
936 | CtkSettings *s; | |||
937 | static gboolean connected = FALSE(0); | |||
938 | ||||
939 | if (connected) | |||
940 | return; | |||
941 | ||||
942 | if (!(s = ctk_settings_get_default())) | |||
943 | return; | |||
944 | ||||
945 | if (g_object_class_find_property(G_OBJECT_GET_CLASS(s)((((GObjectClass*) (((GTypeInstance*) ((s)))->g_class)))), "ctk-enable-input-feedback-sounds")) { | |||
946 | g_signal_connect(G_OBJECT(s), "notify::ctk-enable-input-feedback-sounds", G_CALLBACK(enable_input_feedback_sounds_changed), NULL)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((s)), (((GType) ((20) << (2)))))))) ), ("notify::ctk-enable-input-feedback-sounds"), (((GCallback ) (enable_input_feedback_sounds_changed))), (((void*)0)), ((void *)0), (GConnectFlags) 0); | |||
947 | read_enable_input_feedback_sounds(s); | |||
948 | } else | |||
949 | g_debug("This Ctk+ version doesn't have the CtkSettings::ctk-enable-input-feedback-sounds property."); | |||
950 | ||||
951 | connected = TRUE(!(0)); | |||
952 | } | |||
953 | ||||
954 | #if CTK_CHECK_VERSION(3,0,0)((3) > (3) || ((3) == (3) && (25) > (0)) || ((3 ) == (3) && (25) == (0) && (5) >= (0))) | |||
955 | #warning "We really need a quit handler in Ctk 3.0, https://bugzilla.gnome.org/show_bug.cgi?id=639770" | |||
956 | #else | |||
957 | static gboolean quit_handler(gpointer data) { | |||
958 | dispatch_queue(); | |||
959 | return FALSE(0); | |||
960 | } | |||
961 | #endif | |||
962 | ||||
963 | G_MODULE_EXPORT__attribute__((visibility("default"))) void ctk_module_init(gint *argc, gchar ***argv[]) { | |||
964 | ||||
965 | /* This is the same quark libgnomeui uses! */ | |||
966 | disable_sound_quark = g_quark_from_string("gnome_disable_sound_events"); | |||
967 | was_iconized_quark = g_quark_from_string("kanberra_was_iconized"); | |||
968 | is_xembed_quark = g_quark_from_string("kanberra_is_xembed"); | |||
969 | ||||
970 | /* Hook up the ctk setting */ | |||
971 | connect_settings(); | |||
972 | ||||
973 | install_hook(CTK_TYPE_WINDOW(ctk_window_get_type ()), "show", &signal_id_widget_show); | |||
974 | install_hook(CTK_TYPE_WINDOW(ctk_window_get_type ()), "hide", &signal_id_widget_hide); | |||
975 | install_hook(CTK_TYPE_DIALOG(ctk_dialog_get_type ()), "response", &signal_id_dialog_response); | |||
976 | install_hook(CTK_TYPE_MENU_ITEM(ctk_menu_item_get_type ()), "activate", &signal_id_menu_item_activate); | |||
977 | install_hook(CTK_TYPE_CHECK_MENU_ITEM(ctk_check_menu_item_get_type ()), "toggled", &signal_id_check_menu_item_toggled); | |||
978 | install_hook(CTK_TYPE_TOGGLE_BUTTON(ctk_toggle_button_get_type ()), "toggled", &signal_id_toggle_button_toggled); | |||
979 | install_hook(CTK_TYPE_BUTTON(ctk_button_get_type ()), "pressed", &signal_id_button_pressed); | |||
980 | install_hook(CTK_TYPE_BUTTON(ctk_button_get_type ()), "released", &signal_id_button_released); | |||
981 | install_hook(CTK_TYPE_WIDGET(ctk_widget_get_type ()), "window-state-event", &signal_id_widget_window_state_event); | |||
982 | install_hook(CTK_TYPE_NOTEBOOK(ctk_notebook_get_type ()), "switch-page", &signal_id_notebook_switch_page); | |||
983 | install_hook(CTK_TYPE_TREE_VIEW(ctk_tree_view_get_type ()), "cursor-changed", &signal_id_tree_view_cursor_changed); | |||
984 | install_hook(CTK_TYPE_ICON_VIEW(ctk_icon_view_get_type ()), "selection-changed", &signal_id_icon_view_selection_changed); | |||
985 | install_hook(CTK_TYPE_WIDGET(ctk_widget_get_type ()), "drag-begin", &signal_id_widget_drag_begin); | |||
986 | install_hook(CTK_TYPE_WIDGET(ctk_widget_get_type ()), "drag-drop", &signal_id_widget_drag_drop); | |||
987 | install_hook(CTK_TYPE_WIDGET(ctk_widget_get_type ()), "drag-failed", &signal_id_widget_drag_failed); | |||
988 | install_hook(CTK_TYPE_EXPANDER(ctk_expander_get_type ()), "activate", &signal_id_expander_activate); | |||
989 | ||||
990 | #if !CTK_CHECK_VERSION(3,0,0)((3) > (3) || ((3) == (3) && (25) > (0)) || ((3 ) == (3) && (25) == (0) && (5) >= (0))) | |||
991 | ctk_quit_add(1, quit_handler, NULL((void*)0)); | |||
992 | #endif | |||
993 | } | |||
994 | ||||
995 | G_MODULE_EXPORT__attribute__((visibility("default"))) gchar* g_module_check_init(GModule *module); | |||
996 | ||||
997 | G_MODULE_EXPORT__attribute__((visibility("default"))) gchar* g_module_check_init(GModule *module) { | |||
998 | g_module_make_resident(module); | |||
999 | return NULL((void*)0); | |||
1000 | } |