diff options
author | Lennart Poettering <lennart@poettering.net> | 2008-06-06 12:17:58 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2008-06-06 12:17:58 +0000 |
commit | 617c912e950d582c5690e558b28fa1070f9b8263 (patch) | |
tree | e0c2ef90b6fcd291f3466a2c703d07b208981d06 /src/canberra-gtk-module.c | |
parent | 0cc6ddf46d77f0f8c657588b8373e1e87512d578 (diff) |
unify double inclusion defines src/sound-theme-spec.h src/read-wav.h src/read-vorbis.h src/proplist.h src/mutex.h src/llist.h src/common.h
git-svn-id: file:///home/lennart/svn/public/libcanberra/trunk@52 01b60673-d06a-42c0-afdd-89cb8e0f78ac
Diffstat (limited to 'src/canberra-gtk-module.c')
-rw-r--r-- | src/canberra-gtk-module.c | 101 |
1 files changed, 71 insertions, 30 deletions
diff --git a/src/canberra-gtk-module.c b/src/canberra-gtk-module.c index 693e33b..2efe957 100644 --- a/src/canberra-gtk-module.c +++ b/src/canberra-gtk-module.c @@ -36,6 +36,10 @@ typedef struct { GdkEvent *event; } SoundEventData; +static GQueue sound_event_queue = G_QUEUE_INIT; + +static int idle_id = 0; + static guint signal_id_dialog_response, signal_id_widget_show, @@ -116,7 +120,7 @@ static GtkDialog* find_parent_dialog(GtkWidget *w) { return NULL; } -static void destroy_cb(SoundEventData *d) { +static void free_sound_event(SoundEventData *d) { g_object_unref(d->object); @@ -126,24 +130,28 @@ static void destroy_cb(SoundEventData *d) { if (d->event) gdk_event_free(d->event); - g_slice_free(d, sizeof(SoundEventData)); + g_slice_free(SoundEventData, d); } -static gboolean idle_cb(SoundEventData *d) { - int ret = CA_SUCCESS; +static void filter_sound_events(SoundEventData *d) { - idle_id = 0; + + +} + +static void dispatch_sound_event(SoundEventData *d) { + int ret = CA_SUCCESS; if (!GTK_WIDGET_DRAWABLE(d->object)) - return FALSE; + return; if (g_object_get_qdata(d->object, disable_sound_quark)) - return FALSE; + return; if (d->signal_id == signal_id_widget_show) { gboolean played_sound = FALSE; - /* Show signals for non-dialogs have already been filtered out + /* Show signals for non-windows have already been filtered out * by the emission hook! */ if (GTK_IS_MESSAGE_DIALOG(d->object)) { @@ -161,10 +169,46 @@ static gboolean idle_cb(SoundEventData *d) { played_sound = TRUE; } - } else { + } else if (GTK_IS_MENU(gtk_bin_get_child(GTK_BIN(d->object)))) { + ret = ca_gtk_play_for_widget(GTK_WIDGET(d->object), 0, + CA_PROP_EVENT_ID, "menu-popup", + CA_PROP_EVENT_DESCRIPTION, "Menu popped up", + CA_PROP_CANBERRA_CACHE_CONTROL, "permanent", + NULL); + played_sound = TRUE; } + if (!played_sound) + ret = ca_gtk_play_for_widget(GTK_WIDGET(d->object), 0, + CA_PROP_EVENT_ID, "window-new", + CA_PROP_EVENT_DESCRIPTION, "Window shown", + CA_PROP_CANBERRA_CACHE_CONTROL, "permanent", + NULL); + } + + if (d->signal_id == signal_id_widget_hide) { + gboolean played_sound = FALSE; + + if (GTK_IS_MENU(gtk_bin_get_child(GTK_BIN(d->object)))) { + + ret = ca_gtk_play_for_widget(GTK_WIDGET(d->object), 0, + CA_PROP_EVENT_ID, "menu-popdown", + CA_PROP_EVENT_DESCRIPTION, "Menu popped up", + CA_PROP_CANBERRA_CACHE_CONTROL, "permanent", + NULL); + + played_sound = TRUE; + } + + if (!played_sound) + ret = ca_gtk_play_for_widget(GTK_WIDGET(d->object), 0, + CA_PROP_EVENT_ID, "window-close", + CA_PROP_EVENT_DESCRIPTION, "Window closed", + CA_PROP_CANBERRA_CACHE_CONTROL, "permanent", + NULL); + } + if (GTK_IS_DIALOG(d->object) && d->signal_id == signal_id_dialog_response) { int response; @@ -182,24 +226,6 @@ static gboolean idle_cb(SoundEventData *d) { } } - if (GTK_IS_WINDOW(d->object) && GTK_IS_MENU(gtk_bin_get_child(GTK_BIN(d->object)))) { - - /* This doesn't work */ - - if (d->signal_id == signal_id_widget_show) - ret = ca_gtk_play_for_widget(GTK_WIDGET(d->object), 0, - CA_PROP_EVENT_ID, "menu-popup", - CA_PROP_EVENT_DESCRIPTION, "Menu popped up", - CA_PROP_CANBERRA_CACHE_CONTROL, "permanent", - NULL); - else if (d->signal_id == signal_id_widget_hide) - ret = ca_gtk_play_for_widget(GTK_WIDGET(d->object), 0, - CA_PROP_EVENT_ID, "menu-popdown", - CA_PROP_EVENT_DESCRIPTION, "Menu popped up", - CA_PROP_CANBERRA_CACHE_CONTROL, "permanent", - NULL); - } - if (GTK_IS_CHECK_MENU_ITEM(d->object) && d->signal_id == signal_id_check_menu_item_toggled) { if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(d))) @@ -270,9 +296,21 @@ static gboolean idle_cb(SoundEventData *d) { if (ret != CA_SUCCESS) g_warning("Failed to play event sound: %s", ca_strerror(ret)); +} + +static gboolean idle_cb(void *userdata) { + SoundEventData *d; + + idle_id = 0; + + while ((d = g_queue_pop_head(&sound_event_queue))) { + filter_sound_events(d); + dispatch_sound_event(d); + free_sound_event(d); + } return FALSE; - } +} static gboolean emission_hook_cb(GSignalInvocationHint *hint, guint n_param_values, const GValue *param_values, gpointer data) { static SoundEventData *d = NULL; @@ -288,7 +326,7 @@ static gboolean emission_hook_cb(GSignalInvocationHint *hint, guint n_param_valu !GTK_IS_WINDOW(object)) return TRUE; - d = g_slice_new0(SoundEventData, 1); + d = g_slice_new0(SoundEventData); d->object = g_object_ref(object); @@ -303,7 +341,10 @@ static gboolean emission_hook_cb(GSignalInvocationHint *hint, guint n_param_valu d->arg1_is_set = TRUE; } - idle_id = g_idle_add_full(GTK_PRIORITY_REDRAW-1, (GSourceFunc) idle_cb, d, (GDestroyNotify) destroy_cb); + g_queue_push_tail(&sound_event_queue, e); + + if (idle_id == 0) + idle_id = g_idle_add_full(GTK_PRIORITY_REDRAW-1, (GSourceFunc) idle_cb, NULL, NULL); return TRUE; } |