0.8.8claws26
[claws.git] / src / common / hooks.c
index e9d754481b17564be5b24e20a413a592b5d88f57..965137c5d155d1e7808e582eef86af7f055e4469 100644 (file)
@@ -72,25 +72,52 @@ gint hooks_register_hook(gchar *hooklist_name,
 void hooks_unregister_hook(gchar *hooklist_name,
                           guint hook_id)
 {
+       GHookList *hooklist;
+       GHook *hook;
+
+       g_return_if_fail(hooklist_name != NULL);
+
+       hooklist = hooks_get_hooklist(hooklist_name);
+       g_return_if_fail(hooklist != NULL);
+
+       hook = g_hook_get(hooklist, hook_id);
+       g_return_if_fail(hook != NULL);
+
+       g_hook_destroy_link(hooklist, hook);
 }
 
-static void hooks_marshal(GHook *hook, gpointer source)
+struct MarshalData
+{
+       gpointer        source;
+       gboolean        abort;
+};
+
+static void hooks_marshal(GHook *hook, gpointer data)
 {
        gboolean (*func) (gpointer source, gpointer data);
-       
-       func = hook->func;
-       func(source, hook->data);
+       struct MarshalData *marshal_data = (struct MarshalData *)data;
+
+       if (!marshal_data->abort) {
+               func = hook->func;
+               marshal_data->abort = func(marshal_data->source, hook->data);
+       }
 }
 
-void hooks_invoke(gchar *hooklist_name,
+gboolean hooks_invoke(gchar *hooklist_name,
                  gpointer source)
 {
        GHookList *hooklist;
+       struct MarshalData marshal_data;
        
-       g_return_if_fail(hooklist_name != NULL);
+       g_return_val_if_fail(hooklist_name != NULL, FALSE);
 
        hooklist = hooks_get_hooklist(hooklist_name);
-       g_return_if_fail(hooklist != NULL);
+       g_return_val_if_fail(hooklist != NULL, FALSE);
+
+       marshal_data.source = source;
+       marshal_data.abort = FALSE;
+
+       g_hook_list_marshal(hooklist, TRUE, hooks_marshal, &marshal_data);
 
-       g_hook_list_marshal(hooklist, TRUE, hooks_marshal, source);
+       return marshal_data.abort;
 }