diff --git a/src/ui.c b/src/ui.c index dff18d0..65d89fa 100644 --- a/src/ui.c +++ b/src/ui.c @@ -18,6 +18,8 @@ static long _memory_used = 0; static void _disk_view_update(Ui *ui); static void _extra_view_update(Ui *ui, results_t *results); +static void _cpu_view_update(Ui *ui, results_t *results); +static void _memory_view_update(Ui *ui, results_t *results); static void _system_stats_thread(void *data, Ecore_Thread *thread) @@ -51,9 +53,14 @@ _system_stats_thread_feedback_cb(void *data, Ecore_Thread *thread, void *msg) double cpu_usage = 0.0; int i; + if (ecore_thread_check(thread)) + return; + ui = data; results = msg; + _cpu_view_update(ui, results); + _memory_view_update(ui, results); _disk_view_update(ui); _extra_view_update(ui, results); @@ -947,19 +954,17 @@ _progress_outgoing_format_free_cb(char *str) } static void -_extra_view_update(Ui *ui, results_t *results) +_cpu_view_update(Ui *ui, results_t *results) { Evas_Object *box, *frame, *progress; int i; - if (!ui->extra_visible) + if (!ui->cpu_visible) return; - _results = results; + elm_box_clear(ui->cpu_activity); - elm_box_clear(ui->extra_activity); - - box = elm_box_add(ui->disk_activity); + box = elm_box_add(ui->content); evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(box); @@ -988,6 +993,114 @@ _extra_view_update(Ui *ui, results_t *results) elm_box_pack_end(box, frame); } + elm_box_pack_end(ui->cpu_activity, box); +} + +static void +_memory_view_update(Ui *ui, results_t *results) +{ + Evas_Object *box, *frame, *progress; + double ratio, value; + + if (!ui->mem_visible) + return; + + elm_box_clear(ui->mem_activity); + + box = elm_box_add(ui->content); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(box); + + frame = elm_frame_add(box); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(frame, "Memory Used"); + evas_object_show(frame); + progress = elm_progressbar_add(frame); + evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_span_size_set(progress, 1.0); + elm_progressbar_unit_format_set(progress, eina_slstr_printf("%lu M / %lu M", results->memory.used, results->memory.total)); + ratio = results->memory.total / 100.0; + value = results->memory.used / ratio; + elm_progressbar_value_set(progress, value / 100); + evas_object_show(progress); + elm_object_content_set(frame, progress); + elm_box_pack_end(box, frame); + + frame = elm_frame_add(box); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(frame, "Memory Cached"); + evas_object_show(frame); + progress = elm_progressbar_add(frame); + evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_span_size_set(progress, 1.0); + elm_progressbar_unit_format_set(progress, eina_slstr_printf("%lu M / %lu M", results->memory.cached, results->memory.total)); + ratio = results->memory.total / 100.0; + value = results->memory.cached / ratio; + elm_progressbar_value_set(progress, value / 100); + evas_object_show(progress); + elm_object_content_set(frame, progress); + elm_box_pack_end(box, frame); + + frame = elm_frame_add(box); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(frame, "Memory Buffered"); + evas_object_show(frame); + progress = elm_progressbar_add(frame); + evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_span_size_set(progress, 1.0); + elm_progressbar_unit_format_set(progress, eina_slstr_printf("%lu M / %lu M", results->memory.buffered, results->memory.total)); + ratio = results->memory.total / 100.0; + value = results->memory.buffered / ratio; + elm_progressbar_value_set(progress, value / 100); + evas_object_show(progress); + elm_object_content_set(frame, progress); + elm_box_pack_end(box, frame); + + frame = elm_frame_add(box); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(frame, "Memory Shared"); + evas_object_show(frame); + progress = elm_progressbar_add(frame); + evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_span_size_set(progress, 1.0); + elm_progressbar_unit_format_set(progress, eina_slstr_printf("%lu M / %lu M", results->memory.shared, results->memory.total)); + ratio = results->memory.total / 100.0; + value = results->memory.shared / ratio; + elm_progressbar_value_set(progress, value / 100); + evas_object_show(progress); + elm_object_content_set(frame, progress); + elm_box_pack_end(box, frame); + + elm_box_pack_end(ui->mem_activity, box); +} + +static void +_extra_view_update(Ui *ui, results_t *results) +{ + Evas_Object *box, *frame, *progress; + int i; + + if (!ui->extra_visible) + return; + + _results = results; + + elm_box_clear(ui->extra_activity); + + box = elm_box_add(ui->content); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(box); + if (results->power.battery_count) { frame = elm_frame_add(box); @@ -1059,7 +1172,6 @@ _extra_view_update(Ui *ui, results_t *results) elm_box_pack_end(ui->extra_activity, box); } - static void _ui_system_view_add(Ui *ui) { @@ -1701,6 +1813,95 @@ _ui_extra_view_add(Ui *ui) elm_box_pack_end(box, frame); } +static void +_ui_cpu_view_add(Ui *ui) +{ + Evas_Object *parent, *box, *hbox, *frame, *scroller; + + parent = ui->content; + + ui->cpu_view = box = elm_box_add(parent); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(ui->content, ui->cpu_view, 0, 1, 1, 1); + evas_object_hide(box); + + ui->cpu_activity = hbox = elm_box_add(box); + evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(hbox); + + frame = elm_frame_add(box); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(frame, "CPU"); + evas_object_show(frame); + + scroller = elm_scroller_add(parent); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_ON); + evas_object_show(scroller); + elm_object_content_set(scroller, hbox); + + elm_object_content_set(frame, scroller); + elm_box_pack_end(box, frame); +} + +static void +_ui_memory_view_add(Ui *ui) +{ + Evas_Object *parent, *box, *hbox, *frame, *scroller; + + parent = ui->content; + + ui->mem_view = box = elm_box_add(parent); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(ui->content, ui->mem_view, 0, 1, 1, 1); + evas_object_hide(box); + + ui->mem_activity = hbox = elm_box_add(box); + evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(hbox); + + frame = elm_frame_add(box); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(frame, "Memory"); + evas_object_show(frame); + + scroller = elm_scroller_add(parent); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_ON); + evas_object_show(scroller); + elm_object_content_set(scroller, hbox); + + elm_object_content_set(frame, scroller); + elm_box_pack_end(box, frame); +} + +static void +_tab_memory_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Ui *ui; + + ui = data; + + ui->mem_visible = EINA_TRUE; + ui->extra_visible = EINA_FALSE; + ui->disk_visible = EINA_FALSE; + ui->cpu_visible = EINA_FALSE; + + evas_object_show(ui->mem_view); + evas_object_hide(ui->system_activity); + evas_object_hide(ui->panel); + evas_object_hide(ui->disk_view); + evas_object_hide(ui->extra_view); + evas_object_hide(ui->cpu_view); +} static void _tab_system_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1711,11 +1912,15 @@ _tab_system_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void * ui->extra_visible = EINA_FALSE; ui->disk_visible = EINA_FALSE; + ui->cpu_visible = EINA_FALSE; + ui->mem_visible = EINA_FALSE; evas_object_show(ui->system_activity); evas_object_show(ui->panel); evas_object_hide(ui->disk_view); evas_object_hide(ui->extra_view); + evas_object_hide(ui->cpu_view); + evas_object_hide(ui->mem_view); } static void @@ -1727,11 +1932,15 @@ _tab_disk_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ev ui->extra_visible = EINA_FALSE; ui->disk_visible = EINA_TRUE; + ui->cpu_visible = EINA_FALSE; + ui->mem_visible = EINA_FALSE; evas_object_show(ui->disk_view); evas_object_hide(ui->system_activity); evas_object_hide(ui->panel); evas_object_hide(ui->extra_view); + evas_object_hide(ui->cpu_view); + evas_object_hide(ui->mem_view); } static void @@ -1743,11 +1952,35 @@ _tab_extra_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info ui->extra_visible = EINA_TRUE; ui->disk_visible = EINA_FALSE; + ui->cpu_visible = EINA_FALSE; + ui->mem_visible = EINA_FALSE; evas_object_show(ui->extra_view); evas_object_hide(ui->system_activity); evas_object_hide(ui->panel); evas_object_hide(ui->disk_view); + evas_object_hide(ui->cpu_view); + evas_object_hide(ui->mem_view); +} + +static void +_tab_cpu_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Ui *ui; + + ui = data; + + ui->mem_visible = EINA_FALSE; + ui->extra_visible = EINA_FALSE; + ui->disk_visible = EINA_FALSE; + ui->cpu_visible = EINA_TRUE; + + evas_object_show(ui->cpu_view); + evas_object_hide(ui->extra_view); + evas_object_hide(ui->system_activity); + evas_object_hide(ui->panel); + evas_object_hide(ui->disk_view); + evas_object_hide(ui->mem_view); } static Evas_Object * @@ -1785,7 +2018,23 @@ _ui_tabs_add(Evas_Object *parent, Ui *ui) button = elm_button_add(hbox); evas_object_size_hint_weight_set(button, 1.0, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_object_text_set(button, "Disk Usage"); + elm_object_text_set(button, "CPU"); + evas_object_show(button); + elm_box_pack_end(hbox, button); + evas_object_smart_callback_add(button, "clicked", _tab_cpu_activity_clicked_cb, ui); + + button = elm_button_add(hbox); + evas_object_size_hint_weight_set(button, 1.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(button, "Memory"); + evas_object_show(button); + elm_box_pack_end(hbox, button); + evas_object_smart_callback_add(button, "clicked", _tab_memory_activity_clicked_cb, ui); + + button = elm_button_add(hbox); + evas_object_size_hint_weight_set(button, 1.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(button, "Storage"); evas_object_show(button); elm_box_pack_end(hbox, button); evas_object_smart_callback_add(button, "clicked", _tab_disk_activity_clicked_cb, ui); @@ -1842,7 +2091,7 @@ ui_add(Evas_Object *parent) ui->selected_pid = -1; ui->program_pid = getpid(); ui->panel_visible = EINA_TRUE; - ui->disk_visible = ui->extra_visible = EINA_TRUE; + ui->disk_visible = ui->cpu_visible = ui->mem_visible = ui->extra_visible = EINA_TRUE; memset(ui->cpu_times, 0, PID_MAX * sizeof(int64_t)); @@ -1860,6 +2109,8 @@ ui_add(Evas_Object *parent) /* Setup the user interfeace */ _ui_system_view_add(ui); _ui_process_panel_add(ui); + _ui_cpu_view_add(ui); + _ui_memory_view_add(ui); _ui_disk_view_add(ui); _ui_extra_view_add(ui); diff --git a/src/ui.h b/src/ui.h index daeff09..c9d9f94 100644 --- a/src/ui.h +++ b/src/ui.h @@ -50,12 +50,18 @@ typedef struct Ui Evas_Object *disk_view; Evas_Object *disk_activity; + Evas_Object *cpu_view; + Evas_Object *cpu_activity; + Evas_Object *mem_view; + Evas_Object *mem_activity; Evas_Object *extra_view; Evas_Object *extra_activity; Evas_Object *system_activity; + Eina_Bool cpu_visible; Eina_Bool extra_visible; Eina_Bool disk_visible; + Eina_Bool mem_visible; Evas_Object *progress_cpu; Evas_Object *progress_mem;