From cb114f43ab42087537a7036ef7bd411668eb8065 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Wed, 4 Aug 2010 17:59:06 +0100 Subject: [PATCH] cogl: Add an internal utility to maintain a list of callback functions This adds an internal CoglCallbackList type which is just a GSList of of function pointers along with a data pointer to form a closure. There are functions to add and remove items and to invoke the list of functions. This could be used in a number of places in Cogl. --- cogl/Makefile.am | 2 + cogl/cogl-callback-list.c | 107 ++++++++++++++++++++++++++++++++++++++ cogl/cogl-callback-list.h | 58 +++++++++++++++++++++ 3 files changed, 167 insertions(+) create mode 100644 cogl/cogl-callback-list.c create mode 100644 cogl/cogl-callback-list.h diff --git a/cogl/Makefile.am b/cogl/Makefile.am index d0ed8498a..dcf596610 100644 --- a/cogl/Makefile.am +++ b/cogl/Makefile.am @@ -162,6 +162,8 @@ cogl_sources_c = \ $(srcdir)/cogl-bitmask.c \ $(srcdir)/cogl-shader-private.h \ $(srcdir)/cogl-shader.c \ + $(srcdir)/cogl-callback-list.h \ + $(srcdir)/cogl-callback-list.c \ $(NULL) # glib-mkenums rules diff --git a/cogl/cogl-callback-list.c b/cogl/cogl-callback-list.c new file mode 100644 index 000000000..6302c7764 --- /dev/null +++ b/cogl/cogl-callback-list.c @@ -0,0 +1,107 @@ +/* + * Cogl + * + * An object oriented GL/GLES Abstraction/Utility Layer + * + * Copyright (C) 2010 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: + * Neil Roberts + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cogl.h" +#include "cogl-callback-list.h" + +typedef struct _CoglCallbackListClosure +{ + CoglCallbackListFunc func; + void *user_data; +} CoglCallbackListClosure; + +void +_cogl_callback_list_init (CoglCallbackList *list) +{ + list->funcs = NULL; +} + +void +_cogl_callback_list_destroy (CoglCallbackList *list) +{ + while (list->funcs) + { + CoglCallbackListClosure *closure = list->funcs->data; + + _cogl_callback_list_remove (list, closure->func, closure->user_data); + } +} + +void +_cogl_callback_list_add (CoglCallbackList *list, + CoglCallbackListFunc func, + void *user_data) +{ + CoglCallbackListClosure *closure = g_slice_new (CoglCallbackListClosure); + + closure->func = func; + closure->user_data = user_data; + list->funcs = g_slist_prepend (list->funcs, closure); +} + +void +_cogl_callback_list_remove (CoglCallbackList *list, + CoglCallbackListFunc func, + void *user_data) +{ + GSList *prev = NULL, *l; + + for (l = list->funcs; l; l = l->next) + { + CoglCallbackListClosure *closure = l->data; + + if (closure->func == func && closure->user_data == user_data) + { + g_slice_free (CoglCallbackListClosure, closure); + + if (prev) + prev->next = g_slist_delete_link (prev->next, l); + else + list->funcs = g_slist_delete_link (list->funcs, l); + + break; + } + + prev = l; + } +} + +void +_cogl_callback_list_invoke (CoglCallbackList *list) +{ + GSList *l; + + for (l = list->funcs; l; l = l->next) + { + CoglCallbackListClosure *closure = l->data; + + closure->func (closure->user_data); + } +} diff --git a/cogl/cogl-callback-list.h b/cogl/cogl-callback-list.h new file mode 100644 index 000000000..b74003d91 --- /dev/null +++ b/cogl/cogl-callback-list.h @@ -0,0 +1,58 @@ +/* + * Cogl + * + * An object oriented GL/GLES Abstraction/Utility Layer + * + * Copyright (C) 2010 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + */ + +#ifndef __COGL_CALLBACK_LIST_H__ +#define __COGL_CALLBACK_LIST_H__ + +#include + +G_BEGIN_DECLS + +typedef void (* CoglCallbackListFunc) (void *user_data); + +typedef struct _CoglCallbackList +{ + GSList *funcs; +} CoglCallbackList; + +void +_cogl_callback_list_init (CoglCallbackList *list); + +void +_cogl_callback_list_add (CoglCallbackList *list, + CoglCallbackListFunc func, + void *user_data); +void +_cogl_callback_list_remove (CoglCallbackList *list, + CoglCallbackListFunc func, + void *user_data); + +void +_cogl_callback_list_invoke (CoglCallbackList *list); + +void +_cogl_callback_list_destroy (CoglCallbackList *list); + +G_END_DECLS + +#endif /* __COGL_CALLBACK_LIST_H__ */ +