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, ¶ms);
}
-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.