netstar pushed a commit to branch master.

http://git.enlightenment.org/apps/evisum.git/commit/?id=35323ea227e5988d142b443d2362c031f8151dc4

commit 35323ea227e5988d142b443d2362c031f8151dc4
Author: Alastair Poole <nets...@gmail.com>
Date:   Sun Jun 28 20:02:07 2020 +0100

    evisum: Traditional
    
    Make the UI simpler. Give everything a window. It's not clever
    to only allow one action at a time. I think it seemed cool
    because every other environment is simplifying the interface.
    I don't really agree with this. Also some "tabs" don't
    currently justify having the whole window.
    
    hashtag **** it!
---
 src/bin/system/machine.h |   3 +
 src/bin/ui/ui.c          | 248 +++++++++++------------------------------------
 src/bin/ui/ui.h          |  27 ++----
 src/bin/ui/ui_cpu.c      | 172 +++++++++++++++++++-------------
 src/bin/ui/ui_cpu.h      |   2 +-
 src/bin/ui/ui_disk.c     | 127 +++++++++++++-----------
 src/bin/ui/ui_disk.h     |   5 +-
 src/bin/ui/ui_memory.c   | 221 +++++++++++++++++++++++------------------
 src/bin/ui/ui_memory.h   |   4 +-
 src/bin/ui/ui_misc.c     | 154 +++++++++++++++++++++--------
 src/bin/ui/ui_misc.h     |   5 +-
 src/bin/ui/ui_util.c     |  16 +++
 src/bin/ui/ui_util.h     |   9 +-
 13 files changed, 501 insertions(+), 492 deletions(-)

diff --git a/src/bin/system/machine.h b/src/bin/system/machine.h
index ff04a62..862e8d4 100644
--- a/src/bin/system/machine.h
+++ b/src/bin/system/machine.h
@@ -90,6 +90,9 @@ system_cpu_usage_delayed_get(int *ncpu, int usecs);
 void
 system_memory_usage_get(meminfo_t *memory);
 
+sensor_t **
+system_sensors_thermal_get(int *count);
+
 void
 system_power_state_get(power_t *power);
 
diff --git a/src/bin/ui/ui.c b/src/bin/ui/ui.c
index 8341dc5..422da8c 100644
--- a/src/bin/ui/ui.c
+++ b/src/bin/ui/ui.c
@@ -715,8 +715,8 @@ _btn_state_clicked_cb(void *data, Evas_Object *obj 
EINA_UNUSED,
 }
 
 static void
-_btn_quit_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
-                     void *event_info EINA_UNUSED)
+_quit_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
 {
    exit(0);
 }
@@ -903,7 +903,7 @@ _item_pid_clicked_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_info)
 }
 
 static void
-_ui_tab_system_add(Ui *ui)
+_ui_content_system_add(Ui *ui)
 {
    Evas_Object *parent, *box, *hbox, *frame, *table;
    Evas_Object *pb, *button, *plist;
@@ -911,7 +911,7 @@ _ui_tab_system_add(Ui *ui)
 
    parent = ui->content;
 
-   ui->system_activity = ui->current_view = box = elm_box_add(parent);
+   ui->system_activity = box = elm_box_add(parent);
    evas_object_size_hint_weight_set(box, EXPAND, EXPAND);
    evas_object_size_hint_align_set(box, FILL, FILL);
    evas_object_show(box);
@@ -1028,6 +1028,7 @@ _ui_tab_system_add(Ui *ui)
    evas_object_size_hint_weight_set(plist, EXPAND, EXPAND);
    evas_object_size_hint_align_set(plist, FILL, FILL);
    evas_object_show(plist);
+   elm_win_resize_object_add(ui->win, plist);
 
    elm_box_pack_end(box, table);
    elm_box_pack_end(box, plist);
@@ -1055,111 +1056,46 @@ _ui_tab_system_add(Ui *ui)
 }
 
 static void
-_tabs_hide(Ui *ui)
+_about_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                  void *event_info EINA_UNUSED)
 {
-   ui->mem_visible = EINA_FALSE;
-   ui->misc_visible = EINA_FALSE;
-   ui->disk_visible = EINA_FALSE;
-   ui->cpu_visible = EINA_FALSE;
-
-   evas_object_hide(ui->entry_search_border);
-   evas_object_hide(ui->system_activity);
-   evas_object_hide(ui->cpu_view);
-   evas_object_hide(ui->mem_view);
-   evas_object_hide(ui->disk_view);
-   evas_object_hide(ui->misc_view);
-}
-
-static void
-_transit_del_cb(void *data, Elm_Transit *transit)
-{
-   Ui *ui = data;
 
-   ui->transit = transit = NULL;
 }
 
 static void
-_tab_state_changed(Ui *ui, Evas_Object *btn_active, Evas_Object *view)
-{
-   Elm_Transit *transit;
-
-   if (ui->transit) return;
-
-   elm_object_disabled_set(ui->btn_general, EINA_FALSE);
-   elm_object_disabled_set(ui->btn_cpu, EINA_FALSE);
-   elm_object_disabled_set(ui->btn_mem, EINA_FALSE);
-   elm_object_disabled_set(ui->btn_storage, EINA_FALSE);
-   elm_object_disabled_set(ui->btn_misc, EINA_FALSE);
-   elm_object_disabled_set(btn_active, EINA_TRUE);
-
-   _tabs_hide(ui);
-
-   evas_object_show(view);
-
-   ui->transit = transit = elm_transit_add();
-   elm_transit_object_add(transit, ui->current_view);
-   elm_transit_object_add(transit, view);
-   elm_transit_duration_set(transit, 0.5);
-   elm_transit_effect_blend_add(transit);
-   elm_transit_del_cb_set(transit, _transit_del_cb, ui);
-   elm_transit_go(transit);
-
-   ui->current_view = view;
-}
-
-static void
-_tab_memory_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+_menu_memory_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
                                 void *event_info EINA_UNUSED)
 {
    Ui *ui = data;
 
-   _tab_state_changed(ui, obj, ui->mem_view);
-
-   ui->mem_visible = EINA_TRUE;
+   ui_win_memory_add(ui);
 }
 
 static void
-_tab_system_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
-                                void *event_info EINA_UNUSED)
-{
-   Ui *ui = data;
-
-   _tab_state_changed(ui, obj, ui->system_activity);
-
-   evas_object_show(ui->entry_search_border);
-}
-
-static void
-_tab_disk_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+_menu_disk_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
                               void *event_info EINA_UNUSED)
 {
    Ui *ui = data;
 
-   _tab_state_changed(ui, obj, ui->disk_view);
-
-   ui->disk_visible = EINA_TRUE;
+   ui_win_disk_add(ui);
 }
 
 static void
-_tab_misc_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+_menu_misc_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
                      void *event_info EINA_UNUSED)
 {
    Ui *ui = data;
 
-   _tab_state_changed(ui, obj, ui->misc_view);
-
-   ui->misc_visible = EINA_TRUE;
+   ui_win_misc_add(ui);
 }
 
 static void
-_tab_cpu_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+_menu_cpu_activity_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
                              void *event_info EINA_UNUSED)
 {
    Ui *ui = data;
 
-   _tab_state_changed(ui, obj, ui->cpu_view);
-
-   ui->cpu_visible = EINA_TRUE;
+   ui_win_cpu_add(ui);
 }
 
 static void
@@ -1199,9 +1135,9 @@ _evisum_search_keypress_cb(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj,
 }
 
 static Evas_Object *
-_ui_tabs_add(Evas_Object *parent, Ui *ui)
+_ui_content_add(Evas_Object *parent, Ui *ui)
 {
-   Evas_Object *table, *box, *entry, *hbox, *frame, *btn;
+   Evas_Object *table, *box, *entry, *hbox, *frame;
    Evas_Object *border;
 
    ui->content = table = elm_table_add(parent);
@@ -1213,89 +1149,9 @@ _ui_tabs_add(Evas_Object *parent, Ui *ui)
    frame = elm_frame_add(parent);
    evas_object_size_hint_weight_set(frame, EXPAND, 0);
    evas_object_size_hint_align_set(frame, FILL, FILL);
-   elm_object_text_set(frame, _("Options"));
-   elm_object_style_set(frame, "pad_medium");
+   elm_object_style_set(frame, "pad_small");
    evas_object_show(frame);
 
-   hbox = elm_box_add(parent);
-   evas_object_size_hint_weight_set(hbox, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(hbox, FILL, FILL);
-   elm_box_horizontal_set(hbox, EINA_TRUE);
-   evas_object_show(hbox);
-
-   border = elm_frame_add(parent);
-   evas_object_size_hint_weight_set(border, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(border, FILL, FILL);
-   elm_object_style_set(border, "pad_small");
-   elm_box_pack_end(hbox, border);
-   evas_object_show(border);
-
-   border = elm_frame_add(parent);
-   evas_object_size_hint_weight_set(border, 0, EXPAND);
-   evas_object_size_hint_align_set(border, FILL, FILL);
-   elm_object_style_set(border, "pad_small");
-   evas_object_show(border);
-
-   btn = evisum_ui_tab_add(parent, &ui->btn_general, _("General"),
-                   _tab_system_activity_clicked_cb, ui);
-   elm_object_disabled_set(ui->btn_general, EINA_TRUE);
-   elm_object_content_set(border, btn);
-   elm_box_pack_end(hbox, border);
-
-   border = elm_frame_add(parent);
-   evas_object_size_hint_weight_set(border, 0, EXPAND);
-   evas_object_size_hint_align_set(border, FILL, FILL);
-   elm_object_style_set(border, "pad_small");
-   evas_object_show(border);
-
-   btn = evisum_ui_tab_add(parent, &ui->btn_cpu, _("CPU"),
-                   _tab_cpu_activity_clicked_cb, ui);
-   elm_object_content_set(border, btn);
-   elm_box_pack_end(hbox, border);
-
-   border = elm_frame_add(parent);
-   evas_object_size_hint_weight_set(border, 0, EXPAND);
-   evas_object_size_hint_align_set(border, FILL, FILL);
-   elm_object_style_set(border, "pad_small");
-   evas_object_show(border);
-
-   btn = evisum_ui_tab_add(parent, &ui->btn_mem, _("Memory"),
-                   _tab_memory_activity_clicked_cb, ui);
-   elm_object_content_set(border, btn);
-   elm_box_pack_end(hbox, border);
-
-   border = elm_frame_add(parent);
-   evas_object_size_hint_weight_set(border, 0, EXPAND);
-   evas_object_size_hint_align_set(border, FILL, FILL);
-   elm_object_style_set(border, "pad_small");
-   evas_object_show(border);
-
-   btn = evisum_ui_tab_add(parent, &ui->btn_storage, _("Storage"),
-                   _tab_disk_activity_clicked_cb, ui);
-   elm_object_content_set(border, btn);
-   elm_box_pack_end(hbox, border);
-
-   border = elm_frame_add(parent);
-   evas_object_size_hint_weight_set(border, 0, EXPAND);
-   evas_object_size_hint_align_set(border, FILL, FILL);
-   elm_object_style_set(border, "pad_small");
-   evas_object_show(border);
-
-   btn = evisum_ui_tab_add(parent, &ui->btn_misc, _("Misc"),
-                   _tab_misc_clicked_cb, ui);
-   elm_object_content_set(border, btn);
-   elm_box_pack_end(hbox, border);
-
-   border = elm_frame_add(parent);
-   evas_object_size_hint_weight_set(border, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(border, FILL, FILL);
-   elm_object_style_set(border, "pad_small");
-   elm_box_pack_end(hbox, border);
-   evas_object_show(border);
-
-   elm_object_content_set(frame, hbox);
-   elm_table_pack(ui->content, frame, 0, 0, 1, 1);
-
    hbox = elm_box_add(parent);
    evas_object_size_hint_weight_set(hbox, EXPAND, 0);
    evas_object_size_hint_align_set(hbox, FILL, FILL);
@@ -1308,13 +1164,7 @@ _ui_tabs_add(Evas_Object *parent, Ui *ui)
    elm_box_horizontal_set(box, EINA_TRUE);
    evas_object_show(box);
 
-   frame = elm_frame_add(parent);
-   evas_object_size_hint_weight_set(frame, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(frame, FILL, FILL);
-   elm_object_style_set(frame, "pad_small");
-   evas_object_show(frame);
-
-   ui->entry_search_border = border = elm_frame_add(parent);
+   border = elm_frame_add(parent);
    evas_object_size_hint_weight_set(border, EXPAND, EXPAND);
    evas_object_size_hint_align_set(border, FILL, FILL);
    elm_object_style_set(border, "pad_small");
@@ -1331,20 +1181,12 @@ _ui_tabs_add(Evas_Object *parent, Ui *ui)
    elm_object_content_set(border, entry);
    elm_box_pack_end(box, border);
 
-   border = elm_frame_add(parent);
-   evas_object_size_hint_align_set(border, FILL, FILL);
-   elm_object_style_set(border, "pad_small");
-   evas_object_show(border);
-
-   btn = evisum_ui_tab_add(parent, NULL, _("Close"), _btn_quit_clicked_cb,
-                   ui);
-   elm_object_content_set(border, btn);
-   elm_box_pack_end(box, border);
-
    elm_object_content_set(frame, box);
    elm_box_pack_end(hbox, frame);
    elm_table_pack(ui->content, hbox, 0, 2, 1, 1);
 
+   _ui_content_system_add(ui);
+
    return table;
 }
 
@@ -1370,7 +1212,11 @@ _evisum_key_down_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info)
      }
 
    control = evas_key_modifier_is_set(ev->modifiers, "Control");
-   if (!control) return;
+   if (!control)
+     {
+        elm_object_focus_set(ui->entry_search, EINA_TRUE);
+        return;
+     }
 
    if (ev->keyname[0] == 'e' || ev->keyname[0] == 'E')
      ui->show_self = !ui->show_self;
@@ -1483,10 +1329,6 @@ _system_info_all_poll_feedback_cb(void *data, 
Ecore_Thread *thread, void *msg)
    if (ecore_thread_check(thread))
      goto out;
 
-   ui_tab_memory_update(ui, info);
-   ui_tab_disk_update(ui);
-   ui_tab_misc_update(ui, info);
-
    for (int i = 0; i < info->cpu_count; i++)
      {
         cpu_usage += info->cores[i]->percent;
@@ -1506,6 +1348,8 @@ _system_info_all_poll_feedback_cb(void *data, 
Ecore_Thread *thread, void *msg)
    elm_progressbar_unit_format_set(pb, eina_slstr_printf("%s / %s",
                    evisum_size_format(info->memory.used),
                    evisum_size_format(info->memory.total)));
+
+   ui->network_usage = info->network_usage;
 out:
    system_info_all_free(info);
 }
@@ -1532,6 +1376,29 @@ _ui_launch(Ui *ui)
                    _evisum_search_keypress_cb, ui);
 }
 
+static void
+_menu_setup(Ui *ui)
+{
+   Evas_Object *menu;
+   Elm_Object_Item *menu_it;
+
+   menu = elm_win_main_menu_get(ui->win);
+   menu_it = elm_menu_item_add(menu, NULL, NULL, _("File"), NULL, NULL);
+   elm_menu_item_add(menu, menu_it, NULL, _("Quit"), _quit_cb, NULL);
+   menu_it = elm_menu_item_add(menu, NULL, NULL, _("View"), NULL, NULL);
+   elm_menu_item_add(menu, menu_it, NULL, _("CPU"), 
_menu_cpu_activity_clicked_cb, ui);
+   elm_menu_item_add(menu, menu_it, NULL, _("Memory"),
+                   _menu_memory_activity_clicked_cb, ui);
+   elm_menu_item_add(menu, menu_it, NULL, _("Storage"),
+                   _menu_disk_activity_clicked_cb, ui);
+   elm_menu_item_add(menu, menu_it, NULL, _("Misc"),
+                   _menu_misc_activity_clicked_cb, ui);
+   menu_it = elm_menu_item_add(menu, NULL, NULL, _("Help"), NULL, NULL);
+   elm_menu_item_add(menu, menu_it, NULL, _("About"), _about_clicked_cb, ui);
+
+   evas_object_show(menu);
+}
+
 static Ui *
 _ui_init(Evas_Object *parent)
 {
@@ -1544,9 +1411,6 @@ _ui_init(Evas_Object *parent)
    ui->sort_type = SORT_BY_PID;
    ui->selected_pid = -1;
    ui->program_pid = getpid();
-   ui->disk_visible = EINA_TRUE;
-   ui->mem_visible = ui->misc_visible = EINA_TRUE;
-   ui->cpu_visible = EINA_FALSE;
    ui->cpu_times = NULL;
    ui->cpu_list = NULL;
 
@@ -1558,13 +1422,9 @@ _ui_init(Evas_Object *parent)
 
    _config_load(ui);
 
-   _ui_tabs_add(parent, ui);
-   _ui_tab_system_add(ui);
+   _ui_content_add(parent, ui);
 
-   ui_tab_cpu_add(ui);
-   ui_tab_memory_add(ui);
-   ui_tab_disk_add(ui);
-   ui_tab_misc_add(ui);
+   _menu_setup(ui);
 
    ui->cache = evisum_ui_item_cache_new(ui->genlist_procs, _item_create, 50);
 
@@ -1581,6 +1441,8 @@ evisum_ui_add(Evas_Object *parent)
 
    _ui_launch(ui);
 
+   elm_object_focus_set(ui->entry_search, EINA_TRUE);
+
    return ui;
 }
 
diff --git a/src/bin/ui/ui.h b/src/bin/ui/ui.h
index 026506d..0822536 100644
--- a/src/bin/ui/ui.h
+++ b/src/bin/ui/ui.h
@@ -3,6 +3,7 @@
 
 #include <Elementary.h>
 #include "gettext.h"
+#include "system/machine.h"
 #include "system/process.h"
 #include "../evisum_config.h"
 #include "ui/ui_util.h"
@@ -35,25 +36,11 @@ typedef struct Ui
    Evas_Object     *menu;
    Evas_Object     *scroller;
    Evas_Object     *content;
-   Evas_Object     *btn_general;
-   Evas_Object     *btn_cpu;
-   Evas_Object     *btn_mem;
-   Evas_Object     *btn_storage;
-   Evas_Object     *btn_misc;
 
-   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     *misc_view;
    Evas_Object     *misc_activity;
    Evas_Object     *system_activity;
 
-   Elm_Transit     *transit;
-   Evas_Object     *current_view;
-
    Eina_Bool       cpu_visible;
    Eina_Bool       misc_visible;
    Eina_Bool       disk_visible;
@@ -62,12 +49,6 @@ typedef struct Ui
    Evas_Object     *progress_cpu;
    Evas_Object     *progress_mem;
 
-   Evas_Object     *progress_mem_used;
-   Evas_Object     *progress_mem_cached;
-   Evas_Object     *progress_mem_buffered;
-   Evas_Object     *progress_mem_shared;
-   Evas_Object     *progress_mem_swap;
-
    Evas_Object     *btn_pid;
    Evas_Object     *btn_uid;
    Evas_Object     *btn_size;
@@ -79,13 +60,16 @@ typedef struct Ui
    Evisum_Ui_Cache *cache;
    Evas_Object     *genlist_procs;
    Evas_Object     *entry_search;
-   Evas_Object     *entry_search_border;
 
    Ecore_Thread    *thread_system;
    Ecore_Thread    *thread_process;
    Ecore_Thread    *thread_cpu;
 
    Ecore_Timer     *timer_pid;
+   Ecore_Timer     *timer_memory;
+   Ecore_Timer     *timer_disk;
+   Ecore_Timer     *timer_misc;
+
    pid_t           selected_pid;
    pid_t           program_pid;
 
@@ -107,6 +91,7 @@ typedef struct Ui
 
    uint64_t        incoming_max;
    uint64_t        outgoing_max;
+   network_t       network_usage;
 } Ui;
 
 Ui *
diff --git a/src/bin/ui/ui_cpu.c b/src/bin/ui/ui_cpu.c
index dcb2cd0..655c643 100644
--- a/src/bin/ui/ui_cpu.c
+++ b/src/bin/ui/ui_cpu.c
@@ -18,27 +18,29 @@ typedef struct {
    int          pos;
    double       value;
    double       step;
-} Animation;
+} Animate_Data;
 
 typedef struct {
-   double      *value;
-   Evas_Object *pb;
+   Ecore_Animator *animator;
+   Animate_Data   *anim_data;
+   double         *value;
+   Evas_Object    *pb;
 } Progress;
 
 static void
-loop_reset(Animation *anim)
+loop_reset(Animate_Data *ad)
 {
-   anim->pos = anim->step = 0;
+   ad->pos = ad->step = 0;
 }
 
 static Eina_Bool
-_bg_fill(Animation *anim)
+_bg_fill(Animate_Data *ad)
 {
    uint32_t *pixels;
    Evas_Coord x, y, w, h;
 
-   evas_object_geometry_get(anim->bg, NULL, NULL, &w, &h);
-   pixels = evas_object_image_data_get(anim->obj, EINA_TRUE);
+   evas_object_geometry_get(ad->bg, NULL, NULL, &w, &h);
+   pixels = evas_object_image_data_get(ad->obj, EINA_TRUE);
    if (!pixels) return EINA_FALSE;
    for (y = 0; y < h; y++)
      {
@@ -47,55 +49,53 @@ _bg_fill(Animation *anim)
              *(pixels++) = COLOR_BG;
           }
      }
-   anim->redraw = EINA_FALSE;
+   ad->redraw = EINA_FALSE;
    return EINA_TRUE;
 }
 
 static Eina_Bool
-animator(void *data)
+animate(void *data)
 {
    uint32_t *pixels;
    Evas_Object *line, *obj, *bg;
    Evas_Coord x, y, w, h, fill_y;
    double value;
-   Animation *anim = data;
+   Animate_Data *ad = data;
 
-   if (!anim->ui->cpu_visible) return EINA_TRUE;
-
-   bg = anim->bg; line = anim->line; obj = anim->obj;
+   bg = ad->bg; line = ad->line; obj = ad->obj;
 
    evas_object_geometry_get(bg, &x, &y, &w, &h);
    evas_object_image_size_set(obj, w, h);
 
-   evas_object_move(line, x + w - anim->pos, y);
+   evas_object_move(line, x + w - ad->pos, y);
    evas_object_resize(line, 1, h);
-   if (anim->enabled)
+   if (ad->enabled)
      evas_object_show(line);
    else
      evas_object_hide(line);
 
-   if (anim->redraw)
+   if (ad->redraw)
      {
-        _bg_fill(anim);
+        _bg_fill(ad);
         return EINA_TRUE;
      }
 
    pixels = evas_object_image_data_get(obj, EINA_TRUE);
    if (!pixels) return EINA_TRUE;
 
-   value = anim->value > 0 ? anim->value : 1.0;
+   value = ad->value > 0 ? ad->value : 1.0;
 
    fill_y = h - (int) ((double)(h / 100.0) * value);
 
-   for (y = 0; anim->enabled && y < h; y++)
+   for (y = 0; ad->enabled && y < h; y++)
      {
         for (x = 0; x < w; x++)
           {
-             if (x == (w - anim->pos))
+             if (x == (w - ad->pos))
                {
                    *(pixels) = COLOR_BG;
                }
-             if ((x == (w - anim->pos)) && (y >= fill_y))
+             if ((x == (w - ad->pos)) && (y >= fill_y))
                {
                   if (y % 2)
                     *(pixels) = COLOR_FG;
@@ -104,11 +104,11 @@ animator(void *data)
           }
      }
 
-   anim->step += (double) (w * ecore_animator_frametime_get()) / 60.0;
-   anim->pos = anim->step;
+   ad->step += (double) (w * ecore_animator_frametime_get()) / 60.0;
+   ad->pos = ad->step;
 
-   if (anim->pos >= w)
-     loop_reset(anim);
+   if (ad->pos >= w)
+     loop_reset(ad);
 
    return EINA_TRUE;
 }
@@ -117,21 +117,21 @@ static void
 _anim_resize_cb(void *data, Evas_Object *obj EINA_UNUSED,
                 void *event_info EINA_UNUSED)
 {
-   Animation *anim = data;
+   Animate_Data *ad = data;
 
-   anim->redraw = EINA_TRUE;
-   loop_reset(anim);
+   ad->redraw = EINA_TRUE;
+   loop_reset(ad);
 
-   evas_object_hide(anim->line);
+   evas_object_hide(ad->line);
 }
 
 static void
 _anim_move_cb(void *data, Evas_Object *obj EINA_UNUSED,
-                void *event_info EINA_UNUSED)
+              void *event_info EINA_UNUSED)
 {
-   Animation *anim = data;
+   Animate_Data *ad = data;
 
-   evas_object_hide(anim->line);
+   evas_object_hide(ad->line);
 }
 
 static void
@@ -139,12 +139,12 @@ _btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
                 void *event_info EINA_UNUSED)
 {
    Evas_Object *rect;
-   Animation *anim = data;
+   Animate_Data *ad = data;
 
-   anim->enabled = !anim->enabled;
+   ad->enabled = !ad->enabled;
 
-   rect = elm_object_part_content_get(anim->btn, "elm.swallow.content");
-   if (!anim->enabled)
+   rect = elm_object_part_content_get(ad->btn, "elm.swallow.content");
+   if (!ad->enabled)
      evas_object_color_set(rect, 0, 0, 0, 0);
    else
      evas_object_color_set(rect, 47, 153, 255, 255);
@@ -183,38 +183,59 @@ _core_times_cb(void *data, Ecore_Thread *thread)
      }
 }
 
+static void
+_win_del_cb(void *data, Evas_Object *obj,
+            void *event_info EINA_UNUSED)
+{
+   Progress *progress;
+   Ui *ui = data;
+
+   evas_object_hide(obj);
+
+   ecore_thread_cancel(ui->thread_cpu);
+   ecore_thread_wait(ui->thread_cpu, 1.0);
+
+   EINA_LIST_FREE(ui->cpu_list, progress)
+     {
+        ecore_animator_del(progress->animator);
+        free(progress->anim_data);
+        free(progress);
+     }
+
+   evas_object_del(obj);
+   ui->cpu_visible = EINA_FALSE;
+}
+
 void
-ui_tab_cpu_add(Ui *ui)
+ui_win_cpu_add(Ui *ui)
 {
-   Evas_Object *parent, *box, *hbox, *scroller, *frame;
+   Evas_Object *win, *box, *hbox, *scroller, *frame;
    Evas_Object *pb, *tbl, *lbox, *btn, *rect;
    Evas_Object *bg, *line, *obj;
    int cpu_count;
 
-   parent = ui->content;
+   if (ui->cpu_visible) return;
 
-   ui->cpu_view = box = elm_box_add(parent);
-   evas_object_size_hint_weight_set(box, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(box, FILL, FILL);
-   elm_table_pack(ui->content, ui->cpu_view, 0, 1, 1, 1);
-   evas_object_hide(box);
+   ui->cpu_visible = EINA_TRUE;
+
+   win = elm_win_util_standard_add("evisum", _("CPU Usage"));
+   evas_object_size_hint_weight_set(win, EXPAND, EXPAND);
+   evas_object_size_hint_align_set(win, FILL, FILL);
 
-   ui->cpu_activity = hbox = elm_box_add(box);
+   hbox = elm_box_add(win);
    evas_object_size_hint_weight_set(hbox, EXPAND, EXPAND);
    evas_object_size_hint_align_set(hbox, FILL, FILL);
    elm_box_horizontal_set(hbox, EINA_TRUE);
    evas_object_show(hbox);
 
-   scroller = elm_scroller_add(parent);
+   scroller = elm_scroller_add(win);
    evas_object_size_hint_weight_set(scroller, EXPAND, EXPAND);
    evas_object_size_hint_align_set(scroller, FILL, FILL);
    elm_scroller_policy_set(scroller,
                    ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
    evas_object_show(scroller);
-   elm_object_content_set(scroller, hbox);
-   elm_box_pack_end(box, scroller);
 
-   box = elm_box_add(ui->content);
+   box = elm_box_add(hbox);
    evas_object_size_hint_align_set(box, FILL, FILL);
    evas_object_size_hint_weight_set(box, 0.1, EXPAND);
    evas_object_show(box);
@@ -222,7 +243,7 @@ ui_tab_cpu_add(Ui *ui)
    cpu_count = system_cpu_online_count_get();
    for (int i = 0; i < cpu_count; i++)
      {
-        lbox = elm_box_add(ui->content);
+        lbox = elm_box_add(box);
         evas_object_size_hint_align_set(lbox, FILL, FILL);
         evas_object_size_hint_weight_set(lbox, 0.1, EXPAND);
         evas_object_show(lbox);
@@ -279,38 +300,49 @@ ui_tab_cpu_add(Ui *ui)
         evas_object_image_colorspace_set(obj, EVAS_COLORSPACE_ARGB8888);
         evas_object_show(obj);
 
-        Animation *anim = calloc(1, sizeof(Animation));
-        anim->bg = bg;
-        anim->obj = obj;
-        anim->line = line;
-        anim->enabled = EINA_TRUE;
-        anim->btn = btn;
-        anim->cpu_id = i;
-        anim->ui = ui;
-        anim->redraw = EINA_TRUE;
-
-        evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, anim);
-        evas_object_smart_callback_add(tbl, "resize", _anim_resize_cb, anim);
-        evas_object_smart_callback_add(tbl, "move", _anim_move_cb, anim);
-        ecore_animator_add(animator, anim);
-
         elm_table_pack(tbl, bg, 0, 1, 1, 1);
         elm_table_pack(tbl, obj, 0, 1, 1, 1);
         elm_table_pack(tbl, line, 0, 1, 1, 1);
+
         elm_box_pack_end(lbox, tbl);
         elm_object_content_set(frame, lbox);
         elm_box_pack_end(box, frame);
 
+        Animate_Data *ad = calloc(1, sizeof(Animate_Data));
+        if (!ad) return;
+
+        ad->bg = bg;
+        ad->obj = obj;
+        ad->line = line;
+        ad->enabled = EINA_TRUE;
+        ad->btn = btn;
+        ad->cpu_id = i;
+        ad->ui = ui;
+        ad->redraw = EINA_TRUE;
+
+        evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, ad);
+        evas_object_smart_callback_add(tbl, "resize", _anim_resize_cb, ad);
+        evas_object_smart_callback_add(tbl, "move", _anim_move_cb, ad);
+
         Progress *progress = calloc(1, sizeof(Progress));
-        progress->value = calloc(1, sizeof(float *));
-        progress->pb = pb;
-        progress->value = &anim->value;
+        if (progress)
+          {
+             progress->pb = pb;
+             progress->value = &ad->value;
+             progress->animator = ecore_animator_add(animate, ad);
+             progress->anim_data = ad;
 
-        ui->cpu_list = eina_list_append(ui->cpu_list, progress);
+             ui->cpu_list = eina_list_append(ui->cpu_list, progress);
+          }
      }
 
    ui->thread_cpu = ecore_thread_run(_core_times_cb, NULL, NULL, ui);
 
    elm_box_pack_end(hbox, box);
+   elm_object_content_set(scroller, hbox);
+
+   elm_object_content_set(win, scroller);
+   evas_object_smart_callback_add(win, "delete,request", _win_del_cb, ui);
+   evisum_child_window_show(ui->win, win);
 }
 
diff --git a/src/bin/ui/ui_cpu.h b/src/bin/ui/ui_cpu.h
index e69fe7d..df1bb9c 100644
--- a/src/bin/ui/ui_cpu.h
+++ b/src/bin/ui/ui_cpu.h
@@ -5,6 +5,6 @@
 #include "../system/machine.h"
 
 void
-ui_tab_cpu_add(Ui *ui);
+ui_win_cpu_add(Ui *ui);
 
 #endif
diff --git a/src/bin/ui/ui_disk.c b/src/bin/ui/ui_disk.c
index 1f70de3..33d564d 100644
--- a/src/bin/ui/ui_disk.c
+++ b/src/bin/ui/ui_disk.c
@@ -1,55 +1,6 @@
 #include "ui_disk.h"
 #include "../system/disks.h"
 
-void
-ui_tab_disk_add(Ui *ui)
-{
-   Evas_Object *parent, *box, *hbox, *frame, *scroller;
-   Evas_Object *table, *rect;
-
-   parent = ui->content;
-
-   ui->disk_view = box = elm_box_add(parent);
-   evas_object_size_hint_weight_set(box, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(box, FILL, FILL);
-   elm_table_pack(ui->content, ui->disk_view, 0, 1, 1, 1);
-   evas_object_hide(box);
-
-   ui->disk_activity = hbox = elm_box_add(box);
-   evas_object_size_hint_weight_set(hbox, EXPAND, 0.0);
-   evas_object_size_hint_align_set(hbox, FILL, 0.5);
-   evas_object_show(hbox);
-
-   frame = elm_frame_add(box);
-   evas_object_size_hint_weight_set(frame, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(frame, FILL, FILL);
-   elm_object_style_set(frame, "pad_small");
-   evas_object_show(frame);
-
-   scroller = elm_scroller_add(parent);
-   evas_object_size_hint_weight_set(scroller, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(scroller, FILL, FILL);
-   elm_scroller_policy_set(scroller,
-                   ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
-   evas_object_show(scroller);
-
-   table = elm_table_add(parent);
-   evas_object_size_hint_weight_set(table, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(table, FILL, FILL);
-   evas_object_show(table);
-
-   rect = evas_object_rectangle_add(evas_object_rectangle_add(parent));
-   evas_object_size_hint_max_set(rect, MISC_MAX_WIDTH, -1);
-   evas_object_size_hint_min_set(rect, MISC_MIN_WIDTH, 1);
-
-   elm_table_pack(table, rect, 0, 0, 1, 1);
-   elm_table_pack(table, hbox, 0, 0, 1, 1);
-   elm_object_content_set(scroller, table);
-
-   elm_object_content_set(frame, scroller);
-   elm_box_pack_end(box, frame);
-}
-
 static char *
 _file_system_usage_format(File_System *inf)
 {
@@ -168,15 +119,15 @@ _ui_disk_add(Ui *ui, File_System *inf)
    elm_box_pack_end(ui->disk_activity, frame);
 }
 
-void
-ui_tab_disk_update(Ui *ui)
+static Eina_Bool
+_disk_update(void *data)
 {
+   Ui *ui;
    Eina_List *disks;
    char *path;
    Eina_Bool zfs_mounted = EINA_FALSE;
 
-   if (!ui->disk_visible)
-     return;
+   ui = data;
 
    elm_box_clear(ui->disk_activity);
 
@@ -186,7 +137,6 @@ ui_tab_disk_update(Ui *ui)
         File_System *fs = file_system_info_get(path);
         if (fs)
           {
-             // Check for ZFS mount.
              if (fs->type == file_system_id_by_name("ZFS"))
                zfs_mounted = EINA_TRUE;
 
@@ -196,7 +146,74 @@ ui_tab_disk_update(Ui *ui)
         free(path);
      }
 
-   // Need to keep track of ZFS mounts (ARC memory usage).
    ui->zfs_mounted = zfs_mounted;
+
+   return EINA_TRUE;
+}
+
+static void
+_win_del_cb(void *data, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   Ui *ui = data;
+
+   if (ui->timer_disk)
+     ecore_timer_del(ui->timer_disk);
+   ui->timer_disk = NULL;
+
+   evas_object_del(obj);
+}
+
+void
+ui_win_disk_add(Ui *ui)
+{
+   Evas_Object *win, *box, *vbox, *scroller;
+   Evas_Object *table, *rect;
+
+   if (ui->disk_visible) return;
+   ui->disk_visible = EINA_TRUE;
+
+   win = elm_win_util_standard_add("evisum", _("Storage"));
+   evas_object_size_hint_weight_set(win, EXPAND, EXPAND);
+   evas_object_size_hint_align_set(win, FILL, FILL);
+
+   box = elm_box_add(win);
+   evas_object_size_hint_weight_set(box, EXPAND, EXPAND);
+   evas_object_size_hint_align_set(box, FILL, FILL);
+   evas_object_show(box);
+
+   ui->disk_activity = vbox = elm_box_add(win);
+   evas_object_size_hint_weight_set(vbox, EXPAND, 0.0);
+   evas_object_size_hint_align_set(vbox, FILL, 0.5);
+   evas_object_show(vbox);
+
+   scroller = elm_scroller_add(win);
+   evas_object_size_hint_weight_set(scroller, EXPAND, EXPAND);
+   evas_object_size_hint_align_set(scroller, FILL, FILL);
+   elm_scroller_policy_set(scroller,
+                   ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
+   evas_object_show(scroller);
+
+   table = elm_table_add(win);
+   evas_object_size_hint_weight_set(table, EXPAND, EXPAND);
+   evas_object_size_hint_align_set(table, FILL, FILL);
+   evas_object_show(table);
+
+   rect = evas_object_rectangle_add(evas_object_rectangle_add(win));
+   evas_object_size_hint_max_set(rect, MISC_MAX_WIDTH, -1);
+   evas_object_size_hint_min_set(rect, MISC_MIN_WIDTH, 1);
+
+   elm_table_pack(table, rect, 0, 0, 1, 1);
+   elm_table_pack(table, vbox, 0, 0, 1, 1);
+
+   elm_object_content_set(scroller, table);
+   elm_box_pack_end(box, scroller);
+   elm_object_content_set(win, box);
+
+   evas_object_smart_callback_add(win, "delete,request", _win_del_cb, ui);
+   evisum_child_window_show(ui->win, win);
+   _disk_update(ui);
+
+   ui->timer_disk = ecore_timer_add(3.0, _disk_update, ui);
 }
 
diff --git a/src/bin/ui/ui_disk.h b/src/bin/ui/ui_disk.h
index 3b6de39..afc16f3 100644
--- a/src/bin/ui/ui_disk.h
+++ b/src/bin/ui/ui_disk.h
@@ -5,9 +5,6 @@
 #include "system/disks.h"
 
 void
-ui_tab_disk_add(Ui *ui);
-
-void
-ui_tab_disk_update(Ui *ui);
+ui_win_disk_add(Ui *ui);
 
 #endif
diff --git a/src/bin/ui/ui_memory.c b/src/bin/ui/ui_memory.c
index 4ffe17a..e660476 100644
--- a/src/bin/ui/ui_memory.c
+++ b/src/bin/ui/ui_memory.c
@@ -1,4 +1,13 @@
 #include "ui_memory.h"
+#include "system/filesystems.h"
+
+typedef struct  {
+   Evas_Object  *used;
+   Evas_Object  *cached;
+   Evas_Object  *buffered;
+   Evas_Object  *shared;
+   Evas_Object  *swap;
+} Widgets;
 
 static Evas_Object *
 _label_mem(Evas_Object *parent, const char *text)
@@ -24,158 +33,178 @@ _progress_add(Evas_Object *parent)
    return pb;
 }
 
+static Eina_Bool
+_memory_update(void *data)
+{
+   Widgets *widgets;
+   Evas_Object *pb;
+   double ratio, value;
+   meminfo_t memory;
+
+   memset(&memory, 0, sizeof(memory));
+   system_memory_usage_get(&memory);
+
+   widgets = data;
+
+   if (file_system_in_use("ZFS"))
+     memory.used += memory.zfs_arc_used;
+
+   pb = widgets->used;
+   ratio = memory.total / 100.0;
+   value = memory.used / ratio;
+   elm_progressbar_value_set(pb, value / 100);
+   elm_progressbar_unit_format_set(pb,
+                   eina_slstr_printf("%s / %s",
+                   evisum_size_format(memory.used),
+                   evisum_size_format(memory.total)));
+
+   pb = widgets->cached;
+   ratio = memory.total / 100.0;
+   value = memory.cached / ratio;
+   elm_progressbar_value_set(pb, value / 100);
+   elm_progressbar_unit_format_set(pb,
+                   eina_slstr_printf("%s / %s",
+                   evisum_size_format(memory.cached),
+                   evisum_size_format(memory.total)));
+
+   pb = widgets->buffered;
+   ratio = memory.total / 100.0;
+   value = memory.buffered / ratio;
+   elm_progressbar_value_set(pb, value / 100);
+   elm_progressbar_unit_format_set(pb,
+                   eina_slstr_printf("%s / %s",
+                   evisum_size_format(memory.buffered),
+                   evisum_size_format(memory.total)));
+
+   pb = widgets->shared;
+   ratio = memory.total / 100.0;
+   value = memory.shared / ratio;
+   elm_progressbar_value_set(pb, value / 100);
+   elm_progressbar_unit_format_set(pb,
+                   eina_slstr_printf("%s / %s",
+                   evisum_size_format(memory.shared),
+                   evisum_size_format(memory.total)));
+
+   pb = widgets->swap;
+   if (memory.swap_total)
+     {
+        ratio = memory.swap_total / 100.0;
+        value = memory.swap_used / ratio;
+     }
+   else value = 0.0;
+
+   elm_progressbar_value_set(pb, value / 100);
+   elm_progressbar_unit_format_set(pb,
+                   eina_slstr_printf("%s / %s",
+                   evisum_size_format(memory.swap_used),
+                   evisum_size_format(memory.swap_total)));
+
+   return EINA_TRUE;
+}
+
+static void
+_win_del_cb(void *data, Evas_Object *obj,
+            void *event_info EINA_UNUSED)
+{
+   Widgets *widgets;
+   Ui *ui = data;
+
+   ecore_timer_del(ui->timer_memory);
+   ui->timer_memory = NULL;
+
+   widgets = evas_object_data_get(obj, "widgets");
+   if (widgets) free(widgets);
+
+   evas_object_del(obj);
+   ui->mem_visible = EINA_FALSE;
+}
+
 void
-ui_tab_memory_add(Ui *ui)
+ui_win_memory_add(Ui *ui)
 {
-   Evas_Object *parent, *box, *hbox, *frame, *pb;
-   Evas_Object *scroller, *border, *rect, *label, *table;
+   Evas_Object *win, *box, *frame, *pb;
+   Evas_Object *border, *rect, *label, *table;
 
-   parent = ui->content;
+   if (ui->mem_visible) return;
 
-   ui->mem_view = box = elm_box_add(parent);
-   evas_object_size_hint_weight_set(box, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(box, FILL, FILL);
-   elm_table_pack(ui->content, ui->mem_view, 0, 1, 1, 1);
-   evas_object_hide(box);
+   ui->mem_visible = EINA_TRUE;
 
-   ui->mem_activity = hbox = elm_box_add(box);
-   evas_object_size_hint_weight_set(hbox, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(hbox, FILL, FILL);
-   evas_object_show(hbox);
+   Widgets *widgets = calloc(1, sizeof(Widgets));
+   if (!widgets) return;
 
-   frame = elm_frame_add(box);
+   win = elm_win_util_standard_add("evisum", _("Memory Usage"));
+   evas_object_size_hint_weight_set(win, EXPAND, EXPAND);
+   evas_object_size_hint_align_set(win, FILL, FILL);
+
+   frame = elm_frame_add(win);
    evas_object_size_hint_weight_set(frame, EXPAND, EXPAND);
    evas_object_size_hint_align_set(frame, FILL, FILL);
    elm_object_style_set(frame, "pad_small");
    evas_object_show(frame);
 
-   scroller = elm_scroller_add(parent);
-   evas_object_size_hint_weight_set(scroller, EXPAND, EXPAND);
-   evas_object_size_hint_align_set(scroller, FILL, FILL);
-   elm_scroller_policy_set(scroller,
-                   ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
-   evas_object_show(scroller);
-
-   box = elm_box_add(ui->content);
+   box = elm_box_add(win);
    evas_object_size_hint_align_set(box, FILL, FILL);
    evas_object_size_hint_weight_set(box, EXPAND, EXPAND);
    evas_object_show(box);
 
-   table = elm_table_add(parent);
+   table = elm_table_add(win);
    evas_object_size_hint_weight_set(table, EXPAND, EXPAND);
    evas_object_size_hint_align_set(table, FILL, FILL);
-   elm_table_padding_set(table, 0, 40 * elm_config_scale_get());
    evas_object_show(table);
 
    label = _label_mem(box, _("Used"));
-   ui->progress_mem_used = pb = _progress_add(table);
+   widgets->used = pb = _progress_add(table);
    elm_table_pack(table, label, 0, 0, 1, 1);
    elm_table_pack(table, pb, 1, 0, 1, 1);
 
    label = _label_mem(box, _("Cached"));
-   ui->progress_mem_cached = pb = _progress_add(table);
+   widgets->cached = pb = _progress_add(table);
    elm_table_pack(table, label, 0, 1, 1, 1);
    elm_table_pack(table, pb, 1, 1, 1, 1);
 
    label = _label_mem(box, _("Buffered"));
-   ui->progress_mem_buffered = pb = _progress_add(table);
+   widgets->buffered = pb = _progress_add(table);
    elm_table_pack(table, label, 0, 2, 1, 1);
    elm_table_pack(table, pb, 1, 2, 1, 1);
 
    label = _label_mem(box, _("Shared"));
-   ui->progress_mem_shared = pb = _progress_add(table);
+   widgets->shared = pb = _progress_add(table);
    elm_table_pack(table, label, 0, 3, 1, 1);
    elm_table_pack(table, pb, 1, 3, 1, 1);
 
    label = _label_mem(box, _("Swapped"));
-   ui->progress_mem_swap = pb = _progress_add(frame);
+   widgets->swap = pb = _progress_add(frame);
    elm_table_pack(table, label, 0, 4, 1, 1);
    elm_table_pack(table, pb, 1, 4, 1, 1);
 
-   border = elm_frame_add(parent);
+   border = elm_frame_add(win);
    elm_object_style_set(border, "pad_small");
    evas_object_size_hint_weight_set(border, EXPAND, EXPAND);
    evas_object_size_hint_align_set(border, FILL, FILL);
    evas_object_show(border);
    elm_object_content_set(border, table);
 
-   table = elm_table_add(parent);
+   table = elm_table_add(win);
    evas_object_size_hint_weight_set(table, EXPAND, EXPAND);
    evas_object_size_hint_align_set(table, FILL, FILL);
    evas_object_show(table);
 
-   rect = evas_object_rectangle_add(evas_object_evas_get(parent));
+   rect = evas_object_rectangle_add(evas_object_evas_get(win));
    evas_object_size_hint_max_set(rect, MISC_MAX_WIDTH, -1);
    evas_object_size_hint_min_set(rect, MISC_MIN_WIDTH, 1);
 
    elm_table_pack(table, rect, 0, 0, 1, 1);
    elm_table_pack(table, border, 0, 0, 1, 1);
 
-   elm_object_content_set(scroller, table);
-   elm_object_content_set(frame, scroller);
-   elm_box_pack_end(ui->mem_view, frame);
-}
+   elm_object_content_set(frame, table);
+   elm_object_content_set(win, frame);
 
-void
-ui_tab_memory_update(Ui *ui, Sys_Info *info)
-{
-   Evas_Object *pb;
-   double ratio, value;
-
-   if (!ui->mem_visible)
-     return;
+   evas_object_data_set(win, "widgets", widgets);
+   evas_object_smart_callback_add(win, "delete,request", _win_del_cb, ui);
+   evisum_child_window_show(ui->win, win);
+   evas_object_resize(win, -1, -1);
 
-   if (ui->zfs_mounted)
-     info->memory.used += info->memory.zfs_arc_used;
+   _memory_update(widgets);
 
-   pb = ui->progress_mem_used;
-   ratio = info->memory.total / 100.0;
-   value = info->memory.used / ratio;
-   elm_progressbar_value_set(pb, value / 100);
-   elm_progressbar_unit_format_set(pb,
-                   eina_slstr_printf("%s / %s",
-                   evisum_size_format(info->memory.used),
-                   evisum_size_format(info->memory.total)));
-
-   pb = ui->progress_mem_cached;
-   ratio = info->memory.total / 100.0;
-   value = info->memory.cached / ratio;
-   elm_progressbar_value_set(pb, value / 100);
-   elm_progressbar_unit_format_set(pb,
-                   eina_slstr_printf("%s / %s",
-                   evisum_size_format(info->memory.cached),
-                   evisum_size_format(info->memory.total)));
-
-   pb = ui->progress_mem_buffered;
-   ratio = info->memory.total / 100.0;
-   value = info->memory.buffered / ratio;
-   elm_progressbar_value_set(pb, value / 100);
-   elm_progressbar_unit_format_set(pb,
-                   eina_slstr_printf("%s / %s",
-                   evisum_size_format(info->memory.buffered),
-                   evisum_size_format(info->memory.total)));
-
-   pb = ui->progress_mem_shared;
-   ratio = info->memory.total / 100.0;
-   value = info->memory.shared / ratio;
-   elm_progressbar_value_set(pb, value / 100);
-   elm_progressbar_unit_format_set(pb,
-                   eina_slstr_printf("%s / %s",
-                   evisum_size_format(info->memory.shared),
-                   evisum_size_format(info->memory.total)));
-
-   pb = ui->progress_mem_swap;
-   if (info->memory.swap_total)
-     {
-        ratio = info->memory.swap_total / 100.0;
-        value = info->memory.swap_used / ratio;
-     }
-   else value = 0.0;
-
-   elm_progressbar_value_set(pb, value / 100);
-   elm_progressbar_unit_format_set(pb,
-                   eina_slstr_printf("%s / %s",
-                   evisum_size_format(info->memory.swap_used),
-                   evisum_size_format(info->memory.swap_total)));
+   ui->timer_memory = ecore_timer_add(3.0, _memory_update, widgets);
 }
-
diff --git a/src/bin/ui/ui_memory.h b/src/bin/ui/ui_memory.h
index 1515358..0cbe90c 100644
--- a/src/bin/ui/ui_memory.h
+++ b/src/bin/ui/ui_memory.h
@@ -5,9 +5,7 @@
 #include "../system/machine.h"
 
 void
-ui_tab_memory_add(Ui *ui);
+ui_win_memory_add(Ui *ui);
 
-void
-ui_tab_memory_update(Ui *ui, Sys_Info *info);
 
 #endif
diff --git a/src/bin/ui/ui_misc.c b/src/bin/ui/ui_misc.c
index baab4ed..ccf3fc1 100644
--- a/src/bin/ui/ui_misc.c
+++ b/src/bin/ui/ui_misc.c
@@ -1,4 +1,5 @@
 #include "ui_misc.h"
+#include "system/machine.h"
 
 static Eina_Bool
 _battery_usage_add(Evas_Object *box, power_t *power)
@@ -67,14 +68,14 @@ _battery_usage_add(Evas_Object *box, power_t *power)
 }
 
 static Eina_Bool
-_sensor_usage_add(Evas_Object *box, Sys_Info *info)
+_sensor_usage_add(Evas_Object *box, sensor_t **sensors, int count)
 {
    Evas_Object *frame, *vbox, *hbox, *pb, *ic, *label;
    sensor_t *snsr;
 
-   for (int i = 0; i < info->sensor_count; i++)
+   for (int i = 0; i < count; i++)
      {
-        snsr = info->sensors[i];
+        snsr = sensors[i];
 
         frame = elm_frame_add(box);
         evas_object_size_hint_align_set(frame, FILL, FILL);
@@ -124,7 +125,7 @@ _sensor_usage_add(Evas_Object *box, Sys_Info *info)
         elm_box_pack_end(box, frame);
      }
 
-   return !!info->sensor_count;
+   return count;
 }
 
 static char *
@@ -248,18 +249,111 @@ _separator_add(Evas_Object *box)
    elm_box_pack_end(box, hbox);
 }
 
+static void
+_misc_free(power_t *power, sensor_t **sensors, int sensor_count)
+{
+   for (int i = 0; i < power->battery_count; i++)
+     {
+        if (power->batteries[i]->name)
+          free(power->batteries[i]->name);
+#if defined(__OpenBSD__)
+        if (power->batteries[i]->mibs)
+          free(power->batteries[i]->mibs);
+#endif
+        free(power->batteries[i]);
+     }
+   if (power->batteries)
+     free(power->batteries);
+
+   for (int i = 0; i < sensor_count; i++)
+     {
+        sensor_t *snsr = sensors[i];
+        if (snsr->name)
+          free(snsr->name);
+        free(snsr);
+     }
+   if (sensors)
+     free(sensors);
+}
+
+static Eina_Bool
+_misc_update(void *data)
+{
+   Ui *ui;
+   power_t power;
+   sensor_t **sensors;
+   int sensor_count = 0;
+   Evas_Object *box, *frame;
+
+   ui = data;
+
+   elm_box_clear(ui->misc_activity);
+
+   box = elm_box_add(ui->misc_activity);
+   evas_object_size_hint_align_set(box, FILL, FILL);
+   evas_object_size_hint_weight_set(box, EXPAND, EXPAND);
+   evas_object_show(box);
+
+   _network_usage_add(ui, box, ui->network_usage.incoming, EINA_TRUE);
+   _network_usage_add(ui, box, ui->network_usage.outgoing, EINA_FALSE);
+   _separator_add(box);
+
+   memset(&power, 0, sizeof(power));
+   system_power_state_get(&power);
+
+   if (_battery_usage_add(box, &power))
+     _separator_add(box);
+
+   sensors = system_sensors_thermal_get(&sensor_count);
+   if (sensors)
+     {
+        _sensor_usage_add(box, sensors, sensor_count);
+        _separator_add(box);
+     }
+
+   _misc_free(&power, sensors, sensor_count);
+
+   frame = elm_frame_add(ui->misc_activity);
+   evas_object_size_hint_align_set(frame, FILL, FILL);
+   evas_object_size_hint_weight_set(frame, EXPAND, EXPAND);
+   elm_object_style_set(frame, "pad_huge");
+   evas_object_show(frame);
+   elm_object_content_set(frame, box);
+   elm_box_pack_end(ui->misc_activity, frame);
+
+   return EINA_TRUE;
+}
+
+static void
+_win_del_cb(void *data, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   Ui *ui = data;
+
+   if (ui->timer_misc)
+     ecore_timer_del(ui->timer_misc);
+   ui->timer_misc = NULL;
+
+   evas_object_del(obj);
+   ui->misc_visible = EINA_FALSE;
+}
+
 void
-ui_tab_misc_add(Ui *ui)
+ui_win_misc_add(Ui *ui)
 {
-   Evas_Object *parent, *box, *hbox, *frame, *scroller;
+   Evas_Object *win, *box, *hbox, *frame, *scroller;
    Evas_Object *table, *border, *rect;
 
-   parent = ui->content;
+   if (ui->misc_visible) return;
+   ui->misc_visible = EINA_TRUE;
+
+   win = elm_win_util_standard_add("evisum", _("Stuff"));
+   evas_object_size_hint_weight_set(win, EXPAND, EXPAND);
+   evas_object_size_hint_align_set(win, FILL, FILL);
 
-   ui->misc_view = box = elm_box_add(parent);
+   box = elm_box_add(win);
    evas_object_size_hint_weight_set(box, EXPAND, EXPAND);
    evas_object_size_hint_align_set(box, FILL, FILL);
-   elm_table_pack(ui->content, ui->misc_view, 0, 1, 1, 1);
    evas_object_hide(box);
 
    ui->misc_activity = hbox = elm_box_add(box);
@@ -273,7 +367,7 @@ ui_tab_misc_add(Ui *ui)
    evas_object_size_hint_align_set(frame, FILL, FILL);
    evas_object_show(frame);
 
-   scroller = elm_scroller_add(parent);
+   scroller = elm_scroller_add(win);
    evas_object_size_hint_weight_set(scroller, EXPAND, EXPAND);
    evas_object_size_hint_align_set(scroller, FILL, FILL);
    elm_scroller_policy_set(scroller,
@@ -287,12 +381,12 @@ ui_tab_misc_add(Ui *ui)
    evas_object_show(border);
    elm_object_content_set(border, hbox);
 
-   table = elm_table_add(parent);
+   table = elm_table_add(win);
    evas_object_size_hint_weight_set(table, EXPAND, EXPAND);
    evas_object_size_hint_align_set(table, FILL, FILL);
    evas_object_show(table);
 
-   rect = evas_object_rectangle_add(evas_object_rectangle_add(parent));
+   rect = evas_object_rectangle_add(evas_object_rectangle_add(win));
    evas_object_size_hint_max_set(rect, MISC_MAX_WIDTH, -1);
    evas_object_size_hint_min_set(rect, MISC_MIN_WIDTH, 1);
 
@@ -302,39 +396,13 @@ ui_tab_misc_add(Ui *ui)
    elm_object_content_set(scroller, table);
    elm_object_content_set(frame,scroller);
    elm_box_pack_end(box, frame);
-}
+   elm_object_content_set(win, box);
 
-void
-ui_tab_misc_update(Ui *ui, Sys_Info *info)
-{
-   Evas_Object *box, *frame;
+   evas_object_smart_callback_add(win, "delete,request", _win_del_cb, ui);
+   evisum_child_window_show(ui->win, win);
 
-   if (!ui->misc_visible)
-     return;
-
-   elm_box_clear(ui->misc_activity);
+   _misc_update(ui);
 
-   box = elm_box_add(ui->content);
-   evas_object_size_hint_align_set(box, FILL, FILL);
-   evas_object_size_hint_weight_set(box, EXPAND, EXPAND);
-   evas_object_show(box);
-
-   _network_usage_add(ui, box, info->network_usage.incoming, EINA_TRUE);
-   _network_usage_add(ui, box, info->network_usage.outgoing, EINA_FALSE);
-   _separator_add(box);
-   if (_battery_usage_add(box, &info->power))
-     _separator_add(box);
-   if (_sensor_usage_add(box, info))
-     _separator_add(box);
-
-   frame = elm_frame_add(ui->misc_activity);
-   evas_object_size_hint_align_set(frame, FILL, FILL);
-   evas_object_size_hint_weight_set(frame, EXPAND, EXPAND);
-   elm_object_style_set(frame, "pad_huge");
-   evas_object_show(frame);
-   elm_object_content_set(frame, box);
-
-   elm_box_pack_end(ui->misc_activity, frame);
+   ui->timer_misc = ecore_timer_add(3.0, _misc_update, ui);
 }
 
-
diff --git a/src/bin/ui/ui_misc.h b/src/bin/ui/ui_misc.h
index d634197..1131415 100644
--- a/src/bin/ui/ui_misc.h
+++ b/src/bin/ui/ui_misc.h
@@ -5,9 +5,6 @@
 #include "../system/machine.h"
 
 void
-ui_tab_misc_add(Ui *ui);
-
-void
-ui_tab_misc_update(Ui *ui, Sys_Info *info);
+ui_win_misc_add(Ui *ui);
 
 #endif
diff --git a/src/bin/ui/ui_util.c b/src/bin/ui/ui_util.c
index 195414d..b77c24a 100644
--- a/src/bin/ui/ui_util.c
+++ b/src/bin/ui/ui_util.c
@@ -189,3 +189,19 @@ evisum_ui_textblock_font_size_get(Evas_Object *tb)
 
    return size;
 }
+
+void
+evisum_child_window_show(Evas_Object *parent, Evas_Object *win)
+{
+   Evas_Coord x, y, w, h;
+
+   evas_object_resize(win, UI_CHILD_WIN_WIDTH, UI_CHILD_WIN_HEIGHT);
+   evas_object_geometry_get(parent, &x, &y, &w, &h);
+   if (x > 0 && y > 0)
+     evas_object_move(win, x + 20, y + 10);
+   else
+     elm_win_center(win, EINA_TRUE, EINA_TRUE);
+
+   evas_object_show(win);
+}
+
diff --git a/src/bin/ui/ui_util.h b/src/bin/ui/ui_util.h
index 9121893..d407c9f 100644
--- a/src/bin/ui/ui_util.h
+++ b/src/bin/ui/ui_util.h
@@ -10,8 +10,11 @@
 #define TAB_BTN_HEIGHT 32
 #define BTN_WIDTH      80
 #define BTN_HEIGHT     24
-#define MISC_MAX_WIDTH 640
-#define MISC_MIN_WIDTH 480
+
+#define UI_CHILD_WIN_WIDTH  640
+#define UI_CHILD_WIN_HEIGHT 480
+#define MISC_MAX_WIDTH      640
+#define MISC_MIN_WIDTH      480
 
 Evas_Object *
 evisum_ui_tab_add(Evas_Object *parent, Evas_Object **alias, const char *text,
@@ -33,5 +36,7 @@ evisum_ui_textblock_font_size_get(Evas_Object *tb);
 void
 evisum_ui_textblock_font_size_set(Evas_Object *tb, int new_size);
 
+void
+evisum_child_window_show(Evas_Object *parent, Evas_Object *win);
 
 #endif

-- 


Reply via email to