ui/motif/button.c

changeset 1152
f560b35c8ca1
parent 1064
f415387fff6f
equal deleted inserted replaced
1151:337a94a20097 1152:f560b35c8ca1
30 #include <stdlib.h> 30 #include <stdlib.h>
31 31
32 #include "button.h" 32 #include "button.h"
33 #include "container.h" 33 #include "container.h"
34 #include "../common/context.h" 34 #include "../common/context.h"
35 #include "../common/action.h"
35 #include <cx/mempool.h> 36 #include <cx/mempool.h>
36 37
37 #include <cx/linked_list.h> 38 #include <cx/linked_list.h>
38 #include <cx/array_list.h> 39 #include <cx/array_list.h>
39 #include <cx/compare.h> 40 #include <cx/compare.h>
68 UiEventData *eventdata = malloc(sizeof(UiEventData)); 69 UiEventData *eventdata = malloc(sizeof(UiEventData));
69 eventdata->callback = args->onclick; 70 eventdata->callback = args->onclick;
70 eventdata->userdata = args->onclickdata; 71 eventdata->userdata = args->onclickdata;
71 eventdata->obj = obj; 72 eventdata->obj = obj;
72 eventdata->value = 0; 73 eventdata->value = 0;
74 eventdata->action = args->action ? strdup(args->action) : NULL;
73 XtAddCallback( 75 XtAddCallback(
74 button, 76 button,
75 XmNactivateCallback, 77 XmNactivateCallback,
76 (XtCallbackProc)ui_push_button_callback, 78 (XtCallbackProc)ui_push_button_callback,
77 eventdata); 79 eventdata);
78 XtAddCallback( 80 XtAddCallback(
79 button, 81 button,
80 XmNdestroyCallback, 82 XmNdestroyCallback,
81 (XtCallbackProc)ui_destroy_data, 83 (XtCallbackProc)ui_destroy_event_data,
82 eventdata); 84 eventdata);
83 } 85 }
84 86
85 87
86 XmStringFree(label); 88 XmStringFree(label);
93 e.window = event->obj->window; 95 e.window = event->obj->window;
94 e.document = event->obj->ctx->document; 96 e.document = event->obj->ctx->document;
95 e.intval = event->value; 97 e.intval = event->value;
96 e.set = 0; 98 e.set = 0;
97 event->callback(&e, event->userdata); 99 event->callback(&e, event->userdata);
100
101 if(event->action) {
102 uic_action_callback(&e, event->action);
103 }
98 } 104 }
99 105
100 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { 106 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) {
101 Arg xargs[16]; 107 Arg xargs[16];
102 int n = 0; 108 int n = 0;
120 ui_container_add(ctn, button); 126 ui_container_add(ctn, button);
121 uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); 127 uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states);
122 128
123 ui_set_widget_groups(obj->ctx, button, args->states); 129 ui_set_widget_groups(obj->ctx, button, args->states);
124 130
125 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_state); 131 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->action, args->enable_state);
126 132
127 XmStringFree(label); 133 XmStringFree(label);
128 return button; 134 return button;
129 } 135 }
130 136
149 ui_container_add(ctn, button); 155 ui_container_add(ctn, button);
150 uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); 156 uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states);
151 157
152 ui_set_widget_groups(obj->ctx, button, args->states); 158 ui_set_widget_groups(obj->ctx, button, args->states);
153 159
154 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_state); 160 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->action, args->enable_state);
155 161
156 XmStringFree(label); 162 XmStringFree(label);
157 return button; 163 return button;
158 } 164 }
159 165
182 188
183 if(event->callback) { 189 if(event->callback) {
184 event->callback(&e, event->userdata); 190 event->callback(&e, event->userdata);
185 } 191 }
186 192
193 if(event->action) {
194 uic_action_callback(&e, event->action);
195 }
196
187 if(event->var && event->var->value) { 197 if(event->var && event->var->value) {
188 UiInteger *v = event->var->value; 198 UiInteger *v = event->var->value;
189 v->value = e.intval; 199 v->value = e.intval;
190 ui_notify_evt(v->observers, &e); 200 ui_notify_evt(v->observers, &e);
191 } 201 }
196 Widget widget, 206 Widget widget,
197 const char *varname, 207 const char *varname,
198 UiInteger *value, 208 UiInteger *value,
199 ui_callback onchange, 209 ui_callback onchange,
200 void *onchangedata, 210 void *onchangedata,
211 const char *action,
201 int enable_state) 212 int enable_state)
202 { 213 {
203 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER); 214 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER);
204 if(var) { 215 if(var) {
205 value = (UiInteger*)var->value; 216 value = (UiInteger*)var->value;
214 225
215 UiVarEventData *event = malloc(sizeof(UiVarEventData)); 226 UiVarEventData *event = malloc(sizeof(UiVarEventData));
216 event->obj = obj; 227 event->obj = obj;
217 event->callback = onchange; 228 event->callback = onchange;
218 event->userdata = onchangedata; 229 event->userdata = onchangedata;
230 event->action = action ? strdup(action) : NULL;
219 event->var = var; 231 event->var = var;
220 event->observers = NULL; 232 event->observers = NULL;
221 event->value = enable_state; 233 event->value = enable_state;
222 XtAddCallback( 234 XtAddCallback(
223 widget, 235 widget,
225 (XtCallbackProc)togglebutton_changed, 237 (XtCallbackProc)togglebutton_changed,
226 event); 238 event);
227 XtAddCallback( 239 XtAddCallback(
228 widget, 240 widget,
229 XmNdestroyCallback, 241 XmNdestroyCallback,
230 (XtCallbackProc)ui_destroy_data, 242 (XtCallbackProc)ui_destroy_var_event_data,
231 event); 243 event);
232 } 244 }
233 245
234 int64_t ui_togglebutton_get(UiInteger *i) { 246 int64_t ui_togglebutton_get(UiInteger *i) {
235 Widget togglebutton = i->obj; 247 Widget togglebutton = i->obj;
292 304
293 if(event->callback) { 305 if(event->callback) {
294 event->callback(&e, event->userdata); 306 event->callback(&e, event->userdata);
295 } 307 }
296 308
309 if(event->action) {
310 uic_action_callback(&e, event->action);
311 }
312
297 if(value) { 313 if(value) {
298 ui_notify_evt(value->observers, &e); 314 ui_notify_evt(value->observers, &e);
299 } 315 }
300 } 316 }
301 317
302 void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, int enable_group) { 318 void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, const char *action, int enable_group) {
303 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER); 319 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER);
304 if(var) { 320 if(var) {
305 UiInteger *value = var->value; 321 UiInteger *value = var->value;
306 CxList *rb = value->obj; 322 CxList *rb = value->obj;
307 if(!rb) { 323 if(!rb) {
331 // other buttons in the radio button group 347 // other buttons in the radio button group
332 UiVarEventData *event = malloc(sizeof(UiVarEventData)); 348 UiVarEventData *event = malloc(sizeof(UiVarEventData));
333 event->obj = obj; 349 event->obj = obj;
334 event->callback = onchange; 350 event->callback = onchange;
335 event->userdata = onchangedata; 351 event->userdata = onchangedata;
352 event->action = action ? strdup(action) : NULL;
336 event->observers = NULL; 353 event->observers = NULL;
337 event->var = var; 354 event->var = var;
338 event->value = enable_group; 355 event->value = enable_group;
339 XtAddCallback( 356 XtAddCallback(
340 rbutton, 357 rbutton,
402 // other buttons in the radio button group 419 // other buttons in the radio button group
403 UiVarEventData *event = malloc(sizeof(UiVarEventData)); 420 UiVarEventData *event = malloc(sizeof(UiVarEventData));
404 event->obj = obj; 421 event->obj = obj;
405 event->callback = args->onchange; 422 event->callback = args->onchange;
406 event->userdata = args->onchangedata; 423 event->userdata = args->onchangedata;
424 event->action = args->action ? strdup(args->action) : NULL;
407 event->observers = NULL; 425 event->observers = NULL;
408 event->var = var; 426 event->var = var;
409 event->value = args->enable_state; 427 event->value = args->enable_state;
410 XtAddCallback( 428 XtAddCallback(
411 button, 429 button,

mercurial