1 /* 2 * libInstPatch 3 * Copyright (C) 1999-2014 Element Green <element@elementsofsound.org> 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public License 7 * as published by the Free Software Foundation; version 2.1 8 * of the License only. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18 * 02110-1301, USA or on the web at http://www.gnu.org. 19 */ 20 #ifndef __IPATCH_CONTAINER_H__ 21 #define __IPATCH_CONTAINER_H__ 22 23 #include <stdarg.h> 24 #include <glib.h> 25 #include <glib-object.h> 26 27 /* forward type declarations */ 28 29 typedef struct _IpatchContainer IpatchContainer; 30 typedef struct _IpatchContainerClass IpatchContainerClass; 31 32 #include <libinstpatch/IpatchItem.h> 33 #include <libinstpatch/IpatchIter.h> 34 #include <libinstpatch/IpatchList.h> 35 36 #define IPATCH_TYPE_CONTAINER (ipatch_container_get_type ()) 37 #define IPATCH_CONTAINER(obj) \ 38 (G_TYPE_CHECK_INSTANCE_CAST ((obj), IPATCH_TYPE_CONTAINER, IpatchContainer)) 39 #define IPATCH_CONTAINER_CLASS(klass) \ 40 (G_TYPE_CHECK_CLASS_CAST ((klass), IPATCH_TYPE_CONTAINER, \ 41 IpatchContainerClass)) 42 #define IPATCH_IS_CONTAINER(obj) \ 43 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IPATCH_TYPE_CONTAINER)) 44 #define IPATCH_IS_CONTAINER_CLASS(klass) \ 45 (G_TYPE_CHECK_CLASS_TYPE ((klass), IPATCH_TYPE_CONTAINER)) 46 #define IPATCH_CONTAINER_GET_CLASS(obj) \ 47 (G_TYPE_INSTANCE_GET_CLASS ((obj), IPATCH_TYPE_CONTAINER, \ 48 IpatchContainerClass)) 49 50 /** 51 * IpatchContainerCallback: 52 * @container: Container item 53 * @item: Item that was added/removed to/from @container 54 * @user_data: User defined pointer assigned when callback connected 55 * 56 * A function prototype callback which is called for container adds or removes 57 * (after adds, before removes). 58 */ 59 typedef void (*IpatchContainerCallback)(IpatchContainer *container, 60 IpatchItem *item, 61 gpointer user_data); 62 /** 63 * IpatchContainerDisconnect: 64 * @container: Container item 65 * @child: Match child item of original connect 66 * (ipatch_container_remove_connect() only, always NULL for 67 * ipatch_container_add_connect()). 68 * @user_data: User defined pointer assigned when callback connected 69 * 70 * A function prototype which is called when a callback gets disconnected. 71 */ 72 typedef void (*IpatchContainerDisconnect)(IpatchContainer *container, 73 IpatchItem *child, 74 gpointer user_data); 75 76 /* Base patch container object */ 77 struct _IpatchContainer 78 { 79 IpatchItem parent_instance; 80 }; 81 82 struct _IpatchContainerClass 83 { 84 IpatchItemClass parent_class; 85 86 /*< public >*/ 87 88 /* methods */ 89 const GType *(*child_types)(void); 90 const GType *(*virtual_types)(void); 91 gboolean(*init_iter)(IpatchContainer *container, IpatchIter *iter, 92 GType type); 93 void (*make_unique)(IpatchContainer *container, IpatchItem *item); 94 gboolean(*get_dups)(IpatchContainer *container, IpatchItem *item, 95 IpatchList **list); 96 }; 97 98 /* container uses no item flags */ 99 /** 100 * IPATCH_CONTAINER_UNUSED_FLAG_SHIFT: (skip) 101 */ 102 #define IPATCH_CONTAINER_UNUSED_FLAG_SHIFT IPATCH_ITEM_UNUSED_FLAG_SHIFT 103 104 /** 105 * IPATCH_CONTAINER_ERRMSG_INVALID_CHILD_2: (skip) 106 */ 107 #define IPATCH_CONTAINER_ERRMSG_INVALID_CHILD_2 \ 108 "Invalid child type '%s' for parent type '%s'" 109 110 GType ipatch_container_get_type(void); 111 112 IpatchList *ipatch_container_get_children(IpatchContainer *container, 113 GType type); 114 GList *ipatch_container_get_children_list(IpatchContainer *container); 115 116 GList *ipatch_container_get_children_by_type(IpatchContainer *container, 117 GType type); 118 const GType *ipatch_container_get_child_types(IpatchContainer *container); 119 const GType *ipatch_container_get_virtual_types(IpatchContainer *container); 120 const GType *ipatch_container_type_get_child_types(GType container_type); 121 void ipatch_container_insert(IpatchContainer *container, 122 IpatchItem *item, int pos); 123 void ipatch_container_append(IpatchContainer *container, IpatchItem *item); 124 void ipatch_container_add(IpatchContainer *container, IpatchItem *item); 125 void ipatch_container_prepend(IpatchContainer *container, IpatchItem *item); 126 void ipatch_container_remove(IpatchContainer *container, IpatchItem *item); 127 void ipatch_container_remove_all(IpatchContainer *container); 128 guint ipatch_container_count(IpatchContainer *container, GType type); 129 void ipatch_container_make_unique(IpatchContainer *container, 130 IpatchItem *item); 131 void ipatch_container_add_unique(IpatchContainer *container, 132 IpatchItem *item); 133 gboolean ipatch_container_init_iter(IpatchContainer *container, 134 IpatchIter *iter, GType type); 135 void ipatch_container_insert_iter(IpatchContainer *container, 136 IpatchItem *item, IpatchIter *iter); 137 void ipatch_container_remove_iter(IpatchContainer *container, 138 IpatchIter *iter); 139 140 /* defined in IpatchContainer_notify.c */ 141 142 void ipatch_container_add_notify(IpatchContainer *container, IpatchItem *child); 143 void ipatch_container_remove_notify(IpatchContainer *container, IpatchItem *child); 144 guint ipatch_container_add_connect(IpatchContainer *container, 145 IpatchContainerCallback callback, 146 IpatchContainerDisconnect disconnect, 147 gpointer user_data); 148 guint 149 ipatch_container_add_connect_notify(IpatchContainer *container, 150 IpatchContainerCallback callback, 151 GDestroyNotify notify_func, 152 gpointer user_data); 153 guint ipatch_container_remove_connect(IpatchContainer *container, 154 IpatchItem *child, 155 IpatchContainerCallback callback, 156 IpatchContainerDisconnect disconnect, 157 gpointer user_data); 158 guint 159 ipatch_container_remove_connect_notify(IpatchContainer *container, 160 IpatchItem *child, 161 IpatchContainerCallback callback, 162 GDestroyNotify notify_func, 163 gpointer user_data); 164 void ipatch_container_add_disconnect(guint handler_id); 165 void ipatch_container_add_disconnect_matched(IpatchContainer *container, 166 IpatchContainerCallback callback, 167 gpointer user_data); 168 void ipatch_container_remove_disconnect(guint handler_id); 169 void ipatch_container_remove_disconnect_matched(IpatchContainer *container, 170 IpatchItem *child, 171 IpatchContainerCallback callback, 172 gpointer user_data); 173 #endif 174