void gnc_hook_add_dangler (const gchar *name, GFunc callback, gpointer cb_arg) { GncHook *gnc_hook; GHook *hook; ENTER("list %s, function %p, cbarg %p", name, callback, cb_arg); gnc_hook = gnc_hook_lookup(name); g_return_if_fail(gnc_hook != NULL); hook = g_hook_alloc(gnc_hook->c_danglers); hook->func = callback; hook->data = cb_arg; hook->destroy = NULL; g_hook_append(gnc_hook->c_danglers, hook); LEAVE(""); }
void gnc_hook_run (const gchar *name, gpointer data) { GncHook *hook; ENTER("list %s, data %p", (name == NULL ? "(null)" : name), data); hook = gnc_hook_lookup(name); if (!hook) { LEAVE("No such hook list"); return; } g_hook_list_marshal(hook->c_danglers, TRUE, call_c_hook, data); // if (hook->num_args == 0) // g_hook_list_marshal(hook->scm_danglers, TRUE, call_scm_hook, data); // else // g_hook_list_marshal(hook->scm_danglers, TRUE, call_scm_hook_1, data); LEAVE(""); }
void gnc_hook_add_scm_dangler (const gchar *name, SCM proc) { GncHook *gnc_hook; GHook *hook; GncScmDangler *scm; ENTER("list %s, proc ???", name); gnc_hook = gnc_hook_lookup(name); g_return_if_fail(gnc_hook != NULL); scm = g_new0(GncScmDangler, 1); scm_gc_protect_object(proc); scm->proc = proc; hook = g_hook_alloc(gnc_hook->scm_danglers); hook->func = call_scm_hook; hook->data = scm; hook->destroy = delete_scm_hook; g_hook_append(gnc_hook->scm_danglers, hook); LEAVE(""); }
void gnc_hook_remove_dangler (const gchar *name, GFunc callback) { GncHook *gnc_hook; GHook *hook; ENTER("name %s, function %p", name, callback); gnc_hook = gnc_hook_lookup(name); if (gnc_hook == NULL) { LEAVE("Unknown hook list %s", name); return; } hook = g_hook_find(gnc_hook->c_danglers, TRUE, hook_remove_runner, callback); if (hook == NULL) { LEAVE("Hook %p not found in %s", callback, name); return; } g_hook_destroy_link(gnc_hook->c_danglers, hook); LEAVE("Removed %p from %s", hook, name); }