ui/common/action.c

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

mercurial