ui/common/action.c

changeset 1127
d3a8c29ebdaa
parent 1092
0accf125a65f
equal deleted inserted replaced
1126:bd1fe6134c1a 1127:d3a8c29ebdaa
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29 #include "action.h" 29 #include "action.h"
30 #include "context.h" 30 #include "context.h"
31 #include "object.h"
31 32
32 #include <cx/string.h> 33 #include <cx/string.h>
33 34
34 void uic_add_action( 35 void uic_add_action(
35 UiContext *ctx, 36 UiContext *ctx,
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 }

mercurial