This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository evisum.

View the commit online.

commit 8e102dee6cf1b8398614ed7e3755f8c70e556e64
Author: Alastair Poole <[email protected]>
AuthorDate: Sat Mar 28 00:47:12 2026 +0000

    wip: WIP
---
 src/bin/evisum_ui_widget_example.c  | 243 ++++++++++++------------------------
 src/bin/ui/evisum_ui_process_list.c |  49 ++------
 src/bin/ui/evisum_ui_process_view.c |  33 ++---
 src/bin/ui/evisum_ui_widget_exel.c  | 236 ++++++++++++++++++++++++++++++----
 src/bin/ui/evisum_ui_widget_exel.h  |  72 +++++++----
 5 files changed, 360 insertions(+), 273 deletions(-)

diff --git a/src/bin/evisum_ui_widget_example.c b/src/bin/evisum_ui_widget_example.c
index f68cdc2..e779b3e 100644
--- a/src/bin/evisum_ui_widget_example.c
+++ b/src/bin/evisum_ui_widget_example.c
@@ -14,16 +14,6 @@ typedef struct {
     double cpu_usage;
 } Example_Row;
 
-typedef struct {
-    Evas_Object *win;
-    Evas_Object *header_tb;
-    Evisum_Ui_Widget_Exel *wx;
-    Elm_Genlist_Item_Class itc;
-    Ecore_Timer *timer;
-    unsigned int fields_mask;
-    int field_widths[EX_FIELD_MAX];
-} Example_App;
-
 static Example_Row *
 _row_new(const char *cmd, unsigned long long mem_kib, double cpu_usage) {
     Example_Row *row = calloc(1, sizeof(Example_Row));
@@ -79,88 +69,35 @@ _item_factory(Evas_Object *parent) {
 static Evas_Object *
 _content_get(void *data, Evas_Object *obj, const char *source) {
     Example_Row *row = data;
-    Example_App *app;
+    Evisum_Ui_Widget_Exel *wx;
     Evas_Object *item;
     char buf[64];
 
     if (strcmp(source, "elm.swallow.content")) return NULL;
     if (!row) return NULL;
 
-    app = evas_object_data_get(obj, "app");
-    if (!app) return NULL;
+    wx = evas_object_data_get(obj, "wx");
+    if (!wx) return NULL;
 
-    item = evisum_ui_widget_exel_item_cache_object_get(app->wx);
+    item = evisum_ui_widget_exel_item_cache_object_get(wx);
     if (!item) return NULL;
 
-    evisum_ui_widget_exel_item_field_text_set(app->wx, item, EX_FIELD_CMD, "cmd", row->cmd);
+    evisum_ui_widget_exel_item_field_text_set(wx, item, EX_FIELD_CMD, "cmd", row->cmd);
 
     snprintf(buf, sizeof(buf), "%llu MiB", row->mem_size_kib / 1024ULL);
-    evisum_ui_widget_exel_item_field_text_set(app->wx, item, EX_FIELD_MEM_SIZE, "mem_size", buf);
+    evisum_ui_widget_exel_item_field_text_set(wx, item, EX_FIELD_MEM_SIZE, "mem_size", buf);
 
     snprintf(buf, sizeof(buf), "%1.1f %%", row->cpu_usage);
-    evisum_ui_widget_exel_item_field_progress_set(app->wx, item, EX_FIELD_CPU_USAGE, "cpu_usage",
-                                                  row->cpu_usage / 100.0, buf);
+    evisum_ui_widget_exel_item_field_progress_set(wx, item, EX_FIELD_CPU_USAGE, "cpu_usage", row->cpu_usage / 100.0,
+                                                  buf);
 
     return item;
 }
 
-static void
-_unrealized_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) {
-    Example_App *app = data;
-    Eina_List *contents = NULL;
-    Evas_Object *content;
-
-    evisum_ui_widget_exel_genlist_item_all_contents_unset(event_info, &contents);
-
-    EINA_LIST_FREE(contents, content) {
-        if (!evisum_ui_widget_exel_item_cache_item_release(app->wx, content)) evas_object_del(content);
-    }
-}
-
-static unsigned int
-_reference_mask_get_cb(void *data) {
-    Example_App *app = data;
-    return app->fields_mask;
-}
-
-static void
-_fields_changed_cb(void *data EINA_UNUSED, Eina_Bool changed EINA_UNUSED) {}
-
-static void
-_fields_applied_cb(void *data, Eina_Bool changed) {
-    Example_App *app = data;
-    if (!changed) return;
-    evisum_ui_widget_exel_item_cache_reset(app->wx, NULL, NULL);
-}
-
-static void
-_resize_live_cb(void *data) {
-    Example_App *app = data;
-    evisum_ui_widget_exel_genlist_realized_items_update(app->wx);
-}
-
-static void
-_resize_done_cb(void *data EINA_UNUSED) {}
-
-static void
-_header_mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) {
-    Example_App *app = data;
-    Evas_Event_Mouse_Up *ev = event_info;
-    evisum_ui_widget_exel_field_resize_mouse_up(app->wx, ev);
-    evisum_ui_widget_exel_fields_menu_show(app->wx, obj, ev);
-}
-
-static void
-_win_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) {
-    Example_App *app = data;
-    Evas_Event_Mouse_Move *ev = event_info;
-    evisum_ui_widget_exel_field_resize_mouse_move(app->wx, ev);
-}
-
 static Eina_Bool
 _update_timer_cb(void *data) {
-    Example_App *app = data;
-    Elm_Object_Item *it = evisum_ui_widget_exel_genlist_first_item_get(app->wx);
+    Evisum_Ui_Widget_Exel *wx = data;
+    Elm_Object_Item *it = evisum_ui_widget_exel_genlist_first_item_get(wx);
 
     while (it) {
         Example_Row *row = evisum_ui_widget_exel_object_item_data_get(it);
@@ -178,12 +115,12 @@ _update_timer_cb(void *data) {
 }
 
 static void
-_fill_demo_rows(Example_App *app) {
+_fill_demo_rows(Evisum_Ui_Widget_Exel *wx, Elm_Genlist_Item_Class *itc) {
     Example_Row *rows[3];
     Elm_Object_Item *it;
 
-    evisum_ui_widget_exel_genlist_items_ensure(app->wx, 3, &app->itc);
-    it = evisum_ui_widget_exel_genlist_first_item_get(app->wx);
+    evisum_ui_widget_exel_genlist_items_ensure(wx, 3, itc);
+    it = evisum_ui_widget_exel_genlist_first_item_get(wx);
 
     rows[0] = _row_new("evisum", 512000, 24.3);
     rows[1] = _row_new("clang", 342000, 8.1);
@@ -199,94 +136,80 @@ _fill_demo_rows(Example_App *app) {
 }
 
 static void
-_win_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) {
-    Example_App *app = data;
+_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) {
+    Ecore_Timer *timer;
+    Evisum_Ui_Widget_Exel *wx;
 
-    if (app->timer) ecore_timer_del(app->timer);
+    timer = evas_object_data_get(obj, "timer");
+    wx = evas_object_data_get(obj, "wx");
+    if (timer) ecore_timer_del(timer);
 
-    evisum_ui_widget_exel_genlist_clear(app->wx);
-    evisum_ui_widget_exel_free(app->wx);
-    free(app);
+    if (wx) {
+        evisum_ui_widget_exel_genlist_clear(wx);
+        evisum_ui_widget_exel_free(wx);
+    }
     elm_exit();
 }
 
 EAPI_MAIN int
 elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) {
-    Example_App *app = calloc(1, sizeof(Example_App));
-    Evas_Object *root;
-    Evas_Object *glist;
-    Evas_Object *btn_cmd;
-    Evas_Object *btn_mem;
-    Evas_Object *btn_cpu;
-    Evisum_Ui_Widget_Exel_Params wp;
+    Evas_Object *win, *root;
+    Evisum_Ui_Widget_Exel *wx;
+    Evisum_Ui_Widget_Exel_Field_Params fp;
     Evisum_Ui_Widget_Exel_Genlist_Params gp;
+    Elm_Genlist_Item_Class itc;
+    Ecore_Timer *timer;
 
-    if (!app) return EXIT_FAILURE;
+    memset(&itc, 0, sizeof(itc));
 
     srand((unsigned int) time(NULL));
 
-    app->fields_mask = (1u << EX_FIELD_CMD) | (1u << EX_FIELD_MEM_SIZE) | (1u << EX_FIELD_CPU_USAGE);
-    app->field_widths[EX_FIELD_CMD] = 160;
-    app->field_widths[EX_FIELD_MEM_SIZE] = 120;
-    app->field_widths[EX_FIELD_CPU_USAGE] = 150;
+    win = elm_win_util_standard_add("evisum_test", "Widget Example");
+    elm_win_autodel_set(win, EINA_TRUE);
+    evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _win_del_cb, NULL);
 
-    app->win = elm_win_util_standard_add("evisum_test", "Widget Example");
-    elm_win_autodel_set(app->win, EINA_TRUE);
-    evas_object_event_callback_add(app->win, EVAS_CALLBACK_DEL, _win_del_cb, app);
-    evas_object_event_callback_add(app->win, EVAS_CALLBACK_MOUSE_MOVE, _win_mouse_move_cb, app);
+    wx = evisum_ui_widget_exel_create(win);
+    if (!wx) return EXIT_FAILURE;
 
-    root = elm_box_add(app->win);
-    evas_object_size_hint_weight_set(root, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-    evas_object_size_hint_align_set(root, EVAS_HINT_FILL, EVAS_HINT_FILL);
-    evas_object_show(root);
-    elm_win_resize_object_add(app->win, root);
+    evas_object_data_set(win, "wx", wx);
 
-    app->header_tb = elm_table_add(root);
-    evas_object_size_hint_weight_set(app->header_tb, EVAS_HINT_EXPAND, 0.0);
-    evas_object_size_hint_align_set(app->header_tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
-    evas_object_show(app->header_tb);
-    elm_box_pack_end(root, app->header_tb);
+    root = evisum_ui_widget_exel_object_get(wx);
+    elm_win_resize_object_add(win, root);
 
-    btn_cmd = evisum_ui_widget_exel_sort_header_button_add(app->header_tb, "command", EINA_FALSE, 1.0, EVAS_HINT_FILL,
-                                                           NULL, app);
-    btn_mem = evisum_ui_widget_exel_sort_header_button_add(app->header_tb, "mem size", EINA_FALSE, 1.0, EVAS_HINT_FILL,
-                                                           NULL, app);
-    btn_cpu = evisum_ui_widget_exel_sort_header_button_add(app->header_tb, "cpu %", EINA_FALSE, 1.0, EVAS_HINT_FILL,
-                                                           NULL, app);
+    fp = (Evisum_Ui_Widget_Exel_Field_Params) {
+        .id = EX_FIELD_CMD,
+        .title = "command",
+        .desc = "Command",
+        .default_width = 160,
+        .min_width = 90,
+        .always_visible = EINA_TRUE,
+        .reverse = EINA_FALSE,
+    };
+    evisum_ui_widget_exel_field_add(wx, &fp);
 
-    wp.win = app->win;
-    wp.parent = app->win;
-    wp.field_first = EX_FIELD_CMD;
-    wp.field_max = EX_FIELD_MAX;
-    wp.resize_hit_width = 8;
-    wp.fields_mask = &app->fields_mask;
-    wp.field_widths = app->field_widths;
-    wp.reference_mask_get_cb = _reference_mask_get_cb;
-    wp.fields_changed_cb = _fields_changed_cb;
-    wp.fields_applied_cb = _fields_applied_cb;
-    wp.resize_live_cb = _resize_live_cb;
-    wp.resize_done_cb = _resize_done_cb;
-    wp.data = ""
+    fp = (Evisum_Ui_Widget_Exel_Field_Params) {
+        .id = EX_FIELD_MEM_SIZE,
+        .title = "mem size",
+        .desc = "Memory Size",
+        .default_width = 120,
+        .min_width = 80,
+        .always_visible = EINA_FALSE,
+        .reverse = EINA_FALSE,
+    };
+    evisum_ui_widget_exel_field_add(wx, &fp);
 
-    app->wx = evisum_ui_widget_exel_add(&wp);
-    if (!app->wx) return EXIT_FAILURE;
+    fp = (Evisum_Ui_Widget_Exel_Field_Params) {
+        .id = EX_FIELD_CPU_USAGE,
+        .title = "cpu %",
+        .desc = "CPU Usage",
+        .default_width = 150,
+        .min_width = 90,
+        .always_visible = EINA_FALSE,
+        .reverse = EINA_FALSE,
+    };
+    evisum_ui_widget_exel_field_add(wx, &fp);
 
-    evisum_ui_widget_exel_field_register(app->wx, EX_FIELD_CMD, btn_cmd, "Command", 160, 90, EINA_TRUE);
-    evisum_ui_widget_exel_field_register(app->wx, EX_FIELD_MEM_SIZE, btn_mem, "Memory Size", 120, 80, EINA_FALSE);
-    evisum_ui_widget_exel_field_register(app->wx, EX_FIELD_CPU_USAGE, btn_cpu, "CPU Usage", 150, 90, EINA_FALSE);
-
-    evisum_ui_widget_exel_field_resize_attach(app->wx, btn_cmd, EX_FIELD_CMD);
-    evisum_ui_widget_exel_field_resize_attach(app->wx, btn_mem, EX_FIELD_MEM_SIZE);
-    evisum_ui_widget_exel_field_resize_attach(app->wx, btn_cpu, EX_FIELD_CPU_USAGE);
-    evas_object_event_callback_add(btn_cmd, EVAS_CALLBACK_MOUSE_UP, _header_mouse_up_cb, app);
-    evas_object_event_callback_add(btn_mem, EVAS_CALLBACK_MOUSE_UP, _header_mouse_up_cb, app);
-    evas_object_event_callback_add(btn_cpu, EVAS_CALLBACK_MOUSE_UP, _header_mouse_up_cb, app);
-
-    evisum_ui_widget_exel_field_width_apply(app->wx, EX_FIELD_CMD);
-    evisum_ui_widget_exel_field_width_apply(app->wx, EX_FIELD_MEM_SIZE);
-    evisum_ui_widget_exel_field_width_apply(app->wx, EX_FIELD_CPU_USAGE);
-    evisum_ui_widget_exel_field_proportions_apply(app->wx);
-    evisum_ui_widget_exel_fields_pack_visible(app->wx, app->header_tb, 0);
+    evisum_ui_widget_exel_fields_apply(wx);
 
     gp.homogeneous = EINA_TRUE;
     gp.focus_allow = EINA_TRUE;
@@ -300,26 +223,26 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) {
     gp.weight_y = EVAS_HINT_EXPAND;
     gp.align_x = EVAS_HINT_FILL;
     gp.align_y = EVAS_HINT_FILL;
-    gp.data_key = "app";
-    gp.data = ""
+    gp.data_key = "wx";
+    gp.data = ""
 
-    glist = evisum_ui_widget_exel_genlist_add(app->wx, root, &gp);
-    elm_box_pack_end(root, glist);
+    evisum_ui_widget_exel_genlist_attach(wx, &gp);
 
-    app->itc.item_style = "full";
-    app->itc.func.text_get = NULL;
-    app->itc.func.content_get = _content_get;
-    app->itc.func.filter_get = NULL;
-    app->itc.func.del = _item_del;
+    itc.item_style = "full";
+    itc.func.text_get = NULL;
+    itc.func.content_get = _content_get;
+    itc.func.filter_get = NULL;
+    itc.func.del = _item_del;
 
-    evisum_ui_widget_exel_genlist_smart_callback_add(app->wx, "unrealized", _unrealized_cb, app);
-    evisum_ui_widget_exel_item_cache_attach(app->wx, _item_factory, 16);
+    evisum_ui_widget_exel_genlist_unrealized_release_enable(wx, EINA_TRUE);
+    evisum_ui_widget_exel_item_cache_configure(wx, _item_factory, 16);
 
-    _fill_demo_rows(app);
-    app->timer = ecore_timer_add(1.0, _update_timer_cb, app);
+    _fill_demo_rows(wx, &itc);
+    timer = ecore_timer_add(1.0, _update_timer_cb, wx);
+    evas_object_data_set(win, "timer", timer);
 
-    evas_object_resize(app->win, 680, 360);
-    evas_object_show(app->win);
+    evas_object_resize(win, 680, 360);
+    evas_object_show(win);
     elm_run();
 
     return EXIT_SUCCESS;
diff --git a/src/bin/ui/evisum_ui_process_list.c b/src/bin/ui/evisum_ui_process_list.c
index 73e08d8..88ba061 100644
--- a/src/bin/ui/evisum_ui_process_list.c
+++ b/src/bin/ui/evisum_ui_process_list.c
@@ -293,23 +293,6 @@ _evisum_ui_process_list_content_reset(Evisum_Ui_Process_List_View *view) {
     evisum_ui_widget_exel_item_cache_reset(view->widget_exel, _evisum_ui_process_list_fields_cache_reset_done_cb, view);
 }
 
-static void
-_evisum_ui_process_list_item_unrealized_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) {
-    Evas_Object *o;
-    Evisum_Ui_Process_List_View *view;
-    Eina_List *contents = NULL;
-
-    view = data;
-
-    evisum_ui_widget_exel_genlist_item_all_contents_unset(event_info, &contents);
-
-    EINA_LIST_FREE(contents, o) {
-        if (!evisum_ui_widget_exel_item_cache_item_release(view->widget_exel, o)) {
-            evas_object_del(o);
-        }
-    }
-}
-
 static void
 _evisum_ui_process_list_item_del(void *data, Evas_Object *obj EINA_UNUSED) {
     Proc_Info *proc = data;
@@ -856,16 +839,6 @@ _evisum_ui_process_list_field_header_mouse_up_cb(void *data, Evas *e EINA_UNUSED
     evisum_ui_widget_exel_field_resize_mouse_up(view->widget_exel, ev);
 }
 
-static void
-_evisum_ui_process_list_field_header_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
-                                                   void *event_info) {
-    Evisum_Ui_Process_List_View *view = data;
-    Evas_Event_Mouse_Move *ev = event_info;
-    (void) e;
-    (void) obj;
-    evisum_ui_widget_exel_field_resize_mouse_move(view->widget_exel, ev);
-}
-
 static void
 _evisum_ui_process_list_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) {
     Evisum_Ui_Process_List_View *view;
@@ -1168,7 +1141,7 @@ _evisum_ui_process_list_btn_menu_clicked_cb(void *data, Evas_Object *obj, void *
 
 static Evas_Object *
 _evisum_ui_process_list_content_add(Evisum_Ui_Process_List_View *view, Evas_Object *parent) {
-    Evas_Object *tb, *btn;
+    Evas_Object *tb, *btn, *glist;
     Evas_Object *fr, *hbx;
     Evisum_Ui_Widget_Exel_Genlist_Params gp = {
         .homogeneous = 1,
@@ -1198,6 +1171,7 @@ _evisum_ui_process_list_content_add(Evisum_Ui_Process_List_View *view, Evas_Obje
 
     _evisum_ui_process_list_fields_init(view);
     evisum_ui_widget_exel_genlist_add(view->widget_exel, parent, &gp);
+    glist = evisum_ui_widget_exel_genlist_obj_get(view->widget_exel);
 
     view->itc.item_style = "full";
     view->itc.func.text_get = NULL;
@@ -1205,18 +1179,12 @@ _evisum_ui_process_list_content_add(Evisum_Ui_Process_List_View *view, Evas_Obje
     view->itc.func.filter_get = NULL;
     view->itc.func.del = _evisum_ui_process_list_item_del;
 
-    evisum_ui_widget_exel_genlist_smart_callback_add(view->widget_exel, "selected",
-                                                     _evisum_ui_process_list_item_pid_clicked_cb, view);
+    evas_object_smart_callback_add(glist, "selected", _evisum_ui_process_list_item_pid_clicked_cb, view);
     evisum_ui_widget_exel_genlist_event_callback_add(view->widget_exel, EVAS_CALLBACK_MOUSE_UP,
                                                      _evisum_ui_process_list_item_pid_secondary_clicked_cb, view);
-    evisum_ui_widget_exel_genlist_smart_callback_add(view->widget_exel, "unrealized",
-                                                     _evisum_ui_process_list_item_unrealized_cb, view);
-    evisum_ui_widget_exel_genlist_smart_callback_add(view->widget_exel, "scroll",
-                                                     _evisum_ui_process_list_glist_scrolled_cb, view);
-    evisum_ui_widget_exel_genlist_smart_callback_add(view->widget_exel, "scroll,anim,stop",
-                                                     _evisum_ui_process_list_glist_scroll_stopped_cb, view);
-    evisum_ui_widget_exel_genlist_smart_callback_add(view->widget_exel, "scroll,drag,stop",
-                                                     _evisum_ui_process_list_glist_scroll_stopped_cb, view);
+    evas_object_smart_callback_add(glist, "scroll", _evisum_ui_process_list_glist_scrolled_cb, view);
+    evas_object_smart_callback_add(glist, "scroll,anim,stop", _evisum_ui_process_list_glist_scroll_stopped_cb, view);
+    evas_object_smart_callback_add(glist, "scroll,drag,stop", _evisum_ui_process_list_glist_scroll_stopped_cb, view);
 
     view->summary.fr = fr = elm_frame_add(parent);
     elm_object_style_set(fr, "pad_small");
@@ -1631,20 +1599,19 @@ evisum_ui_process_list_win_add(Evisum_Ui *ui) {
     elm_win_resize_object_add(win, tb);
     elm_object_content_set(win, tb);
 
-    evisum_ui_widget_exel_item_cache_attach(view->widget_exel, _evisum_ui_process_list_item_create, 30);
+    evisum_ui_widget_exel_item_cache_configure(view->widget_exel, _evisum_ui_process_list_item_create, 30);
     view->icon_cache = evisum_icon_cache_new();
     view->proc_usage_cache = eina_hash_int64_new(_evisum_ui_process_list_usage_cache_free_cb);
 
     evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _evisum_ui_process_list_win_del_cb, view);
     evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _evisum_ui_process_list_win_resize_cb, view);
     evas_object_event_callback_add(win, EVAS_CALLBACK_MOVE, _evisum_ui_process_list_win_move_cb, view);
-    evas_object_event_callback_add(win, EVAS_CALLBACK_MOUSE_MOVE, _evisum_ui_process_list_field_header_mouse_move_cb,
-                                   view);
     evas_object_event_callback_add(win, EVAS_CALLBACK_MOUSE_UP, _evisum_ui_process_list_field_header_mouse_up_cb, view);
     evas_object_event_callback_add(tb, EVAS_CALLBACK_KEY_DOWN, _evisum_ui_process_list_win_key_down_cb, view);
 
     _evisum_ui_process_list_search_add(view);
     _evisum_ui_process_list_effects_add(view, win);
+    evisum_ui_widget_exel_genlist_unrealized_release_enable(view->widget_exel, EINA_TRUE);
     _evisum_ui_process_list_content_reset(view);
 
     _evisum_ui_process_list_win_resize_cb(view, NULL, win, NULL);
diff --git a/src/bin/ui/evisum_ui_process_view.c b/src/bin/ui/evisum_ui_process_view.c
index 19bbf64..a7fc20f 100644
--- a/src/bin/ui/evisum_ui_process_view.c
+++ b/src/bin/ui/evisum_ui_process_view.c
@@ -160,19 +160,6 @@ _evisum_ui_process_view_exe_response(const char *command) {
     return lines;
 }
 
-static void
-_evisum_ui_process_view_item_unrealized_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) {
-    Evisum_Ui_Process_View *view;
-    Evas_Object *o;
-    Eina_List *contents = NULL;
-
-    view = data;
-
-    evisum_ui_widget_exel_genlist_item_all_contents_unset(event_info, &contents);
-
-    EINA_LIST_FREE(contents, o) { evisum_ui_widget_exel_item_cache_item_release(view->threads.widget_exel, o); }
-}
-
 static void
 _evisum_ui_process_view_item_del(void *data, Evas_Object *obj EINA_UNUSED) {
     Thread_Info *t = data;
@@ -182,6 +169,12 @@ _evisum_ui_process_view_item_del(void *data, Evas_Object *obj EINA_UNUSED) {
     free(t);
 }
 
+static void
+_evisum_ui_process_view_hash_free_cb(void *data) {
+    Thread_Cpu_Info *inf = data;
+    free(inf);
+}
+
 static Evas_Object *
 _evisum_ui_process_view_item_column_add(Evas_Object *tb, const char *text, int col) {
     Evisum_Ui_Widget_Exel_Column_Params params = {
@@ -196,12 +189,6 @@ _evisum_ui_process_view_item_column_add(Evas_Object *tb, const char *text, int c
     return evisum_ui_widget_exel_item_column_add(tb, text, col, &params);
 }
 
-static void
-_evisum_ui_process_view_hash_free_cb(void *data) {
-    Thread_Cpu_Info *inf = data;
-    free(inf);
-}
-
 static Evas_Object *
 _evisum_ui_process_view_item_create(Evas_Object *parent) {
     Evas_Object *tb, *lb, *pb;
@@ -1288,8 +1275,6 @@ _evisum_ui_process_view_threads_tab_add(Evas_Object *parent, Evisum_Ui_Process_V
     }
 
     glist = evisum_ui_widget_exel_genlist_add(view->threads.widget_exel, parent, &gp);
-    evisum_ui_widget_exel_genlist_smart_callback_add(view->threads.widget_exel, "unrealized",
-                                                     _evisum_ui_process_view_item_unrealized_cb, view);
     elm_box_pack_end(bx2, glist);
     elm_box_pack_end(bx, bx2);
 
@@ -1328,8 +1313,7 @@ _evisum_ui_process_view_children_tab_add(Evas_Object *parent, Evisum_Ui_Process_
     elm_object_content_set(fr, bx);
 
     glist = evisum_ui_widget_exel_genlist_add(view->children.widget_exel, parent, &gp);
-    evisum_ui_widget_exel_genlist_smart_callback_add(view->children.widget_exel, "selected",
-                                                     _evisum_ui_process_view_item_children_clicked_cb, view);
+    evas_object_smart_callback_add(glist, "selected", _evisum_ui_process_view_item_children_clicked_cb, view);
     elm_box_pack_end(bx, glist);
 
     return fr;
@@ -1665,7 +1649,8 @@ evisum_ui_process_view_win_add(int pid, Evisum_Proc_Action action) {
     view->kthreads_has_rss = 1;
 #endif
 
-    evisum_ui_widget_exel_item_cache_attach(view->threads.widget_exel, _evisum_ui_process_view_item_create, 10);
+    evisum_ui_widget_exel_item_cache_configure(view->threads.widget_exel, _evisum_ui_process_view_item_create, 10);
+    evisum_ui_widget_exel_genlist_unrealized_release_enable(view->threads.widget_exel, EINA_FALSE);
 
     view->thread = ecore_thread_feedback_run(_evisum_ui_process_view_proc_info_main,
                                              _evisum_ui_process_view_proc_info_feedback_cb, NULL, NULL, view, 0);
diff --git a/src/bin/ui/evisum_ui_widget_exel.c b/src/bin/ui/evisum_ui_widget_exel.c
index 4f5963e..ef5849a 100644
--- a/src/bin/ui/evisum_ui_widget_exel.c
+++ b/src/bin/ui/evisum_ui_widget_exel.c
@@ -5,6 +5,9 @@
 #include <string.h>
 
 #define EVISUM_UI_WIDGET_EXEL_FIELDS_MAX 64
+#define EVISUM_UI_WIDGET_EXEL_DEFAULT_FIELD_FIRST 0
+#define EVISUM_UI_WIDGET_EXEL_DEFAULT_FIELD_MAX   32
+#define EVISUM_UI_WIDGET_EXEL_DEFAULT_HIT_WIDTH   8
 
 typedef struct {
     int id;
@@ -18,8 +21,12 @@ typedef struct {
 
 struct _Evisum_Ui_Widget_Exel {
     Evisum_Ui_Widget_Exel_Params p;
+    unsigned int fields_mask_state;
+    int field_widths_state[EVISUM_UI_WIDGET_EXEL_FIELDS_MAX];
     Exel_Field fields[EVISUM_UI_WIDGET_EXEL_FIELDS_MAX];
     Evisum_Ui_Cache *cache;
+    Evas_Object *root;
+    Evas_Object *header_tb;
     Evas_Object *glist;
 
     Evas_Object *fields_menu;
@@ -36,6 +43,10 @@ struct _Evisum_Ui_Widget_Exel {
     Eina_Bool resizing;
     Eina_Bool ignore_sort_click;
     Eina_Bool fields_changed;
+    Eina_Bool owns_state;
+    Eina_Bool win_mouse_move_registered;
+    Eina_Bool unrealized_release_enabled;
+    Eina_Bool unrealized_delete_unhandled;
 };
 
 static Exel_Field *
@@ -75,6 +86,8 @@ static void
 _evisum_ui_widget_exel_fields_sync(Evisum_Ui_Widget_Exel *wx) {
     int i;
 
+    if (!wx || !wx->p.fields_mask) return;
+
     for (i = wx->p.field_first; i < wx->p.field_max; i++) {
         Exel_Field *f = _evisum_ui_widget_exel_field_get(wx, i);
         if (!f) continue;
@@ -147,6 +160,12 @@ _evisum_ui_widget_exel_fields_menu_apply_clicked_cb(void *data, Evas_Object *obj
     changed = wx->fields_changed;
     evisum_ui_widget_exel_fields_menu_dismiss(wx);
 
+    if (changed && wx->owns_state) {
+        evisum_ui_widget_exel_fields_apply(wx);
+        if (wx->cache) evisum_ui_item_cache_reset(wx->cache, NULL, NULL);
+        if (wx->glist) elm_genlist_realized_items_update(wx->glist);
+    }
+
     if (wx->p.fields_applied_cb) wx->p.fields_applied_cb(wx->p.data, changed);
 }
 
@@ -281,6 +300,132 @@ _evisum_ui_widget_exel_field_header_mouse_down_cb(void *data, Evas *e EINA_UNUSE
     }
 }
 
+static void
+_evisum_ui_widget_exel_field_header_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) {
+    Evisum_Ui_Widget_Exel *wx = data;
+    Evas_Event_Mouse_Up *ev = event_info;
+
+    if (!wx || !ev) return;
+
+    evisum_ui_widget_exel_field_resize_mouse_up(wx, ev);
+    evisum_ui_widget_exel_fields_menu_show(wx, obj, ev);
+}
+
+static void
+_evisum_ui_widget_exel_win_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                                         void *event_info);
+
+static void
+_evisum_ui_widget_exel_genlist_unrealized_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info);
+
+Evisum_Ui_Widget_Exel *
+evisum_ui_widget_exel_create(Evas_Object *parent) {
+    Evisum_Ui_Widget_Exel_Params p;
+    Evisum_Ui_Widget_Exel *wx;
+    int i;
+
+    if (!parent) return NULL;
+
+    memset(&p, 0, sizeof(p));
+    p.win = parent;
+    p.parent = parent;
+    p.field_first = EVISUM_UI_WIDGET_EXEL_DEFAULT_FIELD_FIRST;
+    p.field_max = EVISUM_UI_WIDGET_EXEL_DEFAULT_FIELD_MAX;
+    p.resize_hit_width = EVISUM_UI_WIDGET_EXEL_DEFAULT_HIT_WIDTH;
+
+    wx = calloc(1, sizeof(Evisum_Ui_Widget_Exel));
+    if (!wx) return NULL;
+
+    wx->fields_mask_state = UINT_MAX;
+    for (i = p.field_first; i < p.field_max; i++) {
+        wx->field_widths_state[i] = 0;
+    }
+
+    p.fields_mask = &wx->fields_mask_state;
+    p.field_widths = wx->field_widths_state;
+    p.data = ""
+    wx->p = p;
+    wx->owns_state = EINA_TRUE;
+
+    wx->root = elm_box_add(parent);
+    evas_object_size_hint_weight_set(wx->root, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(wx->root, EVAS_HINT_FILL, EVAS_HINT_FILL);
+    evas_object_show(wx->root);
+
+    wx->header_tb = elm_table_add(wx->root);
+    evas_object_size_hint_weight_set(wx->header_tb, EVAS_HINT_EXPAND, 0.0);
+    evas_object_size_hint_align_set(wx->header_tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
+    evas_object_show(wx->header_tb);
+    elm_box_pack_end(wx->root, wx->header_tb);
+
+    evas_object_event_callback_add(p.win, EVAS_CALLBACK_MOUSE_MOVE, _evisum_ui_widget_exel_win_mouse_move_cb, wx);
+    wx->win_mouse_move_registered = EINA_TRUE;
+
+    return wx;
+}
+
+Evas_Object *
+evisum_ui_widget_exel_object_get(const Evisum_Ui_Widget_Exel *wx) {
+    if (!wx) return NULL;
+    return wx->root;
+}
+
+void
+evisum_ui_widget_exel_field_add(Evisum_Ui_Widget_Exel *wx, const Evisum_Ui_Widget_Exel_Field_Params *params) {
+    Evas_Object *btn;
+
+    if (!wx || !params || !wx->header_tb) return;
+
+    btn = evisum_ui_widget_exel_sort_header_button_add(wx->header_tb, params->title, params->reverse, 1.0,
+                                                        EVAS_HINT_FILL, params->clicked_cb, params->clicked_data);
+    if (!btn) return;
+
+    evisum_ui_widget_exel_field_register(wx, params->id, btn, params->desc, params->default_width, params->min_width,
+                                         params->always_visible);
+    evisum_ui_widget_exel_field_resize_attach(wx, btn, params->id);
+    evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_UP, _evisum_ui_widget_exel_field_header_mouse_up_cb, wx);
+}
+
+void
+evisum_ui_widget_exel_fields_apply(Evisum_Ui_Widget_Exel *wx) {
+    int i;
+
+    if (!wx || !wx->header_tb) return;
+
+    for (i = wx->p.field_first; i < wx->p.field_max; i++) {
+        evisum_ui_widget_exel_field_width_apply(wx, i);
+    }
+    evisum_ui_widget_exel_field_proportions_apply(wx);
+    elm_table_clear(wx->header_tb, EINA_FALSE);
+    evisum_ui_widget_exel_fields_pack_visible(wx, wx->header_tb, 0);
+}
+
+Evas_Object *
+evisum_ui_widget_exel_genlist_attach(Evisum_Ui_Widget_Exel *wx, const Evisum_Ui_Widget_Exel_Genlist_Params *params) {
+    Evas_Object *glist;
+
+    if (!wx || !wx->root) return NULL;
+
+    glist = evisum_ui_widget_exel_genlist_add(wx, wx->root, params);
+    if (!glist) return NULL;
+
+    elm_box_pack_end(wx->root, glist);
+    return glist;
+}
+
+unsigned int
+evisum_ui_widget_exel_fields_mask_get(const Evisum_Ui_Widget_Exel *wx) {
+    if (!wx || !wx->p.fields_mask) return 0;
+    return *(wx->p.fields_mask);
+}
+
+int
+evisum_ui_widget_exel_field_width_state_get(const Evisum_Ui_Widget_Exel *wx, int id) {
+    if (!wx || !wx->p.field_widths) return 0;
+    if (id < 0 || id >= EVISUM_UI_WIDGET_EXEL_FIELDS_MAX) return 0;
+    return wx->p.field_widths[id];
+}
+
 Evisum_Ui_Widget_Exel *
 evisum_ui_widget_exel_add(const Evisum_Ui_Widget_Exel_Params *params) {
     Evisum_Ui_Widget_Exel *wx;
@@ -292,15 +437,29 @@ evisum_ui_widget_exel_add(const Evisum_Ui_Widget_Exel_Params *params) {
     if (!wx) return NULL;
 
     wx->p = *params;
+    if (wx->p.win) {
+        evas_object_event_callback_add(wx->p.win, EVAS_CALLBACK_MOUSE_MOVE, _evisum_ui_widget_exel_win_mouse_move_cb,
+                                       wx);
+        wx->win_mouse_move_registered = EINA_TRUE;
+    }
     return wx;
 }
 
 void
 evisum_ui_widget_exel_free(Evisum_Ui_Widget_Exel *wx) {
     if (!wx) return;
+    if (wx->unrealized_release_enabled && wx->glist) {
+        evas_object_smart_callback_del_full(wx->glist, "unrealized", _evisum_ui_widget_exel_genlist_unrealized_cb, wx);
+    }
+    if (wx->win_mouse_move_registered && wx->p.win) {
+        evas_object_event_callback_del_full(wx->p.win, EVAS_CALLBACK_MOUSE_MOVE, _evisum_ui_widget_exel_win_mouse_move_cb,
+                                            wx);
+    }
     evisum_ui_widget_exel_fields_menu_dismiss(wx);
     evisum_ui_widget_exel_deferred_call_cancel(wx);
     if (wx->cache) evisum_ui_item_cache_free(wx->cache);
+    if (wx->root) evas_object_del(wx->root);
+    wx->header_tb = NULL;
     wx->glist = NULL;
     free(wx);
 }
@@ -473,8 +632,8 @@ evisum_ui_widget_exel_field_resize_attach(Evisum_Ui_Widget_Exel *wx, Evas_Object
                                    wx);
 }
 
-void
-evisum_ui_widget_exel_field_resize_mouse_move(Evisum_Ui_Widget_Exel *wx, Evas_Event_Mouse_Move *ev) {
+static void
+_evisum_ui_widget_exel_field_resize_mouse_move(Evisum_Ui_Widget_Exel *wx, Evas_Event_Mouse_Move *ev) {
     Evas_Coord width;
 
     if (!wx || !ev) return;
@@ -487,10 +646,19 @@ evisum_ui_widget_exel_field_resize_mouse_move(Evisum_Ui_Widget_Exel *wx, Evas_Ev
     evas_object_size_hint_min_set(wx->resize_btn, width, 1);
     wx->p.field_widths[wx->resize_field] = width;
     evisum_ui_widget_exel_field_proportions_apply(wx);
+    if (wx->glist) elm_genlist_realized_items_update(wx->glist);
 
     if (wx->p.resize_live_cb) wx->p.resize_live_cb(wx->p.data);
 }
 
+static void
+_evisum_ui_widget_exel_win_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                                         void *event_info) {
+    Evisum_Ui_Widget_Exel *wx = data;
+    Evas_Event_Mouse_Move *ev = event_info;
+    _evisum_ui_widget_exel_field_resize_mouse_move(wx, ev);
+}
+
 void
 evisum_ui_widget_exel_field_resize_mouse_up(Evisum_Ui_Widget_Exel *wx, Evas_Event_Mouse_Up *ev) {
     Evas_Coord w;
@@ -502,6 +670,7 @@ evisum_ui_widget_exel_field_resize_mouse_up(Evisum_Ui_Widget_Exel *wx, Evas_Even
     evas_object_geometry_get(wx->resize_btn, NULL, NULL, &w, NULL);
     wx->p.field_widths[wx->resize_field] = w;
     evisum_ui_widget_exel_field_proportions_apply(wx);
+    if (wx->glist) elm_genlist_realized_items_update(wx->glist);
 
     wx->resizing = 0;
     wx->resize_btn = NULL;
@@ -912,9 +1081,9 @@ evisum_ui_widget_exel_icon_button_add(Evas_Object *parent, const char *icon, con
     return btn;
 }
 
-void
-evisum_ui_widget_exel_item_cache_add(Evisum_Ui_Widget_Exel *wx, Evas_Object *parent,
-                                     Evas_Object *(*create_cb)(Evas_Object *), int size) {
+static void
+_evisum_ui_widget_exel_item_cache_add(Evisum_Ui_Widget_Exel *wx, Evas_Object *parent,
+                                      Evas_Object *(*create_cb)(Evas_Object *), int size) {
     if (!wx) return;
     if (!parent || !create_cb || size <= 0) return;
 
@@ -924,9 +1093,16 @@ evisum_ui_widget_exel_item_cache_add(Evisum_Ui_Widget_Exel *wx, Evas_Object *par
 }
 
 void
-evisum_ui_widget_exel_item_cache_attach(Evisum_Ui_Widget_Exel *wx, Evas_Object *(*create_cb)(Evas_Object *), int size) {
+evisum_ui_widget_exel_item_cache_configure(Evisum_Ui_Widget_Exel *wx, Evas_Object *(*create_cb)(Evas_Object *),
+                                           int size) {
     if (!wx || !wx->glist) return;
-    evisum_ui_widget_exel_item_cache_add(wx, wx->glist, create_cb, size);
+    _evisum_ui_widget_exel_item_cache_add(wx, wx->glist, create_cb, size);
+}
+
+static Eina_Bool
+_evisum_ui_widget_exel_item_cache_item_release(Evisum_Ui_Widget_Exel *wx, Evas_Object *obj) {
+    if (!wx || !wx->cache) return 0;
+    return evisum_ui_item_cache_item_release(wx->cache, obj);
 }
 
 Evas_Object *
@@ -939,13 +1115,6 @@ evisum_ui_widget_exel_item_cache_object_get(Evisum_Ui_Widget_Exel *wx) {
 
     return it->obj;
 }
-
-Eina_Bool
-evisum_ui_widget_exel_item_cache_item_release(Evisum_Ui_Widget_Exel *wx, Evas_Object *obj) {
-    if (!wx || !wx->cache) return 0;
-    return evisum_ui_item_cache_item_release(wx->cache, obj);
-}
-
 void
 evisum_ui_widget_exel_item_cache_reset(Evisum_Ui_Widget_Exel *wx, void (*done_cb)(void *data), void *data) {
     if (!wx || !wx->cache) return;
@@ -993,13 +1162,6 @@ evisum_ui_widget_exel_genlist_obj_get(const Evisum_Ui_Widget_Exel *wx) {
     return wx->glist;
 }
 
-void
-evisum_ui_widget_exel_genlist_smart_callback_add(Evisum_Ui_Widget_Exel *wx, const char *name, Evas_Smart_Cb cb,
-                                                 const void *data) {
-    if (!wx || !wx->glist || !name || !cb) return;
-    evas_object_smart_callback_add(wx->glist, name, cb, data);
-}
-
 void
 evisum_ui_widget_exel_genlist_event_callback_add(Evisum_Ui_Widget_Exel *wx, Evas_Callback_Type type,
                                                  Evas_Object_Event_Cb cb, const void *data) {
@@ -1088,10 +1250,36 @@ evisum_ui_widget_exel_genlist_item_update(Elm_Object_Item *it) {
     elm_genlist_item_update(it);
 }
 
-void
-evisum_ui_widget_exel_genlist_item_all_contents_unset(Elm_Object_Item *it, Eina_List **contents) {
+static void
+_evisum_ui_widget_exel_genlist_item_contents_release(Evisum_Ui_Widget_Exel *wx, Elm_Object_Item *it,
+                                                     Eina_Bool delete_unhandled) {
+    Eina_List *contents = NULL;
+    Evas_Object *obj;
+
     if (!it) return;
-    elm_genlist_item_all_contents_unset(it, contents);
+    elm_genlist_item_all_contents_unset(it, &contents);
+
+    EINA_LIST_FREE(contents, obj) {
+        if (_evisum_ui_widget_exel_item_cache_item_release(wx, obj)) continue;
+        if (delete_unhandled) evas_object_del(obj);
+    }
+}
+
+static void
+_evisum_ui_widget_exel_genlist_unrealized_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) {
+    Evisum_Ui_Widget_Exel *wx = data;
+    _evisum_ui_widget_exel_genlist_item_contents_release(wx, event_info, wx->unrealized_delete_unhandled);
+}
+
+void
+evisum_ui_widget_exel_genlist_unrealized_release_enable(Evisum_Ui_Widget_Exel *wx, Eina_Bool delete_unhandled) {
+    if (!wx || !wx->glist) return;
+
+    if (!wx->unrealized_release_enabled) {
+        evas_object_smart_callback_add(wx->glist, "unrealized", _evisum_ui_widget_exel_genlist_unrealized_cb, wx);
+        wx->unrealized_release_enabled = EINA_TRUE;
+    }
+    wx->unrealized_delete_unhandled = delete_unhandled;
 }
 
 Elm_Object_Item *
diff --git a/src/bin/ui/evisum_ui_widget_exel.h b/src/bin/ui/evisum_ui_widget_exel.h
index 97fcc36..373e57c 100644
--- a/src/bin/ui/evisum_ui_widget_exel.h
+++ b/src/bin/ui/evisum_ui_widget_exel.h
@@ -41,6 +41,18 @@ typedef void (*Evisum_Ui_Widget_Exel_Fields_Applied_Cb)(void *data, Eina_Bool ch
 typedef void (*Evisum_Ui_Widget_Exel_Resize_Live_Cb)(void *data);
 typedef void (*Evisum_Ui_Widget_Exel_Resize_Done_Cb)(void *data);
 
+typedef struct {
+    int id;
+    const char *title;
+    const char *desc;
+    int default_width;
+    int min_width;
+    Eina_Bool always_visible;
+    Eina_Bool reverse;
+    Evas_Smart_Cb clicked_cb;
+    const void *clicked_data;
+} Evisum_Ui_Widget_Exel_Field_Params;
+
 typedef struct {
     Evas_Object *win;
     Evas_Object *parent;
@@ -75,6 +87,35 @@ typedef struct {
     const void *data;
 } Evisum_Ui_Widget_Exel_Genlist_Params;
 
+/* Create a full exel view with internal root/header objects and owned field state.
+ * This API avoids exposing internal params arrays or requiring caller-managed header containers. */
+Evisum_Ui_Widget_Exel *evisum_ui_widget_exel_create(Evas_Object *parent);
+
+/* Return the top-level root object owned by the widget.
+ * Pack this into the parent layout instead of creating a separate box in callers. */
+Evas_Object *evisum_ui_widget_exel_object_get(const Evisum_Ui_Widget_Exel *wx);
+
+/* Create/register a header field button and attach resize/menu behavior automatically.
+ * This replaces external `btn_*` object creation and field wiring in consumers. */
+void evisum_ui_widget_exel_field_add(Evisum_Ui_Widget_Exel *wx, const Evisum_Ui_Widget_Exel_Field_Params *params);
+
+/* Apply width/proportion/pack operations for all registered headers in one call.
+ * Call once after field registration and whenever field visibility changes are applied. */
+void evisum_ui_widget_exel_fields_apply(Evisum_Ui_Widget_Exel *wx);
+
+/* Create the widget-owned genlist under the widget root and pack it automatically.
+ * This avoids passing container boxes from callers. */
+Evas_Object *evisum_ui_widget_exel_genlist_attach(Evisum_Ui_Widget_Exel *wx,
+                                                  const Evisum_Ui_Widget_Exel_Genlist_Params *params);
+
+/* Return the current field visibility mask tracked by the widget.
+ * Use this when persisting user field selection without direct access to internal params. */
+unsigned int evisum_ui_widget_exel_fields_mask_get(const Evisum_Ui_Widget_Exel *wx);
+
+/* Return the current stored width for a field.
+ * Use this when persisting column sizing without touching internal arrays. */
+int evisum_ui_widget_exel_field_width_state_get(const Evisum_Ui_Widget_Exel *wx, int id);
+
 /* Create and initialize the exel widget controller with field masks, widths, and callbacks.
  * Use this once per view before registering fields so resize/menu behavior is managed centrally. */
 Evisum_Ui_Widget_Exel *evisum_ui_widget_exel_add(const Evisum_Ui_Widget_Exel_Params *params);
@@ -124,10 +165,6 @@ void evisum_ui_widget_exel_cmd_width_sync(Evisum_Ui_Widget_Exel *wx, int field_c
  * After attaching, the shared controller handles edge drag detection for left/right resize starts. */
 void evisum_ui_widget_exel_field_resize_attach(Evisum_Ui_Widget_Exel *wx, Evas_Object *btn, int field_id);
 
-/* Process global mouse-move events while a header resize drag is active.
- * Wire this from the window mouse-move callback so live column resizing updates instantly. */
-void evisum_ui_widget_exel_field_resize_mouse_move(Evisum_Ui_Widget_Exel *wx, Evas_Event_Mouse_Move *ev);
-
 /* Process global mouse-up events to finish an active header resize drag.
  * This commits final width state and triggers configured resize-done callbacks. */
 void evisum_ui_widget_exel_field_resize_mouse_up(Evisum_Ui_Widget_Exel *wx, Evas_Event_Mouse_Up *ev);
@@ -225,24 +262,15 @@ Evas_Object *evisum_ui_widget_exel_icon_button_add(Evas_Object *parent, const ch
                                                    double weight_x, double align_x, Evas_Smart_Cb clicked_cb,
                                                    const void *data);
 
-/* Create and attach an item cache to this widget controller.
+/* Configure an item cache for the widget-owned genlist.
  * Use this when row content objects are pooled and should be owned by the widget lifecycle. */
-void evisum_ui_widget_exel_item_cache_add(Evisum_Ui_Widget_Exel *wx, Evas_Object *parent,
-                                          Evas_Object *(*create_cb)(Evas_Object *), int size);
-
-/* Create and attach an item cache to the widget-owned genlist.
- * Use this when the exel controller already owns the target genlist and callers should not pass list objects around. */
-void evisum_ui_widget_exel_item_cache_attach(Evisum_Ui_Widget_Exel *wx, Evas_Object *(*create_cb)(Evas_Object *),
-                                             int size);
+void evisum_ui_widget_exel_item_cache_configure(Evisum_Ui_Widget_Exel *wx, Evas_Object *(*create_cb)(Evas_Object *),
+                                                int size);
 
 /* Return one cached row object from the widget-owned item cache.
  * Use this in content callbacks to avoid exposing `Item_Cache` internals in consumers. */
 Evas_Object *evisum_ui_widget_exel_item_cache_object_get(Evisum_Ui_Widget_Exel *wx);
 
-/* Release a realized row object back to the widget-owned cache.
- * Returns true when the object was found and handled by the cache. */
-Eina_Bool evisum_ui_widget_exel_item_cache_item_release(Evisum_Ui_Widget_Exel *wx, Evas_Object *obj);
-
 /* Reset and rebuild the widget-owned cache and invoke completion callback when cleanup completes.
  * Use this after column/field layout changes so row object structure is recreated safely. */
 void evisum_ui_widget_exel_item_cache_reset(Evisum_Ui_Widget_Exel *wx, void (*done_cb)(void *data), void *data);
@@ -264,11 +292,6 @@ Evas_Object *evisum_ui_widget_exel_genlist_add(Evisum_Ui_Widget_Exel *wx, Evas_O
  * Use this only when another container API requires the object for packing. */
 Evas_Object *evisum_ui_widget_exel_genlist_obj_get(const Evisum_Ui_Widget_Exel *wx);
 
-/* Add a smart callback to the widget-owned genlist.
- * This keeps callback registration scoped to the exel controller instead of direct genlist usage. */
-void evisum_ui_widget_exel_genlist_smart_callback_add(Evisum_Ui_Widget_Exel *wx, const char *name, Evas_Smart_Cb cb,
-                                                      const void *data);
-
 /* Add an evas event callback to the widget-owned genlist.
  * Use this for low-level mouse/key handling without exposing genlist ownership. */
 void evisum_ui_widget_exel_genlist_event_callback_add(Evisum_Ui_Widget_Exel *wx, Evas_Callback_Type type,
@@ -330,9 +353,10 @@ void evisum_ui_widget_exel_genlist_item_selected_set(Elm_Object_Item *it, Eina_B
  * Use this after swapping row data on an existing item. */
 void evisum_ui_widget_exel_genlist_item_update(Elm_Object_Item *it);
 
-/* Unset all realized content objects from a genlist item and return them in `contents`.
- * Use this in unrealize callbacks before returning objects to the shared item cache. */
-void evisum_ui_widget_exel_genlist_item_all_contents_unset(Elm_Object_Item *it, Eina_List **contents);
+/* Enable/disable automatic unrealized-item content release through the widget item cache.
+ * When enabled, all genlist unrealized contents are released internally without consumer callbacks. */
+void evisum_ui_widget_exel_genlist_unrealized_release_enable(Evisum_Ui_Widget_Exel *wx,
+                                                             Eina_Bool delete_unhandled);
 
 /* Append a new item to the widget-owned genlist using Elm-style append parameters.
  * Pass `func`/`func_data` when per-item selection callbacks are needed, or NULL to match existing behavior. */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to