netstar pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=44abec8710eae1f060f40502b3c2bec927eb31bc
commit 44abec8710eae1f060f40502b3c2bec927eb31bc Author: Alastair Poole <nets...@gmail.com> Date: Sat Mar 6 11:08:26 2021 +0000 procstats: use widget known to the theme. Something *could* be made much prettier but this always, afaiu, needs to use a swallow. --- src/modules/procstats/e_mod_main.c | 135 ++++++++++++++++++++++++++++++------- 1 file changed, 111 insertions(+), 24 deletions(-) diff --git a/src/modules/procstats/e_mod_main.c b/src/modules/procstats/e_mod_main.c index c58eaaa9d..b9d967713 100644 --- a/src/modules/procstats/e_mod_main.c +++ b/src/modules/procstats/e_mod_main.c @@ -1,6 +1,12 @@ #include <e.h> #include "process.h" +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) +# include <sys/types.h> +# include <sys/sysctl.h> +#endif + +static int64_t _mem_total; static Eina_List *_clients = NULL; static Ecore_Timer *_clients_timer = NULL; @@ -11,12 +17,41 @@ struct _Proc_Stats { E_Client *client; Evas_Object *obj; + Evas_Object *obj_swallow; pid_t pid; uint64_t mem_size; uint64_t cpu_time; uint64_t cpu_time_prev; }; +static void +_memory_total(void) +{ +#if defined(__linux__) + char line[256]; + FILE *f = fopen("/proc/meminfo", "r"); + if (!f) return; + + while (fgets(line, sizeof(line), f) != NULL) + { + if (!strncmp("MemTotal:", line, 9)) + { + char *p, *t; + p = strchr(line, ':') + 1; + while (isspace(*p)) p++; + t = strtok(p, " "); + _mem_total = atoll(t) * 1024; + break; + } + } + fclose(f); +#else + size_t len = sizeof(_mem_total); + int mib[5] = { CTL_HW, HW_PHYSMEM, 0, 0, 0 }; + sysctl(mib, 2, &_mem_total, &len, NULL, 0); +#endif +} + static Eina_Bool _proc_stats_item_exists(E_Client *ec) { @@ -31,14 +66,24 @@ _proc_stats_item_exists(E_Client *ec) } static void -_proc_stats_client_del_cb(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +_proc_stats_item_del(Proc_Stats *item) +{ + edje_object_signal_emit(item->obj, "e,state,procstats,off", "e"); + evas_object_del(item->obj_swallow); + free(item); +} + +static void +_proc_stats_client_del_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - edje_object_signal_emit(obj, "e,state,procstats,off", "e"); + Proc_Stats *item = data; + _proc_stats_item_del(item); } static void _proc_stats_item_add(E_Client *ec) { + Evas_Object *tb, *pb; Evas_Object *o; Proc_Stats *item; @@ -51,25 +96,38 @@ _proc_stats_item_add(E_Client *ec) e_theme_edje_object_set(o, "base/theme/borders", "e/widgets/border/default/border"); - if (!edje_object_part_exists(o, "e.procstats.text")) return; + if (!edje_object_part_exists(o, "e.procstats.swallow")) return; + + tb = elm_table_add(e_comp->elm); + evas_object_show(tb); + + pb = elm_progressbar_add(e_comp->elm); + elm_progressbar_span_size_set(pb, 60); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(pb); + elm_table_pack(tb, pb, 0, 0, 1, 1); + evas_object_data_set(tb, "pb_cpu", pb); + + pb = elm_progressbar_add(e_comp->elm); + elm_progressbar_span_size_set(pb, 100); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(pb); + elm_table_pack(tb, pb, 1, 0, 1, 1); + evas_object_data_set(tb, "pb_mem", pb); item = calloc(1, sizeof(Proc_Stats)); EINA_SAFETY_ON_NULL_RETURN(item); item->pid = ec->netwm.pid; item->client = ec; item->obj = ec->frame_object; + item->obj_swallow = tb; - edje_object_signal_emit(item->obj, "e,state,procstats,on", "e"); - evas_object_event_callback_add(item->obj, EVAS_CALLBACK_DEL, _proc_stats_client_del_cb, NULL); + edje_object_part_swallow(ec->frame_object, "e.procstats.swallow", tb); + edje_object_signal_emit(ec->frame_object, "e,state,procstats,on", "e"); - _clients = eina_list_append(_clients, item); -} + evas_object_event_callback_add(item->obj, EVAS_CALLBACK_DEL, _proc_stats_client_del_cb, item); -static void -_proc_stats_item_del(Proc_Stats *item) -{ - edje_object_signal_emit(item->obj, "e,state,procstats,off", "e"); - free(item); + _clients = eina_list_append(_clients, item); } static void @@ -118,27 +176,55 @@ _proc_stats_item_children_update(Eina_List *children, Proc_Stats *item) } } +static const char * +_size_format(unsigned long long bytes) +{ + const char *units = "BKMGTPEZY"; + unsigned long powi = 1; + unsigned long long value; + unsigned int precision = 2, powj = 1; + + value = bytes; + while (value > 1024) + { + if ((value / 1024) < powi) break; + powi *= 1024; + ++units; + if (units[1] == '\0') break; + } + if (*units == 'B') precision = 0; + while (precision > 0) + { + powj *= 10; + if ((value / powi) < powj) break; + --precision; + } + return eina_slstr_printf("%1.*f%c", precision, (double) value / powi, *units); +} + static void _proc_stats_item_display(Proc_Stats *item) { - Edje_Message_Int_Set *msg; - int mem_size; + Evas_Object *pb; + double val = 0.0; if (item->cpu_time_prev > item->cpu_time) return; if (!item->cpu_time_prev) item->cpu_time_prev = item->cpu_time; - mem_size = item->mem_size >> 10; - msg = malloc(sizeof(Edje_Message_Int_Set) + (sizeof(int) * 3)); - EINA_SAFETY_ON_NULL_RETURN(msg); - msg->count = 4; - msg->val[0] = eina_cpu_count(); - msg->val[1] = (item->cpu_time - item->cpu_time_prev) / _TIMER_FREQ; - msg->val[2] = mem_size; - msg->val[3] = 0; - edje_object_message_send(item->obj, EDJE_MESSAGE_INT_SET, 1, msg); - free(msg); + pb = evas_object_data_get(item->obj_swallow, "pb_cpu"); + + val = (item->cpu_time - item->cpu_time_prev) / _TIMER_FREQ; + elm_progressbar_value_set(pb, val / 100.0); + elm_object_part_text_set(pb, "elm.text.status", eina_slstr_printf("%1.0f %%", val)); + + pb = evas_object_data_get(item->obj_swallow, "pb_mem"); + val = item->mem_size / (_mem_total / 100.0); + elm_progressbar_value_set(pb, val / 100.0); + elm_object_part_text_set(pb, "elm.text.status", + eina_slstr_printf("%s/%s", _size_format(item->mem_size), + _size_format(_mem_total))); } static void @@ -201,6 +287,7 @@ E_API E_Module_Api e_modapi = E_API int e_modapi_init(E_Module *m EINA_UNUSED) { + _memory_total(); _proc_stats_timer_cb(NULL); _clients_timer = ecore_timer_add(_TIMER_FREQ, _proc_stats_timer_cb, NULL); --