diff -r f0e901f7d1b7 -r 2f9d8af6a499 ui/common/types.c --- a/ui/common/types.c Thu Jun 04 19:22:54 2026 +0200 +++ b/ui/common/types.c Thu Jun 04 19:59:58 2026 +0200 @@ -121,6 +121,7 @@ UiList *list = ui_malloc(ctx, sizeof(UiList)); memset(list, 0, sizeof(UiList)); listinit(ctx, list, userdata); + list->save_selection = TRUE; if(name && ctx) { uic_reg_var(ctx, name, UI_VAR_LIST, list); @@ -137,6 +138,7 @@ } else { default_list_destroy(ctx, list, default_list_destroy_userdata); } + ui_list_selection_free(list->saved_selection); ui_free(ctx, list); } @@ -219,6 +221,11 @@ ui_notify(list->observers, list); } +void ui_list_clear_saved_selection(UiList *list) { + ui_list_selection_free(list->saved_selection); + list->saved_selection = NULL; +} + typedef struct { int type; @@ -806,6 +813,15 @@ } void uic_list_unbind(UiList *l) { + // save selection + ui_list_selection_free(l->saved_selection); + if(l->getselection && l->save_selection) { + l->saved_selection = ui_list_get_selection_allocated(l); + } else { + l->saved_selection = NULL; + } + + // unbind l->update = NULL; l->getselection = NULL; l->setselection = NULL; @@ -820,6 +836,23 @@ } + +UiListSelection* ui_list_get_selection_allocated(UiList *list) { + UiListSelection *sel = malloc(sizeof(UiListSelection)); + *sel = ui_list_get_selection(list); + return sel; + +} + +void ui_list_selection_free(UiListSelection *sel) { + if(!sel) { + return; + } + ui_listselection_free(*sel); + free(sel); +} + + UIEXPORT int ui_list_getselection(UiList *list) { int selection = -1; if (list->getselection) {