diff options
author | Lennart Poettering <lennart@poettering.net> | 2009-03-23 21:37:17 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2009-03-23 21:37:17 +0100 |
commit | 212bafd6109eb01654065527a8dd55206ecaf535 (patch) | |
tree | 6ffc9a7449c2bb4dd8f9862bb439c358152d265a /src/canberra-gtk.c | |
parent | febbf740799d85dfbdca965efa9867fd70fa2cfc (diff) |
Detect forks
Some really stupid applications (Hey, vim, that means you!)
love to fork after initializing gtk/libcanberra. This is really
bad style. We however have to deal with this cleanly, so we try
to detect the forks making sure all our calls fail cleanly
after the fork.
Diffstat (limited to 'src/canberra-gtk.c')
-rw-r--r-- | src/canberra-gtk.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/canberra-gtk.c b/src/canberra-gtk.c index 70b8d7e..cb36a0f 100644 --- a/src/canberra-gtk.c +++ b/src/canberra-gtk.c @@ -31,6 +31,7 @@ #include "common.h" #include "malloc.h" #include "proplist.h" +#include "fork-detect.h" /** * SECTION:canberra-gtk @@ -93,7 +94,8 @@ ca_context *ca_gtk_context_get(void) { if ((c = g_static_private_get(&context_private))) return c; - ca_assert_se(ca_context_create(&c) == CA_SUCCESS); + if (ca_context_create(&c) != CA_SUCCESS) + return NULL; if ((name = g_get_application_name())) ca_context_change_props(c, CA_PROP_APPLICATION_NAME, name, NULL); @@ -154,6 +156,7 @@ int ca_gtk_proplist_set_for_widget(ca_proplist *p, GtkWidget *widget) { ca_return_val_if_fail(p, CA_ERROR_INVALID); ca_return_val_if_fail(widget, CA_ERROR_INVALID); + ca_return_val_if_fail(!ca_detect_fork(), CA_ERROR_FORKED); if (!(w = get_toplevel(widget))) return CA_ERROR_INVALID; @@ -224,6 +227,7 @@ int ca_gtk_proplist_set_for_event(ca_proplist *p, GdkEvent *e) { ca_return_val_if_fail(p, CA_ERROR_INVALID); ca_return_val_if_fail(e, CA_ERROR_INVALID); + ca_return_val_if_fail(!ca_detect_fork(), CA_ERROR_FORKED); if ((gw = e->any.window)) { gdk_window_get_user_data(gw, (gpointer*) &w); @@ -297,6 +301,7 @@ int ca_gtk_play_for_widget(GtkWidget *w, uint32_t id, ...) { ca_proplist *p; ca_return_val_if_fail(w, CA_ERROR_INVALID); + ca_return_val_if_fail(!ca_detect_fork(), CA_ERROR_FORKED); if ((ret = ca_proplist_create(&p)) < 0) return ret; @@ -346,6 +351,7 @@ int ca_gtk_play_for_event(GdkEvent *e, uint32_t id, ...) { ca_proplist *p; ca_return_val_if_fail(e, CA_ERROR_INVALID); + ca_return_val_if_fail(!ca_detect_fork(), CA_ERROR_FORKED); if ((ret = ca_proplist_create(&p)) < 0) return ret; |