From 27994ed2cbff5e0ce7344b4e50add1c9b20bcb19 Mon Sep 17 00:00:00 2001 From: Alastair Poole Date: Wed, 3 Feb 2021 08:03:55 +0000 Subject: [PATCH] procs: time --- src/bin/system/process.c | 2 + src/bin/ui/ui_process_list.c | 84 ++++++++++++++++++++++++++++++++++-- src/bin/ui/ui_process_list.h | 1 + src/bin/ui/ui_process_view.c | 3 +- 4 files changed, 86 insertions(+), 4 deletions(-) diff --git a/src/bin/system/process.c b/src/bin/system/process.c index 8e90688..b7115d7 100644 --- a/src/bin/system/process.c +++ b/src/bin/system/process.c @@ -1043,6 +1043,8 @@ proc_info_by_pid(int pid) Proc_Info *p = NULL; + // XXX: run_time does not include interrupts. + for (int i = 0; i < pid_count; i++) { if (kps[i].ki_flag & P_KPROC && !proc_info_kthreads_show_get()) diff --git a/src/bin/ui/ui_process_list.c b/src/bin/ui/ui_process_list.c index fd8a75a..1b7dc66 100644 --- a/src/bin/ui/ui_process_list.c +++ b/src/bin/ui/ui_process_list.c @@ -64,9 +64,10 @@ typedef struct Evas_Object *btn_nice; Evas_Object *btn_size; Evas_Object *btn_rss; - Evas_Object *btn_state; Evas_Object *btn_threads; Evas_Object *btn_cpu_n; + Evas_Object *btn_time; + Evas_Object *btn_state; Evas_Object *btn_cpu_usage; } Ui_Data; @@ -176,6 +177,25 @@ _sort_by_rss(const void *p1, const void *p2) return 0; } +static int +_sort_by_time(const void *p1, const void *p2) +{ + const Proc_Info *inf1, *inf2; + int64_t t1, t2; + + inf1 = p1; inf2 = p2; + + t1 = inf1->run_time; + t2 = inf2->run_time; + + if (t1 > t2) + return 1; + if (t1 < t2) + return -1; + + return 0; +} + static int _sort_by_cpu_usage(const void *p1, const void *p2) { @@ -338,8 +358,14 @@ _item_create(Evas_Object *obj) evas_object_size_hint_align_set(lb, 1.0, FILL); lb = _item_column_add(tbl, "proc_cpuid", i++); evas_object_size_hint_align_set(lb, 1.0, FILL); + lb = _item_column_add(tbl, "proc_time", i++); + evas_object_size_hint_align_set(lb, 1.0, FILL); lb = _item_column_add(tbl, "proc_state", i++); - evas_object_size_hint_align_set(lb, 0.5, FILL); + evas_object_size_hint_align_set(lb, 1.0, FILL); + rec = evas_object_rectangle_add(evas_object_evas_get(obj)); + evas_object_size_hint_min_set(rec, 4, 1); + evas_object_size_hint_max_set(rec, 4, -1); + elm_table_pack(tbl, rec, i++, 0, 1, 1); pb = elm_progressbar_add(hbx); evas_object_size_hint_weight_set(pb, EXPAND, EXPAND); @@ -356,6 +382,20 @@ _item_create(Evas_Object *obj) return tbl; } +static void +_run_time_set(char *buf, size_t n, int64_t secs) +{ + int rem; + + if (secs < 86400) + snprintf(buf, n, "%02ld:%02ld", secs / 60, secs % 60); + else + { + rem = secs % 3600; + snprintf(buf, n, "%02ld:%02d:%02d", secs / 3600, rem / 60, rem % 60); + } +} + static Evas_Object * _content_get(void *data, Evas_Object *obj, const char *source) { @@ -506,6 +546,17 @@ _content_get(void *data, Evas_Object *obj, const char *source) evas_object_size_hint_min_set(rec, w, 1); evas_object_show(lb); + evas_object_geometry_get(pd->btn_time, NULL, NULL, &w, NULL); + lb = evas_object_data_get(it->obj, "proc_time"); + + _run_time_set(buf, sizeof(buf), proc->run_time); + if (strcmp(buf, elm_object_text_get(lb))) + elm_object_text_set(lb, buf); + rec = evas_object_data_get(lb, "rec"); + evas_object_size_hint_min_set(rec, w, 1); + evas_object_show(lb); + + pb = evas_object_data_get(it->obj, "proc_cpu_usage"); evas_object_geometry_get(pd->btn_state, NULL, NULL, &w, NULL); lb = evas_object_data_get(it->obj, "proc_state"); snprintf(buf, sizeof(buf), "%s", proc->state); @@ -947,6 +998,19 @@ _btn_threads_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, _btn_clicked_state_save(pd, pd->btn_threads); } +static void +_btn_time_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ui_Data *pd = data; + Ui *ui = pd->ui; + + if (ui->proc.sort_type == SORT_BY_TIME) + ui->proc.sort_reverse = !ui->proc.sort_reverse; + ui->proc.sort_type = SORT_BY_TIME; + _btn_clicked_state_save(pd, pd->btn_state); +} + static void _btn_state_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1370,6 +1434,19 @@ _ui_content_system_add(Ui_Data *pd, Evas_Object *parent) evas_object_smart_callback_add(btn, "clicked", _btn_cpu_clicked_cb, pd); + pd->btn_time = btn = elm_button_add(parent); + _btn_icon_state_init(btn, + (ui->proc.sort_type == SORT_BY_CPU ? + ui->proc.sort_reverse : 0), + ui->proc.sort_type == SORT_BY_CPU); + evas_object_size_hint_weight_set(btn, 0, 0); + evas_object_size_hint_align_set(btn, FILL, FILL); + elm_object_text_set(btn, _("time")); + evas_object_show(btn); + elm_table_pack(tbl, btn, i++, 1, 1, 1); + evas_object_smart_callback_add(btn, "clicked", + _btn_time_clicked_cb, pd); + pd->btn_state = btn = elm_button_add(parent); _btn_icon_state_init(btn, (ui->proc.sort_type == SORT_BY_STATE ? @@ -1526,7 +1603,7 @@ _win_key_down_search(Ui_Data *pd, Evas_Event_Key_Down *ev) if (!strcmp(ev->keyname, "Escape")) { elm_object_text_set(pd->search_entry, ""); - _search_clear(pd); + _search_clear(pd); pd->skip_wait = 0; elm_object_focus_allow_set(pd->search_entry, 0); evas_object_lower(pd->search_pop); @@ -1713,6 +1790,7 @@ _init(Ui_Data *pd) pd->sorters[SORT_BY_RSS].sort_cb = _sort_by_rss; pd->sorters[SORT_BY_CMD].sort_cb = _sort_by_cmd; pd->sorters[SORT_BY_STATE].sort_cb = _sort_by_state; + pd->sorters[SORT_BY_TIME].sort_cb = _sort_by_time; pd->sorters[SORT_BY_CPU_USAGE].sort_cb = _sort_by_cpu_usage; } diff --git a/src/bin/ui/ui_process_list.h b/src/bin/ui/ui_process_list.h index f3328ad..d9d08bf 100644 --- a/src/bin/ui/ui_process_list.h +++ b/src/bin/ui/ui_process_list.h @@ -15,6 +15,7 @@ typedef enum SORT_BY_SIZE, SORT_BY_RSS, SORT_BY_CMD, + SORT_BY_TIME, SORT_BY_STATE, SORT_BY_CPU_USAGE, diff --git a/src/bin/ui/ui_process_view.c b/src/bin/ui/ui_process_view.c index 28c63fd..3ce80ea 100644 --- a/src/bin/ui/ui_process_view.c +++ b/src/bin/ui/ui_process_view.c @@ -802,7 +802,8 @@ static char * _run_time_string(int64_t secs) { char buf[256]; - snprintf(buf, sizeof(buf), "%ld:%02ld", secs / 60, secs % 60); + int s = secs % 3600; + snprintf(buf, sizeof(buf), "%02ld:%02d:%02d", secs / 3600, s / 60, s % 60); return strdup(buf); }