netstar pushed a commit to branch master.

http://git.enlightenment.org/apps/evisum.git/commit/?id=5208ece41f0c9e90a3a0aae0aa4871483b10a633

commit 5208ece41f0c9e90a3a0aae0aa4871483b10a633
Author: Alastair Poole <nets...@gmail.com>
Date:   Sat Apr 18 02:07:12 2020 +0100

    ui: use a genlist cache.
---
 src/bin/ui.c | 264 +++++++++++++++++++++++++++++++++++++++++++++--------------
 src/bin/ui.h |   2 +-
 2 files changed, 203 insertions(+), 63 deletions(-)

diff --git a/src/bin/ui.c b/src/bin/ui.c
index 392155a..6742396 100644
--- a/src/bin/ui.c
+++ b/src/bin/ui.c
@@ -17,6 +17,13 @@ static Eina_Lock _lock;
 static Eina_List *_list = NULL;
 static Evisum_Config *_evisum_config = NULL;
 
+typedef struct _Item_Cache {
+   Evas_Object *obj;
+   Eina_Bool   used;
+} Item_Cache;
+
+static Eina_List *_item_cache = NULL;
+
 static void
 _config_save(Ui *ui)
 {
@@ -822,7 +829,7 @@ _column_expand_init(Ui *ui)
    ui->long_rss   = strdup("");
    ui->long_cmd   = strdup("");
    ui->long_state = strdup("");
-   ui->long_cpu   = strdup("");
+   ui->long_cpu_usage = strdup("");
 }
 
 static void
@@ -873,54 +880,64 @@ _column_expand_calculate(Ui *ui, Proc_Info *proc)
      }
 
    text = eina_slstr_printf("%.1f%%", proc->cpu_usage);
-   if (strlen(text) > strlen(ui->long_cpu))
+   if (strlen(text) > strlen(ui->long_cpu_usage))
      {
-        if (ui->long_cpu) free(ui->long_cpu);
-        ui->long_cpu = strdup(text);
+        if (ui->long_cpu_usage) free(ui->long_cpu_usage);
+        ui->long_cpu_usage = strdup(text);
      }
 }
 
 static Evas_Object *
-_column_expand(Evas_Object *parent, const char *text)
+_label_expand(Evas_Object *parent, const char *text)
 {
    Evas_Object *label;
 
    label = elm_label_add(parent);
-   elm_object_text_set(label, text);
+   evas_object_data_set(label, text, label);
    evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_weight_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
 
    return label;
 }
 
+static void
+_item_unrealized_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Item_Cache *it;
+   Eina_List *l, *contents = NULL;
+
+   elm_genlist_item_all_contents_unset(event_info, &contents);
+   Evas_Object *o;
+   EINA_LIST_FREE(contents, o)
+    {
+       EINA_LIST_FOREACH(_item_cache, l, it)
+         {
+            if (it->obj == o)
+              {
+                 it->used = EINA_FALSE;
+                 puts("REUSE");
+                 break;
+              }
+          }
+       puts("STOLEN");
+    }
+}
+
 static void
 _item_del(void *data, Evas_Object *obj EINA_UNUSED)
 {
    Proc_Info *proc = data;
+   puts("DELE");
    free(proc);
 }
 
 static Evas_Object *
-_content_get(void *data, Evas_Object *obj, const char *source)
+_item_create(Evas_Object *parent)
 {
-   Ui *ui;
-   Proc_Info *proc;
-   Evas_Object *box, *label;
+   Evas_Object *obj, *label;
    Evas_Object *table, *rect;
-   Evas_Coord w, h;
 
-   proc = (void *) data;
-   ui = _ui;
-
-   if (strcmp(source, "elm.swallow.content")) return NULL;
-   if (!proc) return NULL;
-   if (!ui->ready) return NULL;
-
-   box = elm_box_add(obj);
-   elm_box_horizontal_set(box, EINA_TRUE);
-   evas_object_size_hint_align_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_size_hint_weight_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_show(box);
+   obj = parent;
 
    table = elm_table_add(obj);
    evas_object_size_hint_align_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -928,93 +945,215 @@ _content_get(void *data, Evas_Object *obj, const char 
*source)
    evas_object_show(table);
 
    label = elm_label_add(obj);
-   elm_object_text_set(label, eina_slstr_printf("%d", proc->pid));
+   evas_object_data_set(table, "proc_pid", label);
    evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_weight_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(label);
    rect = evas_object_rectangle_add(table);
-   evas_object_geometry_get(ui->btn_pid, NULL, NULL, &w, &h);
-   evas_object_size_hint_min_set(rect, w, 1);
+   evas_object_data_set(label, "rect", rect);
    elm_table_pack(table, rect, 0, 0, 1, 1);
    elm_table_pack(table, label, 0, 0, 1, 1);
-   elm_table_pack(table, _column_expand(table, ui->long_pid), 0, 0, 1, 1);
+   elm_table_pack(table, _label_expand(table, "long_pid"), 0, 0, 1, 1);
 
    label = elm_label_add(table);
-   elm_object_text_set(label, eina_slstr_printf("%d", proc->uid));
+   evas_object_data_set(table, "proc_uid", label);
    evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_weight_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   elm_table_pack(table, label, 1, 0, 1, 1);
+   evas_object_show(label);
    rect = evas_object_rectangle_add(table);
-   evas_object_geometry_get(ui->btn_uid, NULL, NULL, &w, &h);
-   evas_object_size_hint_min_set(rect, w, 1);
+   evas_object_data_set(label, "rect", rect);
    elm_table_pack(table, rect, 1, 0, 1, 1);
-   elm_table_pack(table, _column_expand(table, ui->long_uid), 1, 0, 1, 1);
-   evas_object_show(label);
+   elm_table_pack(table, label, 1, 0, 1, 1);
+   elm_table_pack(table, _label_expand(table, "long_uid"), 1, 0, 1, 1);
 
    label = elm_label_add(table);
-   elm_object_text_set(label, eina_slstr_printf("%lu %c ", 
_mem_adjust(ui->data_unit, proc->mem_size >> 10), ui->data_unit));
+   evas_object_data_set(table, "proc_size", label);
    evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_weight_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(label);
    rect = evas_object_rectangle_add(table);
-   evas_object_geometry_get(ui->btn_size, NULL, NULL, &w, &h);
-   evas_object_size_hint_min_set(rect, w, 1);
+   evas_object_data_set(label, "rect", rect);
    elm_table_pack(table, rect, 2, 0, 1, 1);
-   evas_object_show(label);
    elm_table_pack(table, label, 2, 0, 1, 1);
-   elm_table_pack(table, _column_expand(table, ui->long_size), 2, 0, 1, 1);
+   elm_table_pack(table, _label_expand(table, "long_size"), 2, 0, 1, 1);
 
    label = elm_label_add(table);
-   elm_object_text_set(label, eina_slstr_printf("%lu %c ", 
_mem_adjust(ui->data_unit, proc->mem_rss >> 10), ui->data_unit));
+   evas_object_data_set(table, "proc_rss", label);
    evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_weight_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(label);
    rect = evas_object_rectangle_add(table);
-   evas_object_geometry_get(ui->btn_rss, NULL, NULL, &w, &h);
-   evas_object_size_hint_min_set(rect, w, 1);
+   evas_object_data_set(label, "rect", rect);
    elm_table_pack(table, rect, 3, 0, 1, 1);
    elm_table_pack(table, label, 3, 0, 1, 1);
-   elm_table_pack(table, _column_expand(table,ui->long_rss), 3, 0, 1, 1);
+   elm_table_pack(table, _label_expand(table, "long_rss"), 3, 0, 1, 1);
 
    label = elm_label_add(table);
-   elm_object_text_set(label, eina_slstr_printf("%s", proc->command));
+   evas_object_data_set(table, "proc_cmd", label);
    evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_weight_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(label);
    rect = evas_object_rectangle_add(table);
-   evas_object_geometry_get(ui->btn_cmd, NULL, NULL, &w, &h);
-   evas_object_size_hint_min_set(rect, w, 1);
+   evas_object_data_set(label, "rect", rect);
    elm_table_pack(table, rect, 4, 0, 1, 1);
-   evas_object_show(label);
    elm_table_pack(table, label, 4, 0, 1, 1);
-   elm_table_pack(table, _column_expand(table,ui->long_cmd), 4, 0, 1, 1);
+   elm_table_pack(table, _label_expand(table, "long_cmd"), 4, 0, 1, 1);
 
    label = elm_label_add(table);
-   elm_object_text_set(label, eina_slstr_printf("%s", proc->state));
-   evas_object_size_hint_align_set(label, 0.5, EVAS_HINT_EXPAND);
+   evas_object_data_set(table, "proc_state", label);
+   evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_weight_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(label);
-   elm_table_pack(table, label, 5, 0, 1, 1);
    rect = evas_object_rectangle_add(table);
-   evas_object_geometry_get(ui->btn_state, NULL, NULL, &w, &h);
-   evas_object_size_hint_min_set(rect, w, 1);
+   evas_object_data_set(label, "rect", rect);
+   elm_table_pack(table, label, 5, 0, 1, 1);
    elm_table_pack(table, rect, 5, 0, 1, 1);
-   elm_table_pack(table, _column_expand(table, ui->long_state), 5, 0, 1, 1);
+   elm_table_pack(table, _label_expand(table, "long_state"), 5, 0, 1, 1);
 
    label = elm_label_add(table);
-   elm_object_text_set(label, eina_slstr_printf("%.1f%%", proc->cpu_usage));
-   evas_object_size_hint_align_set(label, 0.5, EVAS_HINT_EXPAND);
+   evas_object_data_set(table, "proc_cpu_usage", label);
+   evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_weight_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(label);
-   elm_table_pack(table, label, 6, 0, 1, 1);
    rect = evas_object_rectangle_add(table);
-   evas_object_geometry_get(ui->btn_cpu, NULL, NULL, &w, &h);
-   evas_object_size_hint_min_set(rect, w,  1);
+   evas_object_data_set(label, "rect", rect);
+   elm_table_pack(table, label, 6, 0, 1, 1);
    elm_table_pack(table, rect, 6, 0, 1, 1);
-   elm_table_pack(table, _column_expand(table, ui->long_cpu), 6, 0, 1, 1);
+   elm_table_pack(table, _label_expand(table, "long_cpu_usage"), 6, 0, 1, 1);
 
    return table;
 }
 
+static void
+_item_cache_init(Ui *ui)
+{
+   for (int i = 0; i < 100; i++)
+     {
+        Item_Cache *it = calloc(1, sizeof(Item_Cache));
+        it->obj = _item_create(ui->genlist_procs);
+        _item_cache = eina_list_append(_item_cache, it);
+     }
+}
+
+static Item_Cache *
+_item_cache_get(Ui *ui)
+{
+   Eina_List *l;
+   Item_Cache *it;
+
+   EINA_LIST_FOREACH(_item_cache, l, it)
+     {
+        if (it->used == 0)
+          {
+             it->used = 1;
+             return it;
+          }
+     }
+
+   it = calloc(1, sizeof(Item_Cache));
+   it->obj = _item_create(ui->genlist_procs);
+   it->used = 1;
+   _item_cache = eina_list_append(_item_cache, it);
+
+   return it;
+}
+
+static Evas_Object *
+_content_get(void *data, Evas_Object *obj, const char *source)
+{
+   Ui *ui;
+   Proc_Info *proc;
+   Evas_Object *l, *r;
+   Evas_Coord w, h;
+
+   proc = (void *) data;
+   ui = _ui;
+
+   if (strcmp(source, "elm.swallow.content")) return NULL;
+   if (!proc) return NULL;
+   if (!ui->ready) return NULL;
+
+   Item_Cache *it = _item_cache_get(ui);
+   if (!it)
+     {
+        puts("BOOM");
+        exit(1);
+     }
+
+   evas_object_geometry_get(ui->btn_pid, NULL, NULL, &w, &h);
+   l = evas_object_data_get(it->obj, "proc_pid");
+   if (l)
+     elm_object_text_set(l, eina_slstr_printf("%d", proc->pid));
+   r = evas_object_data_get(l, "rect");
+   evas_object_size_hint_min_set(r, w, 1);
+
+   evas_object_geometry_get(ui->btn_uid, NULL, NULL, &w, &h);
+   l = evas_object_data_get(it->obj, "proc_uid");
+   if (l)
+     elm_object_text_set(l, eina_slstr_printf("%d", proc->uid));
+   r = evas_object_data_get(l, "rect");
+   evas_object_size_hint_min_set(r, w, 1);
+
+   evas_object_geometry_get(ui->btn_size, NULL, NULL, &w, &h);
+   l = evas_object_data_get(it->obj, "proc_size");
+   if (l)
+     elm_object_text_set(l, eina_slstr_printf("%lu %c ", 
_mem_adjust(ui->data_unit, proc->mem_size >> 10), ui->data_unit));
+   r = evas_object_data_get(l, "rect");
+   evas_object_size_hint_min_set(r, w, 1);
+
+   evas_object_geometry_get(ui->btn_rss, NULL, NULL, &w, &h);
+   l = evas_object_data_get(it->obj, "proc_rss");
+   if (l)
+     elm_object_text_set(l, eina_slstr_printf("%lu %c ", 
_mem_adjust(ui->data_unit, proc->mem_rss >> 10), ui->data_unit));
+   r = evas_object_data_get(l, "rect");
+   evas_object_size_hint_min_set(r, w, 1);
+
+   evas_object_geometry_get(ui->btn_cmd, NULL, NULL, &w, &h);
+   l = evas_object_data_get(it->obj, "proc_cmd");
+   if (l)
+     elm_object_text_set(l, eina_slstr_printf("%s", proc->command));
+   r = evas_object_data_get(l, "rect");
+   evas_object_size_hint_min_set(r, w, 1);
+
+   evas_object_geometry_get(ui->btn_state, NULL, NULL, &w, &h);
+   l = evas_object_data_get(it->obj, "proc_state");
+   if (l)
+     elm_object_text_set(l, eina_slstr_printf("%s", proc->state));
+   r = evas_object_data_get(l, "rect");
+   evas_object_size_hint_min_set(r, w, 1);
+
+   evas_object_geometry_get(ui->btn_cpu_usage, NULL, NULL, &w, &h);
+   l = evas_object_data_get(it->obj, "proc_cpu_usage");
+   if (l)
+     elm_object_text_set(l, eina_slstr_printf("%.1f%%", proc->cpu_usage));
+   r = evas_object_data_get(l, "rect");
+   evas_object_size_hint_min_set(r, w, 1);
+
+   l = evas_object_data_get(it->obj, "long_pid");
+   if (l)
+     elm_object_text_set(l,  ui->long_pid);
+   l = evas_object_data_get(it->obj, "long_uid");
+   if (l)
+     elm_object_text_set(l,  ui->long_uid);
+   l = evas_object_data_get(it->obj, "long_size");
+   if (l)
+     elm_object_text_set(l, ui->long_size);
+   l = evas_object_data_get(it->obj, "long_rss");
+   if (l)
+     elm_object_text_set(l, ui->long_rss);
+   l = evas_object_data_get(it->obj, "long_cmd");
+   if (l)
+     elm_object_text_set(l, ui->long_cmd);
+   l = evas_object_data_get(it->obj, "long_state");
+   if (l)
+     elm_object_text_set(l, ui->long_state);
+   l = evas_object_data_get(it->obj, "long_cpu_usage");
+   if (l)
+     elm_object_text_set(l, ui->long_cpu_usage);
+
+   return it->obj;
+}
+
 static void
 _genlist_ensure_n_items(Evas_Object *genlist, unsigned int items)
 {
@@ -1094,8 +1233,6 @@ _process_list_feedback_cb(void *data, Ecore_Thread 
*thread EINA_UNUSED, void *ms
    list = _list = _list_sort(ui, list);
    EINA_LIST_FREE(list, proc)
      {
-        Proc_Info *prev = elm_object_item_data_get(it);
-        if (prev) { free(prev); }
         elm_object_item_data_set(it, proc);
         elm_genlist_item_update(it);
         it = elm_genlist_item_next_get(it);
@@ -1104,6 +1241,8 @@ _process_list_feedback_cb(void *data, Ecore_Thread 
*thread EINA_UNUSED, void *ms
    if (list)
      eina_list_free(list);
 
+   evas_object_smart_calculate(ui->genlist_procs);
+
    eina_lock_release(&_lock);
 }
 
@@ -1664,7 +1803,6 @@ _ui_tab_system_add(Ui *ui)
    ui->scroller = ui->genlist_procs = plist = elm_genlist_add(parent);
    elm_object_focus_allow_set(plist, EINA_FALSE);
    elm_genlist_homogeneous_set(plist, EINA_TRUE);
-   //elm_genlist_select_mode_set(plist, ELM_OBJECT_SELECT_MODE_NONE);
    evas_object_size_hint_weight_set(plist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(plist, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(plist);
@@ -1680,6 +1818,7 @@ _ui_tab_system_add(Ui *ui)
    evas_object_smart_callback_add(ui->btn_state, "clicked", 
_btn_state_clicked_cb, ui);
    evas_object_smart_callback_add(ui->btn_cpu_usage, "clicked", 
_btn_cpu_usage_clicked_cb, ui);
    evas_object_smart_callback_add(ui->genlist_procs, "selected", 
_item_pid_clicked_cb, ui);
+   evas_object_smart_callback_add(ui->genlist_procs, "unrealized", 
_item_unrealized_cb, ui);
 }
 
 static void
@@ -2673,6 +2812,7 @@ _ui_init(Evas_Object *parent)
    _ui_tab_disk_add(ui);
    _ui_tab_misc_add(ui);
 
+   _item_cache_init(ui);
    _column_expand_init(ui);
 
    return ui;
diff --git a/src/bin/ui.h b/src/bin/ui.h
index a734138..c76f78a 100644
--- a/src/bin/ui.h
+++ b/src/bin/ui.h
@@ -106,7 +106,7 @@ typedef struct Ui
    char         *long_rss;
    char         *long_cmd;
    char         *long_state;
-   char         *long_cpu;
+   char         *long_cpu_usage;
 
    Evas_Object  *genlist_procs;
 

-- 


Reply via email to