| 87 |
87 |
| 88 static char* nl_strdup(const char* s) { |
88 static char* nl_strdup(const char* s) { |
| 89 return s ? strdup(s) : NULL; |
89 return s ? strdup(s) : NULL; |
| 90 } |
90 } |
| 91 |
91 |
| 92 int* uic_copy_groups(const int* groups, size_t *ngroups) { |
92 int* uic_copy_states(const int* states, size_t *nstates) { |
| 93 *ngroups = 0; |
93 *nstates = 0; |
| 94 if (!groups) { |
94 if (!states) { |
| 95 return NULL; |
95 return NULL; |
| 96 } |
96 } |
| 97 |
97 |
| 98 size_t n; |
98 size_t n; |
| 99 for (n = 0; groups[n] > -1; n++) { } |
99 for (n = 0; states[n] > -1; n++) { } |
| 100 |
100 |
| 101 if (ngroups > 0) { |
101 if (nstates > 0) { |
| 102 int* newarray = calloc(n+1, sizeof(int)); |
102 int* newarray = calloc(n+1, sizeof(int)); |
| 103 memcpy(newarray, groups, n * sizeof(int)); |
103 memcpy(newarray, states, n * sizeof(int)); |
| 104 newarray[n] = -1; |
104 newarray[n] = -1; |
| 105 *ngroups = n; |
105 *nstates = n; |
| 106 return newarray; |
106 return newarray; |
| 107 } |
107 } |
| 108 return NULL; |
108 return NULL; |
| 109 } |
109 } |
| 110 |
110 |
| 150 |
150 |
| 151 item->label = nl_strdup(args->label); |
151 item->label = nl_strdup(args->label); |
| 152 item->icon = nl_strdup(args->icon); |
152 item->icon = nl_strdup(args->icon); |
| 153 item->userdata = args->onclickdata; |
153 item->userdata = args->onclickdata; |
| 154 item->callback = args->onclick; |
154 item->callback = args->onclick; |
| 155 item->groups = uic_copy_groups(args->groups, &item->ngroups); |
155 item->states = uic_copy_states(args->states, &item->nstates); |
| 156 |
156 |
| 157 add_item((UiMenuItemI*)item); |
157 add_item((UiMenuItemI*)item); |
| 158 } |
158 } |
| 159 |
159 |
| 160 void ui_menuseparator() { |
160 void ui_menuseparator() { |
| 177 item->label = nl_strdup(args->label); |
177 item->label = nl_strdup(args->label); |
| 178 item->icon = nl_strdup(args->icon); |
178 item->icon = nl_strdup(args->icon); |
| 179 item->varname = nl_strdup(args->varname); |
179 item->varname = nl_strdup(args->varname); |
| 180 item->userdata = args->onchangedata; |
180 item->userdata = args->onchangedata; |
| 181 item->callback = args->onchange; |
181 item->callback = args->onchange; |
| 182 item->groups = uic_copy_groups(args->groups, &item->ngroups); |
182 item->states = uic_copy_states(args->nstates, &item->nstates); |
| 183 |
183 |
| 184 add_item((UiMenuItemI*)item); |
184 add_item((UiMenuItemI*)item); |
| 185 } |
185 } |
| 186 |
186 |
| 187 void ui_menu_radioitem_create(UiMenuToggleItemArgs *args) { |
187 void ui_menu_radioitem_create(UiMenuToggleItemArgs *args) { |
| 194 item->label = nl_strdup(args->label); |
194 item->label = nl_strdup(args->label); |
| 195 item->icon = nl_strdup(args->icon); |
195 item->icon = nl_strdup(args->icon); |
| 196 item->varname = nl_strdup(args->varname); |
196 item->varname = nl_strdup(args->varname); |
| 197 item->userdata = args->onchangedata; |
197 item->userdata = args->onchangedata; |
| 198 item->callback = args->onchange; |
198 item->callback = args->onchange; |
| 199 item->groups = uic_copy_groups(args->groups, &item->ngroups); |
199 item->states = uic_copy_states(args->nstates, &item->nstates); |
| 200 |
200 |
| 201 add_item((UiMenuItemI*)item); |
201 add_item((UiMenuItemI*)item); |
| 202 } |
202 } |
| 203 |
203 |
| 204 void ui_menu_itemlist_create(UiMenuItemListArgs *args) { |
204 void ui_menu_itemlist_create(UiMenuItemListArgs *args) { |
| 294 } |
294 } |
| 295 break; |
295 break; |
| 296 } |
296 } |
| 297 case UI_MENU_ITEM: { |
297 case UI_MENU_ITEM: { |
| 298 UiMenuItem *i = (UiMenuItem*)item; |
298 UiMenuItem *i = (UiMenuItem*)item; |
| 299 free(i->groups); |
299 free(i->states); |
| 300 free(i->label); |
300 free(i->label); |
| 301 free(i->icon); |
301 free(i->icon); |
| 302 break; |
302 break; |
| 303 } |
303 } |
| 304 case UI_MENU_CHECK_ITEM: { |
304 case UI_MENU_CHECK_ITEM: { |
| 305 UiMenuCheckItem *i = (UiMenuCheckItem*)item; |
305 UiMenuCheckItem *i = (UiMenuCheckItem*)item; |
| 306 free(i->groups); |
306 free(i->states); |
| 307 free(i->label); |
307 free(i->label); |
| 308 free(i->icon); |
308 free(i->icon); |
| 309 free(i->varname); |
309 free(i->varname); |
| 310 break; |
310 break; |
| 311 } |
311 } |
| 312 case UI_MENU_RADIO_ITEM: { |
312 case UI_MENU_RADIO_ITEM: { |
| 313 UiMenuRadioItem *i = (UiMenuRadioItem*)item; |
313 UiMenuRadioItem *i = (UiMenuRadioItem*)item; |
| 314 free(i->groups); |
314 free(i->states); |
| 315 free(i->label); |
315 free(i->label); |
| 316 free(i->icon); |
316 free(i->icon); |
| 317 free(i->varname); |
317 free(i->varname); |
| 318 break; |
318 break; |
| 319 } |
319 } |