diff -r 62921b370c60 -r ee49d1852a5f ui/motif/list.c --- a/ui/motif/list.c Sun Jan 21 12:13:09 2018 +0100 +++ b/ui/motif/list.c Sun Jul 01 19:03:26 2018 +0200 @@ -44,11 +44,9 @@ return ui_listview(obj, list, ui_strmodel_getvalue, f, udata); } -UIWIDGET ui_listview_var(UiObject *obj, UiListPtr *list, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { - UiList *ls = list->list; - +UIWIDGET ui_listview_var(UiObject *obj, UiVar *var, ui_getvaluefunc getvalue, ui_callback f, void *udata) { int count; - XmStringTable items = ui_create_stringlist(list->list, getvalue, &count); + XmStringTable items = ui_create_stringlist(var->value, getvalue, &count); Arg args[8]; int n = 0; @@ -65,14 +63,9 @@ UiListView *listview = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiListView)); listview->widget = widget; - listview->list = list; + listview->list = var; listview->getvalue = getvalue; - list->list->observers = ui_add_observer( - list->list->observers, - (ui_callback)ui_listview_update, - listview); - for (int i=0;ievent.userdata = udata; event->event.callback = f; event->event.value = 0; - event->list = list; + event->var = var; XtAddCallback( widget, XmNdefaultActionCallback, @@ -97,17 +90,18 @@ return widget; } -UIWIDGET ui_listview(UiObject *obj, UiList *list, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { - UiListPtr *listptr = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiListPtr)); - listptr->list = list; - return ui_listview_var(obj, listptr, getvalue, f, udata); +UIWIDGET ui_listview(UiObject *obj, UiList *list, ui_getvaluefunc getvalue, ui_callback f, void *udata) { + UiVar *var = malloc(sizeof(UiVar)); + var->value = list; + var->type = UI_VAR_SPECIAL; + return ui_listview_var(obj, var, getvalue, f, udata); } -UIWIDGET ui_listview_nv(UiObject *obj, char *varname, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { - UiVar *var = uic_connect_var(obj->ctx, varname, UI_VAR_LIST); +UIWIDGET ui_listview_nv(UiObject *obj, char *varname, ui_getvaluefunc getvalue, ui_callback f, void *udata) { + UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_LIST); if(var) { UiListVar *value = var->value; - return ui_listview_var(obj, value->listptr, getvalue, f, udata); + return ui_listview_var(obj, var, getvalue, f, udata); } else { // TODO: error } @@ -115,7 +109,7 @@ } -XmStringTable ui_create_stringlist(UiList *list, ui_model_getvalue_f getvalue, int *count) { +XmStringTable ui_create_stringlist(UiList *list, ui_getvaluefunc getvalue, int *count) { int num = list->count(list); XmStringTable items = (XmStringTable)XtMalloc(num * sizeof(XmString)); void *data = list->first(list); @@ -132,7 +126,7 @@ void ui_listview_update(UiEvent *event, UiListView *view) { int count; XmStringTable items = ui_create_stringlist( - view->list->list, + view->list->value, view->getvalue, &count); @@ -156,7 +150,8 @@ e.obj = event->event.obj; e.window = event->event.obj->window; e.document = event->event.obj->ctx->document; - e.eventdata = event->list->list->get(event->list->list, cbs->item_position - 1); + UiList *list = event->var->value; + e.eventdata = list->get(list, cbs->item_position - 1); e.intval = cbs->item_position - 1; event->event.callback(&e, event->event.userdata); } @@ -168,24 +163,25 @@ return ui_combobox(obj, list, ui_strmodel_getvalue, f, udata); } -UIWIDGET ui_combobox(UiObject *obj, UiList *list, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { - UiListPtr *listptr = ucx_mempool_malloc(obj->ctx->mempool, sizeof(UiListPtr)); - listptr->list = list; - return ui_combobox_var(obj, listptr, getvalue, f, udata); +UIWIDGET ui_combobox(UiObject *obj, UiList *list, ui_getvaluefunc getvalue, ui_callback f, void *udata) { + UiVar *var = malloc(sizeof(UiVar)); + var->value = list; + var->type = UI_VAR_SPECIAL; + return ui_combobox_var(obj, var, getvalue, f, udata); } -UIWIDGET ui_combobox_nv(UiObject *obj, char *varname, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { - UiVar *var = uic_connect_var(obj->ctx, varname, UI_VAR_LIST); +UIWIDGET ui_combobox_nv(UiObject *obj, char *varname, ui_getvaluefunc getvalue, ui_callback f, void *udata) { + UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_LIST); if(var) { UiListVar *value = var->value; - return ui_combobox_var(obj, value->listptr, getvalue, f, udata); + return ui_combobox_var(obj, var, getvalue, f, udata); } else { // TODO: error } return NULL; } -UIWIDGET ui_combobox_var(UiObject *obj, UiListPtr *list, ui_model_getvalue_f getvalue, ui_callback f, void *udata) { +UIWIDGET ui_combobox_var(UiObject *obj, UiVar *var, ui_getvaluefunc getvalue, ui_callback f, void *udata) { UiListView *listview = ucx_mempool_malloc( obj->ctx->mempool, sizeof(UiListView)); @@ -203,14 +199,9 @@ Widget combobox = XmCreateDropDownList(parent, "combobox", args, n); XtManageChild(combobox); listview->widget = combobox; - listview->list = list; + listview->list = var; listview->getvalue = getvalue; ui_listview_update(NULL, listview); - list->list->observers = ui_add_observer( - list->list->observers, - (ui_callback)ui_listview_update, - listview); - }