ui/common/action.c

changeset 1184
2436f03c8aca
parent 1183
51c0e1053592
equal deleted inserted replaced
1183:51c0e1053592 1184:2436f03c8aca
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 }

mercurial