| 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 static void call_action_recursive(const char *action_name, UiContext *ctx, void *eventdata, UiEventType eventdatatype, int intval) { |
183 static void call_action_recursive(const char *action_name, UiContext *ctx, void *eventdata, UiEventType eventdatatype, int intval, UiBool call_children) { |
| 184 UiEvent event; |
184 UiEvent event; |
| 185 memset(&event, 0, sizeof(UiEvent)); |
185 memset(&event, 0, sizeof(UiEvent)); |
| 186 event.obj = ctx->obj; |
186 event.obj = ctx->obj; |
| 187 event.window = event.obj ? event.obj->window : NULL; |
187 event.window = event.obj ? event.obj->window : NULL; |
| 188 event.document = ctx->self_doc ? ctx->self_doc : ctx->document; |
188 event.document = ctx->self_doc ? ctx->self_doc : ctx->document; |
| 198 } |
198 } |
| 199 if(a && a->callback) { |
199 if(a && a->callback) { |
| 200 a->callback(&event, a->userdata); |
200 a->callback(&event, a->userdata); |
| 201 } |
201 } |
| 202 |
202 |
| 203 CxIterator i = cxListIterator(ctx->documents); |
203 if(call_children) { |
| 204 cx_foreach(void *, doc, i) { |
204 CxIterator i = cxListIterator(ctx->documents); |
| 205 UiContext *doc_ctx = ui_document_context(doc); |
205 cx_foreach(void *, doc, i) { |
| 206 call_action_recursive(action_name, doc_ctx, eventdata, eventdatatype, intval); |
206 UiContext *doc_ctx = ui_document_context(doc); |
| |
207 call_action_recursive(action_name, doc_ctx, eventdata, eventdatatype, intval, TRUE); |
| |
208 } |
| 207 } |
209 } |
| 208 } |
210 } |
| 209 |
211 |
| 210 static void broadcast_action(const char *action_name, void *eventdata, UiEventType eventdatatype, int intval) { |
212 static void broadcast_action(const char *action_name, void *eventdata, UiEventType eventdatatype, int intval) { |
| 211 CxList *objects = uic_object_list(); |
213 CxList *objects = uic_object_list(); |
| 212 CxIterator i = cxListIterator(objects); |
214 CxIterator i = cxListIterator(objects); |
| 213 cx_foreach(UiObject*, obj, i) { |
215 cx_foreach(UiObject*, obj, i) { |
| 214 call_action_recursive(action_name, obj->ctx, eventdata, eventdatatype, intval); |
216 call_action_recursive(action_name, obj->ctx, eventdata, eventdatatype, intval, TRUE); |
| 215 } |
217 } |
| |
218 |
| |
219 call_action_recursive(action_name, ui_global_context(), eventdata, eventdatatype, intval, FALSE); |
| 216 } |
220 } |
| 217 |
221 |
| 218 void ui_broadcast_action(const char *action_name) { |
222 void ui_broadcast_action(const char *action_name) { |
| 219 broadcast_action(action_name, NULL, UI_EVENT_DATA_NULL, 0); |
223 broadcast_action(action_name, NULL, UI_EVENT_DATA_NULL, 0); |
| 220 } |
224 } |