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 9d85f90f1878d1e6335725fa99e620b3fb023573
Author: Alastair Poole <[email protected]>
AuthorDate: Sat Mar 28 01:32:03 2026 +0000
API: The API of my dreams!
Thank you Jesus.
---
src/bin/evisum_ui_widget_example2.c | 426 ++++++++++++++++++++++++++++++++++++
src/bin/meson.build | 9 +
src/bin/ui/evisum_ui_widget_exel.c | 23 +-
3 files changed, 455 insertions(+), 3 deletions(-)
diff --git a/src/bin/evisum_ui_widget_example2.c b/src/bin/evisum_ui_widget_example2.c
new file mode 100644
index 0000000..6aa1563
--- /dev/null
+++ b/src/bin/evisum_ui_widget_example2.c
@@ -0,0 +1,426 @@
+#include <Elementary.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "ui/evisum_ui_widget_exel.h"
+
+typedef enum {
+ EX2_FIELD_AINT = 0,
+ EX2_FIELD_NOBODY,
+ EX2_FIELD_GOT,
+ EX2_FIELD_TIME,
+ EX2_FIELD_FOR,
+ EX2_FIELD_THAT,
+ EX2_FIELD_MAX
+} Example2_Field;
+
+typedef struct {
+ int index;
+ int base_pid;
+ unsigned long long base_mem_kib;
+ int pid;
+ unsigned long long mem_kib;
+ double cpu_usage;
+ char name[32];
+ char tag[32];
+} Example2_Row;
+
+typedef struct {
+ Evisum_Ui_Widget_Exel *wx;
+ Ecore_Timer *timer;
+ unsigned int tick;
+ int sort_field;
+ Eina_Bool sort_reverse;
+} Example2_App;
+
+static int
+_row_compare(const Example2_Row *a, const Example2_Row *b, int field_id) {
+ switch (field_id) {
+ case EX2_FIELD_AINT:
+ if (a->pid < b->pid) return -1;
+ if (a->pid > b->pid) return 1;
+ return 0;
+ case EX2_FIELD_NOBODY:
+ return strcmp(a->name, b->name);
+ case EX2_FIELD_GOT:
+ if (a->mem_kib < b->mem_kib) return -1;
+ if (a->mem_kib > b->mem_kib) return 1;
+ return 0;
+ case EX2_FIELD_TIME:
+ if (a->cpu_usage < b->cpu_usage) return -1;
+ if (a->cpu_usage > b->cpu_usage) return 1;
+ return 0;
+ case EX2_FIELD_FOR:
+ return strcmp(a->tag, b->tag);
+ case EX2_FIELD_THAT:
+ default:
+ if (a->index < b->index) return -1;
+ if (a->index > b->index) return 1;
+ return 0;
+ }
+}
+
+static void
+_rows_sort_apply(Example2_App *app) {
+ Example2_Row *rows[40];
+ Elm_Object_Item *it;
+ int count = 0;
+
+ if (!app || !app->wx) return;
+
+ it = evisum_ui_widget_exel_genlist_first_item_get(app->wx);
+ while (it && count < 40) {
+ rows[count++] = evisum_ui_widget_exel_object_item_data_get(it);
+ it = evisum_ui_widget_exel_genlist_item_next_get(it);
+ }
+
+ for (int i = 1; i < count; i++) {
+ Example2_Row *key = rows[i];
+ int j = i - 1;
+ while (j >= 0) {
+ int cmp = _row_compare(rows[j], key, app->sort_field);
+ if (app->sort_reverse) cmp = -cmp;
+ if (cmp <= 0) break;
+ rows[j + 1] = rows[j];
+ j--;
+ }
+ rows[j + 1] = key;
+ }
+
+ it = evisum_ui_widget_exel_genlist_first_item_get(app->wx);
+ for (int i = 0; i < count && it; i++) {
+ evisum_ui_widget_exel_object_item_data_set(it, rows[i]);
+ evisum_ui_widget_exel_genlist_item_update(it);
+ it = evisum_ui_widget_exel_genlist_item_next_get(it);
+ }
+}
+
+static void
+_field_sort_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) {
+ Example2_App *app = data;
+ int field_id;
+
+ if (!app || !obj) return;
+
+ field_id = (int) (intptr_t) evas_object_data_get(obj, "field_id");
+ if (field_id < EX2_FIELD_AINT || field_id >= EX2_FIELD_MAX) return;
+
+ if (app->sort_field == field_id) app->sort_reverse = !app->sort_reverse;
+ else {
+ app->sort_field = field_id;
+ app->sort_reverse = EINA_FALSE;
+ }
+
+ evisum_ui_widget_exel_sort_header_button_state_set(obj, app->sort_reverse);
+ _rows_sort_apply(app);
+}
+
+static Example2_Row *
+_row_new(int index) {
+ Example2_Row *row;
+
+ row = calloc(1, sizeof(Example2_Row));
+ if (!row) return NULL;
+
+ row->index = index;
+ row->base_pid = 1200 + (index * 3);
+ row->base_mem_kib = 256000ULL + ((unsigned long long) index * 8192ULL);
+ row->pid = row->base_pid;
+ row->mem_kib = row->base_mem_kib;
+ row->cpu_usage = (double) ((index * 7) % 100);
+ snprintf(row->name, sizeof(row->name), "task-%02d", index + 1);
+ snprintf(row->tag, sizeof(row->tag), "slot-%02d", index + 1);
+
+ return row;
+}
+
+static void
+_row_free(Example2_Row *row) {
+ if (!row) return;
+ free(row);
+}
+
+static void
+_item_del(void *data, Evas_Object *obj EINA_UNUSED) {
+ _row_free(data);
+}
+
+static Evas_Object *
+_content_get(void *data, Evas_Object *obj, const char *source) {
+ Example2_Row *row = data;
+ Evisum_Ui_Widget_Exel *wx;
+ Evas_Object *item;
+ char buf[64];
+
+ if (strcmp(source, "elm.swallow.content")) return NULL;
+ if (!row) return NULL;
+
+ wx = evas_object_data_get(obj, "widget_exel");
+ if (!wx) return NULL;
+
+ item = evisum_ui_widget_exel_item_cache_object_get(wx);
+ if (!item) return NULL;
+
+ snprintf(buf, sizeof(buf), "%d", row->pid);
+ evisum_ui_widget_exel_item_field_text_set(wx, item, EX2_FIELD_AINT, "aint", buf);
+
+ evisum_ui_widget_exel_item_field_text_set(wx, item, EX2_FIELD_NOBODY, "nobody", row->name);
+
+ snprintf(buf, sizeof(buf), "%llu MiB", row->mem_kib / 1024ULL);
+ evisum_ui_widget_exel_item_field_text_set(wx, item, EX2_FIELD_GOT, "got", buf);
+
+ snprintf(buf, sizeof(buf), "%1.1f %%", row->cpu_usage);
+ evisum_ui_widget_exel_item_field_progress_set(wx, item, EX2_FIELD_TIME, "time", row->cpu_usage / 100.0, buf);
+
+ evisum_ui_widget_exel_item_field_text_set(wx, item, EX2_FIELD_FOR, "for", row->tag);
+
+ snprintf(buf, sizeof(buf), "row-%02d", row->index + 1);
+ evisum_ui_widget_exel_item_field_text_set(wx, item, EX2_FIELD_THAT, "that", buf);
+
+ return item;
+}
+
+static Eina_Bool
+_update_timer_cb(void *data) {
+ Example2_App *app = data;
+ Elm_Object_Item *it;
+ unsigned int tick;
+
+ if (!app || !app->wx) return ECORE_CALLBACK_CANCEL;
+
+ app->tick++;
+ tick = app->tick;
+ it = evisum_ui_widget_exel_genlist_first_item_get(app->wx);
+
+ while (it) {
+ Example2_Row *row = evisum_ui_widget_exel_object_item_data_get(it);
+
+ if (row) {
+ row->pid = row->base_pid + (int) ((tick + (unsigned int) row->index) % 20);
+ row->mem_kib = row->base_mem_kib + (((tick * 37U) + ((unsigned int) row->index * 59U)) % 32768U);
+ row->cpu_usage = (double) (((tick * 9U) + ((unsigned int) row->index * 13U)) % 100U);
+ snprintf(row->tag, sizeof(row->tag), "slot-%02u", ((tick + (unsigned int) row->index) % 40U) + 1U);
+ }
+
+ evisum_ui_widget_exel_genlist_item_update(it);
+ it = evisum_ui_widget_exel_genlist_item_next_get(it);
+ }
+
+ _rows_sort_apply(app);
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_fill_rows(Example2_App *app, Elm_Genlist_Item_Class *itc) {
+ Elm_Object_Item *it;
+ Evisum_Ui_Widget_Exel *wx;
+
+ if (!app || !app->wx) return;
+ wx = app->wx;
+
+ evisum_ui_widget_exel_genlist_items_ensure(wx, 40, itc);
+ it = evisum_ui_widget_exel_genlist_first_item_get(wx);
+
+ for (int i = 0; i < 40 && it; i++) {
+ Example2_Row *old;
+ Example2_Row *row;
+
+ old = evisum_ui_widget_exel_object_item_data_get(it);
+ if (old) _row_free(old);
+
+ row = _row_new(i);
+ evisum_ui_widget_exel_object_item_data_set(it, row);
+ evisum_ui_widget_exel_genlist_item_update(it);
+ it = evisum_ui_widget_exel_genlist_item_next_get(it);
+ }
+
+ _rows_sort_apply(app);
+}
+
+static void
+_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) {
+ Example2_App *app;
+
+ app = evas_object_data_get(obj, "app");
+ if (!app) {
+ elm_exit();
+ return;
+ }
+
+ if (app->timer) ecore_timer_del(app->timer);
+
+ if (app->wx) {
+ evisum_ui_widget_exel_genlist_clear(app->wx);
+ evisum_ui_widget_exel_free(app->wx);
+ }
+
+ free(app);
+ elm_exit();
+}
+
+EAPI_MAIN int
+elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) {
+ Evas_Object *win, *root;
+ Example2_App *app;
+ Evisum_Ui_Widget_Exel_Field_Params fp;
+ Elm_Genlist_Item_Class itc;
+
+ memset(&itc, 0, sizeof(itc));
+
+ win = elm_win_util_standard_add("evisum_test2", "Widget Example 2");
+ elm_win_autodel_set(win, EINA_TRUE);
+ evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _win_del_cb, NULL);
+
+ app = calloc(1, sizeof(Example2_App));
+ if (!app) return EXIT_FAILURE;
+
+ app->wx = evisum_ui_widget_exel_create(win);
+ if (!app->wx) {
+ free(app);
+ return EXIT_FAILURE;
+ }
+
+ evas_object_data_set(win, "app", app);
+ app->sort_field = EX2_FIELD_AINT;
+ app->sort_reverse = EINA_FALSE;
+
+ root = evisum_ui_widget_exel_object_get(app->wx);
+ elm_win_resize_object_add(win, root);
+
+ fp = (Evisum_Ui_Widget_Exel_Field_Params) {
+ .id = EX2_FIELD_AINT,
+ .title = "aint",
+ .desc = "Aint",
+ .key = "aint",
+ .type = EVISUM_UI_WIDGET_EXEL_ITEM_CELL_TEXT,
+ .align_x = 1.0,
+ .weight_x = EVAS_HINT_EXPAND,
+ .boxed = EINA_TRUE,
+ .spacer = 6,
+ .default_width = 90,
+ .min_width = 60,
+ .always_visible = EINA_TRUE,
+ .reverse = EINA_FALSE,
+ .clicked_cb = _field_sort_clicked_cb,
+ .clicked_data = app,
+ };
+ evisum_ui_widget_exel_field_add(app->wx, &fp);
+
+ fp = (Evisum_Ui_Widget_Exel_Field_Params) {
+ .id = EX2_FIELD_NOBODY,
+ .title = "nobody",
+ .desc = "Nobody",
+ .key = "nobody",
+ .type = EVISUM_UI_WIDGET_EXEL_ITEM_CELL_TEXT,
+ .align_x = 0.0,
+ .weight_x = EVAS_HINT_EXPAND,
+ .boxed = EINA_TRUE,
+ .spacer = 6,
+ .default_width = 140,
+ .min_width = 90,
+ .always_visible = EINA_TRUE,
+ .reverse = EINA_FALSE,
+ .clicked_cb = _field_sort_clicked_cb,
+ .clicked_data = app,
+ };
+ evisum_ui_widget_exel_field_add(app->wx, &fp);
+
+ fp = (Evisum_Ui_Widget_Exel_Field_Params) {
+ .id = EX2_FIELD_GOT,
+ .title = "got",
+ .desc = "Got",
+ .key = "got",
+ .type = EVISUM_UI_WIDGET_EXEL_ITEM_CELL_TEXT,
+ .align_x = 1.0,
+ .weight_x = EVAS_HINT_EXPAND,
+ .boxed = EINA_TRUE,
+ .spacer = 6,
+ .default_width = 110,
+ .min_width = 80,
+ .always_visible = EINA_TRUE,
+ .reverse = EINA_FALSE,
+ .clicked_cb = _field_sort_clicked_cb,
+ .clicked_data = app,
+ };
+ evisum_ui_widget_exel_field_add(app->wx, &fp);
+
+ fp = (Evisum_Ui_Widget_Exel_Field_Params) {
+ .id = EX2_FIELD_TIME,
+ .title = "time",
+ .desc = "Time",
+ .key = "time",
+ .unit_format = "%1.1f %%",
+ .type = EVISUM_UI_WIDGET_EXEL_ITEM_CELL_PROGRESS,
+ .align_x = EVAS_HINT_FILL,
+ .weight_x = EVAS_HINT_EXPAND,
+ .boxed = EINA_FALSE,
+ .default_width = 130,
+ .min_width = 90,
+ .always_visible = EINA_TRUE,
+ .reverse = EINA_FALSE,
+ .clicked_cb = _field_sort_clicked_cb,
+ .clicked_data = app,
+ };
+ evisum_ui_widget_exel_field_add(app->wx, &fp);
+
+ fp = (Evisum_Ui_Widget_Exel_Field_Params) {
+ .id = EX2_FIELD_FOR,
+ .title = "for",
+ .desc = "For",
+ .key = "for",
+ .type = EVISUM_UI_WIDGET_EXEL_ITEM_CELL_TEXT,
+ .align_x = 0.0,
+ .weight_x = EVAS_HINT_EXPAND,
+ .boxed = EINA_TRUE,
+ .spacer = 6,
+ .default_width = 100,
+ .min_width = 80,
+ .always_visible = EINA_TRUE,
+ .reverse = EINA_FALSE,
+ .clicked_cb = _field_sort_clicked_cb,
+ .clicked_data = app,
+ };
+ evisum_ui_widget_exel_field_add(app->wx, &fp);
+
+ fp = (Evisum_Ui_Widget_Exel_Field_Params) {
+ .id = EX2_FIELD_THAT,
+ .title = "that",
+ .desc = "That",
+ .key = "that",
+ .type = EVISUM_UI_WIDGET_EXEL_ITEM_CELL_TEXT,
+ .align_x = 0.0,
+ .weight_x = EVAS_HINT_EXPAND,
+ .boxed = EINA_TRUE,
+ .spacer = 6,
+ .default_width = 90,
+ .min_width = 70,
+ .always_visible = EINA_TRUE,
+ .reverse = EINA_FALSE,
+ .clicked_cb = _field_sort_clicked_cb,
+ .clicked_data = app,
+ };
+ evisum_ui_widget_exel_field_add(app->wx, &fp);
+
+ evisum_ui_widget_exel_fields_apply(app->wx);
+
+ elm_box_pack_end(root, evisum_ui_widget_exel_genlist_add(app->wx, root));
+
+ 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;
+
+ _fill_rows(app, &itc);
+ app->timer = ecore_timer_add(1.0, _update_timer_cb, app);
+
+ evas_object_resize(win, 860, 420);
+ evas_object_show(win);
+ elm_run();
+
+ return EXIT_SUCCESS;
+}
+ELM_MAIN()
diff --git a/src/bin/meson.build b/src/bin/meson.build
index e19a7d3..aa4ee30 100644
--- a/src/bin/meson.build
+++ b/src/bin/meson.build
@@ -15,6 +15,15 @@ executable('evisum_test', src + files([
dependencies : [ deps, deps_os, deps_nls ],
install : false)
+executable('evisum_test2', src + files([
+ 'evisum_ui_widget_example2.c',
+ 'evisum_config.c',
+ 'evisum_server.c',
+]),
+ include_directories : inc,
+ dependencies : [ deps, deps_os, deps_nls ],
+ install : false)
+
src += files([
'main.c',
'evisum_config.c',
diff --git a/src/bin/ui/evisum_ui_widget_exel.c b/src/bin/ui/evisum_ui_widget_exel.c
index 5b145fa..3b4079a 100644
--- a/src/bin/ui/evisum_ui_widget_exel.c
+++ b/src/bin/ui/evisum_ui_widget_exel.c
@@ -894,7 +894,7 @@ evisum_ui_widget_exel_item_row_add(Evas_Object *parent, const Evisum_Ui_Widget_E
Evas_Object *
evisum_ui_widget_exel_item_cmd_column_add(Evas_Object *tb, const char *icon_key, const char *label_key, int col,
int icon_size, int spacer) {
- Evas_Object *hbx, *ic, *lb, *rec;
+ Evas_Object *hbx, *ibox, *ic, *lb, *rec;
if (!tb || !icon_key || !label_key) return NULL;
@@ -903,13 +903,30 @@ evisum_ui_widget_exel_item_cmd_column_add(Evas_Object *tb, const char *icon_key,
evas_object_size_hint_align_set(hbx, 0.0, FILL);
evas_object_size_hint_weight_set(hbx, EXPAND, 0);
+ ibox = elm_table_add(tb);
+ evas_object_size_hint_weight_set(ibox, 0.0, 0.0);
+ evas_object_size_hint_align_set(ibox, 0.5, 0.5);
+ evas_object_size_hint_min_set(ibox, ELM_SCALE_SIZE(icon_size), ELM_SCALE_SIZE(icon_size));
+ evas_object_size_hint_max_set(ibox, ELM_SCALE_SIZE(icon_size), ELM_SCALE_SIZE(icon_size));
+ elm_box_pack_end(hbx, ibox);
+ evas_object_show(ibox);
+
+ /* Always keep a fixed icon slot so rows stay aligned when icon content is missing. */
+ rec = evas_object_rectangle_add(evas_object_evas_get(tb));
+ evas_object_color_set(rec, 64, 64, 64, 32);
+ evas_object_size_hint_weight_set(rec, EXPAND, EXPAND);
+ evas_object_size_hint_align_set(rec, FILL, FILL);
+ elm_table_pack(ibox, rec, 0, 0, 1, 1);
+ evas_object_show(rec);
+
ic = elm_icon_add(tb);
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
evas_object_size_hint_align_set(ic, FILL, FILL);
+ evas_object_size_hint_weight_set(ic, EXPAND, EXPAND);
evas_object_size_hint_min_set(ic, ELM_SCALE_SIZE(icon_size), ELM_SCALE_SIZE(icon_size));
evas_object_size_hint_max_set(ic, ELM_SCALE_SIZE(icon_size), ELM_SCALE_SIZE(icon_size));
evas_object_data_set(tb, icon_key, ic);
- elm_box_pack_end(hbx, ic);
+ elm_table_pack(ibox, ic, 0, 0, 1, 1);
evas_object_show(ic);
rec = evas_object_rectangle_add(evas_object_evas_get(tb));
@@ -943,7 +960,7 @@ evisum_ui_widget_exel_item_progress_column_add(Evas_Object *tb, const char *key,
evas_object_size_hint_align_set(hbx, FILL, FILL);
pb = elm_progressbar_add(hbx);
- evas_object_size_hint_weight_set(pb, 0, EXPAND);
+ evas_object_size_hint_weight_set(pb, EXPAND, EXPAND);
evas_object_size_hint_align_set(pb, FILL, FILL);
if (unit_format) elm_progressbar_unit_format_set(pb, unit_format);
elm_box_pack_end(hbx, pb);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.