williamr@2: /* GLIB - Library of useful routines for C programming williamr@2: * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald williamr@2: * Portions copyright (c) 2006 Nokia Corporation. All rights reserved. williamr@2: * williamr@2: * This library is free software; you can redistribute it and/or williamr@2: * modify it under the terms of the GNU Lesser General Public williamr@2: * License as published by the Free Software Foundation; either williamr@2: * version 2 of the License, or (at your option) any later version. williamr@2: * williamr@2: * This library is distributed in the hope that it will be useful, williamr@2: * but WITHOUT ANY WARRANTY; without even the implied warranty of williamr@2: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU williamr@2: * Lesser General Public License for more details. williamr@2: * williamr@2: * You should have received a copy of the GNU Lesser General Public williamr@2: * License along with this library; if not, write to the williamr@2: * Free Software Foundation, Inc., 59 Temple Place - Suite 330, williamr@2: * Boston, MA 02111-1307, USA. williamr@2: */ williamr@2: williamr@2: /* williamr@2: * Modified by the GLib Team and others 1997-2000. See the AUTHORS williamr@2: * file for a list of people on the GLib Team. See the ChangeLog williamr@2: * files for a list of changes. These files are distributed with williamr@2: * GLib at ftp://ftp.gtk.org/pub/gtk/. williamr@2: */ williamr@2: williamr@2: #ifndef __G_HOOK_H__ williamr@2: #define __G_HOOK_H__ williamr@2: williamr@2: #include <_ansi.h> williamr@2: #include williamr@2: williamr@2: G_BEGIN_DECLS williamr@2: williamr@2: williamr@2: /* --- typedefs --- */ williamr@2: typedef struct _GHook GHook; williamr@2: typedef struct _GHookList GHookList; williamr@2: williamr@2: typedef gint (*GHookCompareFunc) (GHook *new_hook, williamr@2: GHook *sibling); williamr@2: typedef gboolean (*GHookFindFunc) (GHook *hook, williamr@2: gpointer data); williamr@2: typedef void (*GHookMarshaller) (GHook *hook, williamr@2: gpointer marshal_data); williamr@2: typedef gboolean (*GHookCheckMarshaller) (GHook *hook, williamr@2: gpointer marshal_data); williamr@2: typedef void (*GHookFunc) (gpointer data); williamr@2: typedef gboolean (*GHookCheckFunc) (gpointer data); williamr@2: typedef void (*GHookFinalizeFunc) (GHookList *hook_list, williamr@2: GHook *hook); williamr@2: typedef enum williamr@2: { williamr@2: G_HOOK_FLAG_ACTIVE = 1 << 0, williamr@2: G_HOOK_FLAG_IN_CALL = 1 << 1, williamr@2: G_HOOK_FLAG_MASK = 0x0f williamr@2: } GHookFlagMask; williamr@2: #define G_HOOK_FLAG_USER_SHIFT (4) williamr@2: williamr@2: williamr@2: /* --- structures --- */ williamr@2: struct _GHookList williamr@2: { williamr@2: gulong seq_id; williamr@2: guint hook_size : 16; williamr@2: guint is_setup : 1; williamr@2: GHook *hooks; williamr@2: gpointer dummy3; williamr@2: GHookFinalizeFunc finalize_hook; williamr@2: gpointer dummy[2]; williamr@2: }; williamr@2: struct _GHook williamr@2: { williamr@2: gpointer data; williamr@2: GHook *next; williamr@2: GHook *prev; williamr@2: guint ref_count; williamr@2: gulong hook_id; williamr@2: guint flags; williamr@2: gpointer func; williamr@2: GDestroyNotify destroy; williamr@2: }; williamr@2: williamr@2: williamr@2: /* --- macros --- */ williamr@2: #define G_HOOK(hook) ((GHook*) (hook)) williamr@2: #define G_HOOK_FLAGS(hook) (G_HOOK (hook)->flags) williamr@2: #define G_HOOK_ACTIVE(hook) ((G_HOOK_FLAGS (hook) & \ williamr@2: G_HOOK_FLAG_ACTIVE) != 0) williamr@2: #define G_HOOK_IN_CALL(hook) ((G_HOOK_FLAGS (hook) & \ williamr@2: G_HOOK_FLAG_IN_CALL) != 0) williamr@2: #define G_HOOK_IS_VALID(hook) (G_HOOK (hook)->hook_id != 0 && \ williamr@2: (G_HOOK_FLAGS (hook) & \ williamr@2: G_HOOK_FLAG_ACTIVE)) williamr@2: #define G_HOOK_IS_UNLINKED(hook) (G_HOOK (hook)->next == NULL && \ williamr@2: G_HOOK (hook)->prev == NULL && \ williamr@2: G_HOOK (hook)->hook_id == 0 && \ williamr@2: G_HOOK (hook)->ref_count == 0) williamr@2: williamr@2: williamr@2: /* --- prototypes --- */ williamr@2: /* callback maintenance functions */ williamr@2: IMPORT_C void g_hook_list_init (GHookList *hook_list, williamr@2: guint hook_size); williamr@2: IMPORT_C void g_hook_list_clear (GHookList *hook_list); williamr@2: IMPORT_C GHook* g_hook_alloc (GHookList *hook_list); williamr@2: IMPORT_C void g_hook_free (GHookList *hook_list, williamr@2: GHook *hook); williamr@2: IMPORT_C GHook * g_hook_ref (GHookList *hook_list, williamr@2: GHook *hook); williamr@2: IMPORT_C void g_hook_unref (GHookList *hook_list, williamr@2: GHook *hook); williamr@2: IMPORT_C gboolean g_hook_destroy (GHookList *hook_list, williamr@2: gulong hook_id); williamr@2: IMPORT_C void g_hook_destroy_link (GHookList *hook_list, williamr@2: GHook *hook); williamr@2: IMPORT_C void g_hook_prepend (GHookList *hook_list, williamr@2: GHook *hook); williamr@2: IMPORT_C void g_hook_insert_before (GHookList *hook_list, williamr@2: GHook *sibling, williamr@2: GHook *hook); williamr@2: IMPORT_C void g_hook_insert_sorted (GHookList *hook_list, williamr@2: GHook *hook, williamr@2: GHookCompareFunc func); williamr@2: IMPORT_C GHook* g_hook_get (GHookList *hook_list, williamr@2: gulong hook_id); williamr@2: IMPORT_C GHook* g_hook_find (GHookList *hook_list, williamr@2: gboolean need_valids, williamr@2: GHookFindFunc func, williamr@2: gpointer data); williamr@2: IMPORT_C GHook* g_hook_find_data (GHookList *hook_list, williamr@2: gboolean need_valids, williamr@2: gpointer data); williamr@2: IMPORT_C GHook* g_hook_find_func (GHookList *hook_list, williamr@2: gboolean need_valids, williamr@2: gpointer func); williamr@2: IMPORT_C GHook* g_hook_find_func_data (GHookList *hook_list, williamr@2: gboolean need_valids, williamr@2: gpointer func, williamr@2: gpointer data); williamr@2: /* return the first valid hook, and increment its reference count */ williamr@2: IMPORT_C GHook* g_hook_first_valid (GHookList *hook_list, williamr@2: gboolean may_be_in_call); williamr@2: /* return the next valid hook with incremented reference count, and williamr@2: * decrement the reference count of the original hook williamr@2: */ williamr@2: IMPORT_C GHook* g_hook_next_valid (GHookList *hook_list, williamr@2: GHook *hook, williamr@2: gboolean may_be_in_call); williamr@2: /* GHookCompareFunc implementation to insert hooks sorted by their id */ williamr@2: IMPORT_C gint g_hook_compare_ids (GHook *new_hook, williamr@2: GHook *sibling); williamr@2: /* convenience macros */ williamr@2: #define g_hook_append( hook_list, hook ) \ williamr@2: g_hook_insert_before ((hook_list), NULL, (hook)) williamr@2: /* invoke all valid hooks with the (*GHookFunc) signature. williamr@2: */ williamr@2: IMPORT_C void g_hook_list_invoke (GHookList *hook_list, williamr@2: gboolean may_recurse); williamr@2: /* invoke all valid hooks with the (*GHookCheckFunc) signature, williamr@2: * and destroy the hook if FALSE is returned. williamr@2: */ williamr@2: IMPORT_C void g_hook_list_invoke_check (GHookList *hook_list, williamr@2: gboolean may_recurse); williamr@2: /* invoke a marshaller on all valid hooks. williamr@2: */ williamr@2: IMPORT_C void g_hook_list_marshal (GHookList *hook_list, williamr@2: gboolean may_recurse, williamr@2: GHookMarshaller marshaller, williamr@2: gpointer marshal_data); williamr@2: IMPORT_C void g_hook_list_marshal_check (GHookList *hook_list, williamr@2: gboolean may_recurse, williamr@2: GHookCheckMarshaller marshaller, williamr@2: gpointer marshal_data); williamr@2: williamr@2: G_END_DECLS williamr@2: williamr@2: #endif /* __G_HOOK_H__ */ williamr@2: