| 139 if(action->callback) { |
140 if(action->callback) { |
| 140 action->callback(event, action->userdata); |
141 action->callback(event, action->userdata); |
| 141 } |
142 } |
| 142 } |
143 } |
| 143 } |
144 } |
| |
145 |
| |
146 void ui_call_action(UiContext *ctx, const char *action_name) { |
| |
147 ui_call_action2(ctx, action_name, NULL, 0); |
| |
148 } |
| |
149 |
| |
150 void ui_call_action2(UiContext *ctx, const char *action_name, void *eventdata, int intval) { |
| |
151 UiAction *action = uic_resolve_action(ctx, action_name); |
| |
152 if(action && action->callback) { |
| |
153 UiEvent event; |
| |
154 memset(&event, 0, sizeof(UiEvent)); |
| |
155 event.obj = ctx->obj; |
| |
156 event.window = event.obj ? event.obj->window : NULL; |
| |
157 event.document = ctx->self_doc ? ctx->self_doc : ctx->document; |
| |
158 if(eventdata) { |
| |
159 event.eventdata = eventdata; |
| |
160 event.eventdatatype = UI_EVENT_DATA_POINTER; |
| |
161 } |
| |
162 event.intval = intval; |
| |
163 action->callback(&event, action->userdata); |
| |
164 } |
| |
165 } |
| |
166 |
| |
167 void ui_broadcast_action(const char *action_name) { |
| |
168 ui_broadcast_action2(action_name, NULL, 0); |
| |
169 } |
| |
170 |
| |
171 void ui_broadcast_action2(const char *action_name, void *eventdata, int intval) { |
| |
172 CxList *objects = uic_object_list(); |
| |
173 CxIterator i = cxListIterator(objects); |
| |
174 cx_foreach(UiObject*, obj, i) { |
| |
175 ui_call_action2(obj->ctx, action_name, eventdata, intval); |
| |
176 } |
| |
177 } |
| |
178 |
| |
179 typedef struct UiActionBroadcast { |
| |
180 char *action; |
| |
181 void *eventdata; |
| |
182 int intval; |
| |
183 } UiActionBroadcast; |
| |
184 |
| |
185 void ui_mainthread_broadcast(const char *action_name) { |
| |
186 ui_mainthread_broadcast2(action_name, NULL, 0); |
| |
187 } |
| |
188 |
| |
189 static int mainthread_action_broadcast(void *data) { |
| |
190 UiActionBroadcast *broadcast = data; |
| |
191 ui_broadcast_action2(broadcast->action, broadcast->eventdata, broadcast->intval); |
| |
192 free(broadcast->action); |
| |
193 free(broadcast); |
| |
194 return 0; |
| |
195 } |
| |
196 |
| |
197 void ui_mainthread_broadcast2(const char *action_name, void *eventdata, int intval) { |
| |
198 UiActionBroadcast *broadcast = malloc(sizeof(UiActionBroadcast)); |
| |
199 broadcast->action = strdup(action_name); |
| |
200 broadcast->eventdata = eventdata; |
| |
201 broadcast->intval = intval; |
| |
202 ui_call_mainthread(mainthread_action_broadcast, broadcast); |
| |
203 } |