summaryrefslogtreecommitdiffstats
path: root/src/canberra-gtk.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2009-03-23 21:37:17 +0100
committerLennart Poettering <lennart@poettering.net>2009-03-23 21:37:17 +0100
commit212bafd6109eb01654065527a8dd55206ecaf535 (patch)
tree6ffc9a7449c2bb4dd8f9862bb439c358152d265a /src/canberra-gtk.c
parentfebbf740799d85dfbdca965efa9867fd70fa2cfc (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.c8
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;