ui/motif/button.c

changeset 108
77254bd6dccb
parent 103
6606616eca9f
child 112
c3f2f16fa4b8
equal deleted inserted replaced
107:b34bd1557c6c 108:77254bd6dccb
39 #include <cx/compare.h> 39 #include <cx/compare.h>
40 40
41 #include <Xm/XmAll.h> 41 #include <Xm/XmAll.h>
42 42
43 43
44 UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) { 44 UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) {
45 Arg xargs[16]; 45 Arg xargs[16];
46 int n = 0; 46 int n = 0;
47 47
48 UiContainerPrivate *ctn = ui_obj_container(obj); 48 UiContainerPrivate *ctn = ui_obj_container(obj);
49 UI_APPLY_LAYOUT(ctn->layout, args); 49 UI_APPLY_LAYOUT(ctn->layout, args);
50 50
51 Widget parent = ctn->prepare(ctn, xargs, &n); 51 Widget parent = ctn->prepare(ctn, xargs, &n);
52 52
53 XmString label = NULL; 53 XmString label = NULL;
54 if(args.label) { 54 if(args->label) {
55 label = XmStringCreateLocalized((char*)args.label); 55 label = XmStringCreateLocalized((char*)args->label);
56 XtSetArg(xargs[n], XmNlabelString, label); n++; 56 XtSetArg(xargs[n], XmNlabelString, label); n++;
57 } 57 }
58 58
59 char *name = args.name ? (char*)args.name : "button"; 59 char *name = args->name ? (char*)args->name : "button";
60 Widget button = XmCreatePushButton(parent, name, xargs, n); 60 Widget button = XmCreatePushButton(parent, name, xargs, n);
61 XtManageChild(button); 61 XtManageChild(button);
62 ctn->add(ctn, button); 62 ctn->add(ctn, button);
63 63
64 ui_set_widget_groups(obj->ctx, button, args.groups); 64 ui_set_widget_groups(obj->ctx, button, args->groups);
65 65
66 if(args.onclick) { 66 if(args->onclick) {
67 UiEventData *eventdata = malloc(sizeof(UiEventData)); 67 UiEventData *eventdata = malloc(sizeof(UiEventData));
68 eventdata->callback = args.onclick; 68 eventdata->callback = args->onclick;
69 eventdata->userdata = args.onclickdata; 69 eventdata->userdata = args->onclickdata;
70 eventdata->obj = obj; 70 eventdata->obj = obj;
71 eventdata->value = 0; 71 eventdata->value = 0;
72 XtAddCallback( 72 XtAddCallback(
73 button, 73 button,
74 XmNactivateCallback, 74 XmNactivateCallback,
94 e.intval = event->value; 94 e.intval = event->value;
95 e.set = 0; 95 e.set = 0;
96 event->callback(&e, event->userdata); 96 event->callback(&e, event->userdata);
97 } 97 }
98 98
99 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) { 99 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) {
100 Arg xargs[16]; 100 Arg xargs[16];
101 int n = 0; 101 int n = 0;
102 102
103 UiContainerPrivate *ctn = ui_obj_container(obj); 103 UiContainerPrivate *ctn = ui_obj_container(obj);
104 UI_APPLY_LAYOUT(ctn->layout, args); 104 UI_APPLY_LAYOUT(ctn->layout, args);
106 Widget parent = ctn->prepare(ctn, xargs, &n); 106 Widget parent = ctn->prepare(ctn, xargs, &n);
107 XtSetArg(xargs[n], XmNfillOnSelect, True); n++; 107 XtSetArg(xargs[n], XmNfillOnSelect, True); n++;
108 XtSetArg(xargs[n], XmNindicatorOn, False); n++; 108 XtSetArg(xargs[n], XmNindicatorOn, False); n++;
109 109
110 XmString label = NULL; 110 XmString label = NULL;
111 if(args.label) { 111 if(args->label) {
112 label = XmStringCreateLocalized((char*)args.label); 112 label = XmStringCreateLocalized((char*)args->label);
113 XtSetArg(xargs[n], XmNlabelString, label); n++; 113 XtSetArg(xargs[n], XmNlabelString, label); n++;
114 } 114 }
115 115
116 char *name = args.name ? (char*)args.name : "togglebutton"; 116 char *name = args->name ? (char*)args->name : "togglebutton";
117 Widget button = XmCreateToggleButton(parent, name, xargs, n); 117 Widget button = XmCreateToggleButton(parent, name, xargs, n);
118 XtManageChild(button); 118 XtManageChild(button);
119 ctn->add(ctn, button); 119 ctn->add(ctn, button);
120 120
121 ui_set_widget_groups(obj->ctx, button, args.groups); 121 ui_set_widget_groups(obj->ctx, button, args->groups);
122 122
123 ui_bind_togglebutton(obj, button, args.varname, args.value, args.onchange, args.onchangedata, args.enable_group); 123 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_group);
124 124
125 XmStringFree(label); 125 XmStringFree(label);
126 return button; 126 return button;
127 } 127 }
128 128
129 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { 129 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) {
130 Arg xargs[16]; 130 Arg xargs[16];
131 int n = 0; 131 int n = 0;
132 132
133 UiContainerPrivate *ctn = ui_obj_container(obj); 133 UiContainerPrivate *ctn = ui_obj_container(obj);
134 UI_APPLY_LAYOUT(ctn->layout, args); 134 UI_APPLY_LAYOUT(ctn->layout, args);
135 135
136 Widget parent = ctn->prepare(ctn, xargs, &n); 136 Widget parent = ctn->prepare(ctn, xargs, &n);
137 137
138 XmString label = NULL; 138 XmString label = NULL;
139 if(args.label) { 139 if(args->label) {
140 label = XmStringCreateLocalized((char*)args.label); 140 label = XmStringCreateLocalized((char*)args->label);
141 XtSetArg(xargs[n], XmNlabelString, label); n++; 141 XtSetArg(xargs[n], XmNlabelString, label); n++;
142 } 142 }
143 143
144 char *name = args.name ? (char*)args.name : "button"; 144 char *name = args->name ? (char*)args->name : "button";
145 Widget button = XmCreateToggleButton(parent, name, xargs, n); 145 Widget button = XmCreateToggleButton(parent, name, xargs, n);
146 XtManageChild(button); 146 XtManageChild(button);
147 ctn->add(ctn, button); 147 ctn->add(ctn, button);
148 148
149 ui_set_widget_groups(obj->ctx, button, args.groups); 149 ui_set_widget_groups(obj->ctx, button, args->groups);
150 150
151 ui_bind_togglebutton(obj, button, args.varname, args.value, args.onchange, args.onchangedata, args.enable_group); 151 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_group);
152 152
153 XmStringFree(label); 153 XmStringFree(label);
154 return button; 154 return button;
155 } 155 }
156 156
157 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) { 157 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) {
158 return ui_checkbox_create(obj, args); 158 return ui_checkbox_create(obj, args);
159 } 159 }
160 160
161 static void togglebutton_changed(Widget w, UiVarEventData *event, XmToggleButtonCallbackStruct *tb) { 161 static void togglebutton_changed(Widget w, UiVarEventData *event, XmToggleButtonCallbackStruct *tb) {
162 if(event->value > 0) { 162 if(event->value > 0) {
171 UiEvent e; 171 UiEvent e;
172 e.obj = event->obj; 172 e.obj = event->obj;
173 e.window = e.obj->window; 173 e.window = e.obj->window;
174 e.document = e.obj->ctx->document; 174 e.document = e.obj->ctx->document;
175 e.eventdata = NULL; 175 e.eventdata = NULL;
176 e.eventdatatype = 0;
176 e.intval = XmToggleButtonGetState(w); 177 e.intval = XmToggleButtonGetState(w);
177 e.set = ui_get_setop(); 178 e.set = ui_get_setop();
178 179
179 if(event->callback) { 180 if(event->callback) {
180 event->callback(&e, event->userdata); 181 event->callback(&e, event->userdata);
280 UiEvent e; 281 UiEvent e;
281 e.obj = event->obj; 282 e.obj = event->obj;
282 e.window = e.obj->window; 283 e.window = e.obj->window;
283 e.document = e.obj->ctx->document; 284 e.document = e.obj->ctx->document;
284 e.eventdata = value; 285 e.eventdata = value;
286 e.eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
285 e.intval = v; 287 e.intval = v;
286 e.set = ui_get_setop(); 288 e.set = ui_get_setop();
287 289
288 if(event->callback) { 290 if(event->callback) {
289 event->callback(&e, event->userdata); 291 event->callback(&e, event->userdata);
341 XmNdestroyCallback, 343 XmNdestroyCallback,
342 (XtCallbackProc)ui_destroy_eventdata, 344 (XtCallbackProc)ui_destroy_eventdata,
343 event); 345 event);
344 } 346 }
345 347
346 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { 348 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) {
347 Arg xargs[16]; 349 Arg xargs[16];
348 int n = 0; 350 int n = 0;
349 351
350 UiContainerPrivate *ctn = ui_obj_container(obj); 352 UiContainerPrivate *ctn = ui_obj_container(obj);
351 UI_APPLY_LAYOUT(ctn->layout, args); 353 UI_APPLY_LAYOUT(ctn->layout, args);
352 354
353 Widget parent = ctn->prepare(ctn, xargs, &n); 355 Widget parent = ctn->prepare(ctn, xargs, &n);
354 XtSetArg(xargs[n], XmNindicatorType, XmONE_OF_MANY_ROUND); n++; 356 XtSetArg(xargs[n], XmNindicatorType, XmONE_OF_MANY_ROUND); n++;
355 XmString label = NULL; 357 XmString label = NULL;
356 if(args.label) { 358 if(args->label) {
357 label = XmStringCreateLocalized((char*)args.label); 359 label = XmStringCreateLocalized((char*)args->label);
358 XtSetArg(xargs[n], XmNlabelString, label); n++; 360 XtSetArg(xargs[n], XmNlabelString, label); n++;
359 } 361 }
360 362
361 char *name = args.name ? (char*)args.name : "button"; 363 char *name = args->name ? (char*)args->name : "button";
362 Widget button = XmCreateToggleButton(parent, name, xargs, n); 364 Widget button = XmCreateToggleButton(parent, name, xargs, n);
363 XtManageChild(button); 365 XtManageChild(button);
364 ctn->add(ctn, button); 366 ctn->add(ctn, button);
365 367
366 ui_set_widget_groups(obj->ctx, button, args.groups); 368 ui_set_widget_groups(obj->ctx, button, args->groups);
367 369
368 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); 370 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
369 if(var) { 371 if(var) {
370 UiInteger *value = var->value; 372 UiInteger *value = var->value;
371 CxList *rb = value->obj; 373 CxList *rb = value->obj;
372 if(!rb) { 374 if(!rb) {
373 // first button in the radiobutton group 375 // first button in the radiobutton group
394 396
395 // the radio button needs to handle change events to update all 397 // the radio button needs to handle change events to update all
396 // other buttons in the radio button group 398 // other buttons in the radio button group
397 UiVarEventData *event = malloc(sizeof(UiVarEventData)); 399 UiVarEventData *event = malloc(sizeof(UiVarEventData));
398 event->obj = obj; 400 event->obj = obj;
399 event->callback = args.onchange; 401 event->callback = args->onchange;
400 event->userdata = args.onchangedata; 402 event->userdata = args->onchangedata;
401 event->observers = NULL; 403 event->observers = NULL;
402 event->var = var; 404 event->var = var;
403 event->value = args.enable_group; 405 event->value = args->enable_group;
404 XtAddCallback( 406 XtAddCallback(
405 button, 407 button,
406 XmNvalueChangedCallback, 408 XmNvalueChangedCallback,
407 (XtCallbackProc)radiobutton_changed, 409 (XtCallbackProc)radiobutton_changed,
408 event); 410 event);

mercurial