| 178 int ret = call_action(ctx, action_name, obj, UI_EVENT_DATA_TYPED_OBJECT, 0); |
178 int ret = call_action(ctx, action_name, obj, UI_EVENT_DATA_TYPED_OBJECT, 0); |
| 179 free(obj); |
179 free(obj); |
| 180 return ret; |
180 return ret; |
| 181 } |
181 } |
| 182 |
182 |
| 183 void ui_broadcast_action(const char *action_name) { |
183 static void call_action_recursive(const char *action_name, UiContext *ctx, void *eventdata, UiEventType eventdatatype, int intval) { |
| 184 ui_broadcast_action2(action_name, NULL, 0); |
184 UiEvent event; |
| 185 } |
185 memset(&event, 0, sizeof(UiEvent)); |
| 186 |
186 event.obj = ctx->obj; |
| 187 void ui_broadcast_action2(const char *action_name, void *eventdata, int intval) { |
187 event.window = event.obj ? event.obj->window : NULL; |
| |
188 event.document = ctx->self_doc ? ctx->self_doc : ctx->document; |
| |
189 if(eventdata) { |
| |
190 event.eventdata = eventdata; |
| |
191 event.eventdatatype = eventdatatype; |
| |
192 } |
| |
193 event.intval = intval; |
| |
194 |
| |
195 UiAction *a = NULL; |
| |
196 if(ctx->actions) { |
| |
197 a = cxMapGet(ctx->actions, action_name); |
| |
198 } |
| |
199 if(a && a->callback) { |
| |
200 a->callback(&event, a->userdata); |
| |
201 } |
| |
202 |
| |
203 CxIterator i = cxListIterator(ctx->documents); |
| |
204 cx_foreach(void *, doc, i) { |
| |
205 UiContext *doc_ctx = ui_document_context(doc); |
| |
206 call_action_recursive(action_name, doc_ctx, eventdata, eventdatatype, intval); |
| |
207 } |
| |
208 } |
| |
209 |
| |
210 static void broadcast_action(const char *action_name, void *eventdata, UiEventType eventdatatype, int intval) { |
| 188 CxList *objects = uic_object_list(); |
211 CxList *objects = uic_object_list(); |
| 189 CxIterator i = cxListIterator(objects); |
212 CxIterator i = cxListIterator(objects); |
| 190 cx_foreach(UiObject*, obj, i) { |
213 cx_foreach(UiObject*, obj, i) { |
| 191 ui_call_action2(obj->ctx, action_name, eventdata, intval); |
214 call_action_recursive(action_name, obj->ctx, eventdata, eventdatatype, intval); |
| 192 } |
215 } |
| |
216 } |
| |
217 |
| |
218 void ui_broadcast_action(const char *action_name) { |
| |
219 broadcast_action(action_name, NULL, UI_EVENT_DATA_NULL, 0); |
| |
220 } |
| |
221 |
| |
222 void ui_broadcast_action2(const char *action_name, void *eventdata, int intval) { |
| |
223 broadcast_action(action_name, eventdata, UI_EVENT_DATA_POINTER, intval); |
| 193 } |
224 } |
| 194 |
225 |
| 195 typedef struct UiActionBroadcast { |
226 typedef struct UiActionBroadcast { |
| 196 char *action; |
227 char *action; |
| 197 void *eventdata; |
228 void *eventdata; |
| |
229 UiEventType eventdatataype; |
| 198 int intval; |
230 int intval; |
| 199 } UiActionBroadcast; |
231 } UiActionBroadcast; |
| 200 |
232 |
| 201 void ui_mainthread_broadcast(const char *action_name) { |
233 void ui_mainthread_broadcast(const char *action_name) { |
| 202 ui_mainthread_broadcast2(action_name, NULL, 0); |
234 ui_mainthread_broadcast2(action_name, NULL, 0); |
| 203 } |
235 } |
| 204 |
236 |
| 205 static int mainthread_action_broadcast(void *data) { |
237 static int mainthread_action_broadcast(void *data) { |
| 206 UiActionBroadcast *broadcast = data; |
238 UiActionBroadcast *broadcast = data; |
| 207 ui_broadcast_action2(broadcast->action, broadcast->eventdata, broadcast->intval); |
239 broadcast_action(broadcast->action, broadcast->eventdata, broadcast->eventdatataype, broadcast->intval); |
| |
240 if(broadcast->eventdatataype == UI_EVENT_DATA_TYPED_OBJECT) { |
| |
241 free(broadcast->eventdata); |
| |
242 } |
| 208 free(broadcast->action); |
243 free(broadcast->action); |
| 209 free(broadcast); |
244 free(broadcast); |
| 210 return 0; |
245 return 0; |
| 211 } |
246 } |
| 212 |
247 |
| 213 void ui_mainthread_broadcast2(const char *action_name, void *eventdata, int intval) { |
248 void ui_mainthread_broadcast2(const char *action_name, void *eventdata, int intval) { |
| 214 UiActionBroadcast *broadcast = malloc(sizeof(UiActionBroadcast)); |
249 UiActionBroadcast *broadcast = malloc(sizeof(UiActionBroadcast)); |
| 215 broadcast->action = strdup(action_name); |
250 broadcast->action = strdup(action_name); |
| 216 broadcast->eventdata = eventdata; |
251 broadcast->eventdata = eventdata; |
| |
252 broadcast->eventdatataype = UI_EVENT_DATA_POINTER; |
| 217 broadcast->intval = intval; |
253 broadcast->intval = intval; |
| 218 ui_call_mainthread(mainthread_action_broadcast, broadcast); |
254 ui_call_mainthread(mainthread_action_broadcast, broadcast); |
| 219 } |
255 } |
| |
256 |
| |
257 void ui_mainthread_broadcast3(const char *action_name, void *ptr, uint64_t type_id) { |
| |
258 UiTypedObj *obj = malloc(sizeof(UiTypedObj)); |
| |
259 obj->ptr = ptr; |
| |
260 obj->type = type_id; |
| |
261 |
| |
262 UiActionBroadcast *broadcast = malloc(sizeof(UiActionBroadcast)); |
| |
263 broadcast->action = strdup(action_name); |
| |
264 broadcast->eventdata = obj; |
| |
265 broadcast->eventdatataype = UI_EVENT_DATA_TYPED_OBJECT; |
| |
266 broadcast->intval = 0; |
| |
267 ui_call_mainthread(mainthread_action_broadcast, broadcast); |
| |
268 } |