netstar pushed a commit to branch master.

http://git.enlightenment.org/apps/evisum.git/commit/?id=860358c3c88e725a49819213835278cd37991b01

commit 860358c3c88e725a49819213835278cd37991b01
Author: Alastair Poole <[email protected]>
Date:   Tue Oct 27 03:33:01 2020 +0000

    process: processs tree (proc view).
    
    Also add the command line evisum -p <pid> to the IPC.
    
    Not done...WIP.
---
 src/bin/evisum_server.c      |  10 +++-
 src/bin/evisum_server.h      |   2 +-
 src/bin/main.c               |  11 +++-
 src/bin/ui/ui.c              |  28 +++++----
 src/bin/ui/ui.h              |   2 +-
 src/bin/ui/ui_process_view.c | 137 +++++++++++++++++++++++++++++++++++++++++--
 src/bin/ui/ui_process_view.h |   3 +
 7 files changed, 171 insertions(+), 22 deletions(-)

diff --git a/src/bin/evisum_server.c b/src/bin/evisum_server.c
index a8ceb4a..0834b48 100644
--- a/src/bin/evisum_server.c
+++ b/src/bin/evisum_server.c
@@ -27,12 +27,15 @@ _evisum_server_server_client_connect_cb(void *data 
EINA_UNUSED, int type EINA_UN
    Ecore_Con_Event_Client_Data *ev;
    Evisum_Action *action;
    Ui *ui;
+   int *pid;
 
    ev = event;
    action = ev->data;
    ui = data;
 
-   evisum_ui_activate(ui, *action);
+   pid = ev->data + sizeof(int);
+
+   evisum_ui_activate(ui, *action, *pid);
 
    ecore_con_client_del(ev->client);
 
@@ -69,6 +72,7 @@ evisum_server_init(void *data)
 typedef struct _Evisum_Server_Client {
    Ecore_Con_Server *srv;
    Evisum_Action     action;
+   int               pid;
    Eina_Bool         success;
 } Evisum_Server_Client;
 
@@ -120,13 +124,14 @@ _evisum_server_client_connect_cb(void *data, int type 
EINA_UNUSED, void *event E
    if (client->srv != srv) return ECORE_CALLBACK_RENEW;
 
    ecore_con_server_send(srv, &client->action, sizeof(Evisum_Action));
+   ecore_con_server_send(srv, &client->pid, sizeof(int));
    ecore_con_server_flush(srv);
 
    return ECORE_CALLBACK_DONE;
 }
 
 Eina_Bool
-evisum_server_client_add(Evisum_Action action)
+evisum_server_client_add(Evisum_Action action, int pid)
 {
    Evisum_Server_Client *client;
    Ecore_Con_Server *srv = ecore_con_server_connect(ECORE_CON_LOCAL_USER, 
LISTEN_SOCKET_NAME, 0, NULL);
@@ -139,6 +144,7 @@ evisum_server_client_add(Evisum_Action action)
    if (!client) return EINA_FALSE;
 
    client->action = action;
+   client->pid = pid;
    client->srv = srv;
 
    ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, 
_evisum_server_client_connect_cb, client);
diff --git a/src/bin/evisum_server.h b/src/bin/evisum_server.h
index 72031a0..ef79f60 100644
--- a/src/bin/evisum_server.h
+++ b/src/bin/evisum_server.h
@@ -11,6 +11,6 @@ void
 evisum_server_shutdown(void);
 
 Eina_Bool
-evisum_server_client_add(Evisum_Action action);
+evisum_server_client_add(Evisum_Action action, int pid);
 
 #endif
diff --git a/src/bin/main.c b/src/bin/main.c
index ac7b203..5d4cfd3 100644
--- a/src/bin/main.c
+++ b/src/bin/main.c
@@ -15,7 +15,7 @@ int
 main(int argc, char **argv)
 {
    Ui *ui;
-   int i;
+   int i, pid = -1;
    Evisum_Action action = EVISUM_ACTION_DEFAULT;
 
    for (i = 0; i < argc; i++)
@@ -35,6 +35,11 @@ main(int argc, char **argv)
           action = EVISUM_ACTION_STORAGE;
         else if (!strcmp(argv[i], "-s"))
           action = EVISUM_ACTION_SENSORS;
+        else if (!strcmp(argv[i], "-p") && i < (argc -1))
+          {
+             action = EVISUM_ACTION_PROCESS;
+             pid = atoi(argv[i+1]);
+          }
      }
 
    eina_init();
@@ -49,7 +54,7 @@ main(int argc, char **argv)
    textdomain(PACKAGE);
 #endif
 
-   if (evisum_server_client_add(action))
+   if (evisum_server_client_add(action, pid))
      {
        ecore_main_loop_begin();
        return 0;
@@ -59,7 +64,7 @@ main(int argc, char **argv)
    if (!ui) return 1;
 
    evisum_server_init(ui);
-   evisum_ui_activate(ui, action);
+   evisum_ui_activate(ui, action, pid);
 
    ecore_main_loop_begin();
 
diff --git a/src/bin/ui/ui.c b/src/bin/ui/ui.c
index 4cb1a62..bd65c1f 100644
--- a/src/bin/ui/ui.c
+++ b/src/bin/ui/ui.c
@@ -925,24 +925,30 @@ _item_menu_actions_add(Evas_Object *menu, Elm_Object_Item 
*menu_it,
                      _("Debug"), _item_menu_debug_cb, ui);
 }
 
+static void
+_process_win_add(Evas_Object *parent, int pid, int delay)
+{
+   Proc_Info *proc;
+
+   proc = proc_info_by_pid(pid);
+   if (!proc) return;
+
+   ui_process_win_add(parent, proc->pid, proc->command, delay);
+
+   proc_info_free(proc);
+}
+
 static void
 _item_menu_properties_cb(void *data, Evas_Object *obj EINA_UNUSED,
                          void *event_info EINA_UNUSED)
 {
    Ui *ui;
-   Proc_Info *proc;
 
    ui = data;
 
    _item_menu_cancel_cb(ui, NULL, NULL);
 
-   proc = proc_info_by_pid(ui->selected_pid);
-   if (!proc) return;
-
-   ui_process_win_add(ui->win, proc->pid, proc->command,
-                      ui->settings.poll_delay);
-
-   proc_info_free(proc);
+   _process_win_add(ui->win, ui->selected_pid, ui->settings.poll_delay);
 }
 
 static Evas_Object *
@@ -1830,14 +1836,16 @@ _ui_init_system_probe(Ui *ui)
 }
 
 void
-evisum_ui_activate(Ui *ui, Evisum_Action action)
+evisum_ui_activate(Ui *ui, Evisum_Action action, int pid)
 {
    switch (action)
      {
        case EVISUM_ACTION_DEFAULT:
-       case EVISUM_ACTION_PROCESS:
          ui_main_win_add(ui);
          break;
+       case EVISUM_ACTION_PROCESS:
+         _process_win_add(NULL, pid, 3);
+         break;
        case EVISUM_ACTION_CPU:
          ui_win_cpu_add(ui);
          break;
diff --git a/src/bin/ui/ui.h b/src/bin/ui/ui.h
index a5a6197..bb1189e 100644
--- a/src/bin/ui/ui.h
+++ b/src/bin/ui/ui.h
@@ -126,6 +126,6 @@ void
 evisum_ui_shutdown(Ui *ui);
 
 void
-evisum_ui_activate(Ui *ui, Evisum_Action action);
+evisum_ui_activate(Ui *ui, Evisum_Action action, int pid);
 
 #endif
diff --git a/src/bin/ui/ui_process_view.c b/src/bin/ui/ui_process_view.c
index a5ecef5..8a0a1d0 100644
--- a/src/bin/ui/ui_process_view.c
+++ b/src/bin/ui/ui_process_view.c
@@ -326,9 +326,9 @@ _thread_info_set(Ui_Process *ui, Proc_Info *proc)
 
    EINA_LIST_FREE(threads, t)
      {
-       if (!it)
+        if (!it)
           _item_del(t, NULL);
-       else
+        else
           {
              Thread_Info *prev = elm_object_item_data_get(it);
              if (prev)
@@ -361,6 +361,67 @@ _time_string(int64_t epoch)
    return strdup(buf);
 }
 
+static char *
+_tree_text_get(void *data, Evas_Object *obj, const char *part)
+
+{
+   Proc_Info *child = data;
+   char buf[256];
+
+   snprintf(buf, sizeof(buf), "%s (%d) ", child->command, child->pid);
+
+   return strdup(buf);
+}
+
+static void
+_tree_populate(Evas_Object *genlist_tree, Elm_Object_Item *parent, Eina_List 
*children)
+{
+   Elm_Genlist_Item_Class *itc;
+   Eina_List *l;
+   Elm_Object_Item *it;
+   Proc_Info *child;
+
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.content_get = NULL;
+   itc->func.text_get = _tree_text_get;
+   itc->func.filter_get = NULL;
+   itc->func.del = NULL;
+
+   EINA_LIST_FOREACH(children, l, child)
+     {
+        it = elm_genlist_item_append(genlist_tree, itc, child, parent,
+                      child->children ? ELM_GENLIST_ITEM_TREE : 
ELM_GENLIST_ITEM_NONE, NULL, NULL);
+        elm_genlist_item_update(it);
+        if (child->children)
+          _tree_populate(genlist_tree, it, child->children);
+     }
+
+   elm_genlist_item_class_free(itc);
+}
+
+static Eina_Bool
+_tree_view_update(void *data)
+{
+   Eina_List *children, *l;
+   Proc_Info *child;
+   Ui_Process *ui = data;
+
+   children = proc_info_pid_children_get(ui->selected_pid);
+   EINA_LIST_FOREACH(children, l, child)
+     {
+        if (child->pid == ui->selected_pid)
+          {
+             _tree_populate(ui->genlist_tree, NULL, child->children);
+             break;
+          }
+     }
+   elm_genlist_realized_items_update(ui->genlist_tree);
+
+   // XXX: free (tired now)...
+   return EINA_TRUE;
+}
+
 static Eina_Bool
 _proc_info_update(void *data)
 {
@@ -856,6 +917,43 @@ _threads_tab_add(Evas_Object *parent, Ui_Process *ui)
    return frame;
 }
 
+static Evas_Object *
+_tree_tab_add(Evas_Object *parent, Ui_Process *ui)
+{
+   Evas_Object *frame, *box, *genlist;
+   int r, g, b, a;
+
+   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_text_set(frame, _("Children"));
+
+   if (evisum_ui_effects_enabled_get())
+     {
+        evas_object_color_get(frame, &r, &g, &b, &a);
+        evas_object_color_set(frame, r * 0.75, g * 0.75, b * 0.75, a * 0.75);
+     }
+
+   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);
+   elm_object_content_set(frame, box);
+
+   ui->genlist_tree = genlist = elm_genlist_add(parent);
+   evas_object_data_set(genlist, "ui", ui);
+   elm_object_focus_allow_set(genlist, EINA_FALSE);
+   elm_genlist_homogeneous_set(genlist, EINA_TRUE);
+   elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_NONE);
+   evas_object_size_hint_weight_set(genlist, EXPAND, EXPAND);
+   evas_object_size_hint_align_set(genlist, FILL, FILL);
+   evas_object_show(genlist);
+
+   elm_box_pack_end(box, genlist);
+
+   return frame;
+}
+
 static Evas_Object *
 _info_tab_add(Evas_Object *parent, Ui_Process *ui)
 {
@@ -898,8 +996,10 @@ _hide_all(Ui_Process *ui, Evas_Object *btn)
    elm_object_disabled_set(ui->btn_main, EINA_FALSE);
    elm_object_disabled_set(ui->btn_info, EINA_FALSE);
    elm_object_disabled_set(ui->btn_thread, EINA_FALSE);
+   elm_object_disabled_set(ui->btn_tree, EINA_FALSE);
    elm_object_disabled_set(btn, EINA_TRUE);
    evas_object_hide(ui->main_view);
+   evas_object_hide(ui->tree_view);
    evas_object_hide(ui->info_view);
    evas_object_hide(ui->thread_view);
 }
@@ -916,6 +1016,18 @@ _btn_process_clicked_cb(void *data, Evas_Object *obj 
EINA_UNUSED,
    evas_object_show(ui->main_view);
 }
 
+static void
+_btn_tree_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                     void *event_info EINA_UNUSED)
+{
+   Ui_Process *ui;
+
+   ui = data;
+
+   _hide_all(ui, obj);
+   evas_object_show(ui->tree_view);
+}
+
 static void
 _btn_threads_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
                         void *event_info EINA_UNUSED)
@@ -956,7 +1068,7 @@ _btn_info_clicked_cb(void *data, Evas_Object *obj 
EINA_UNUSED,
              elm_object_text_set(ui->entry_info,
                                  eina_slstr_printf(_("No documentation found 
for %s."),
                                  ui->selected_cmd));
-         }
+          }
      }
    else
      {
@@ -1017,6 +1129,17 @@ _tabs_add(Evas_Object *parent, Ui_Process *ui)
    evas_object_size_hint_align_set(pad, FILL, FILL);
    evas_object_show(pad);
 
+   btn = evisum_ui_tab_add(parent, &ui->btn_tree, _("Children"),
+                   _btn_tree_clicked_cb, ui);
+   elm_object_content_set(pad, btn);
+   elm_box_pack_end(hbox, pad);
+
+   pad = elm_frame_add(parent);
+   elm_object_style_set(pad, "pad_small");
+   evas_object_size_hint_weight_set(pad, 0.0, EXPAND);
+   evas_object_size_hint_align_set(pad, FILL, FILL);
+   evas_object_show(pad);
+
    btn = evisum_ui_tab_add(parent, &ui->btn_thread, _("Threads"),
                    _btn_threads_clicked_cb, ui);
    elm_object_content_set(pad, btn);
@@ -1112,10 +1235,12 @@ ui_process_win_add(Evas_Object *parent_win, int pid, 
const char *cmd, int poll_d
    evas_object_show(ui->content);
 
    ui->main_view = _process_tab_add(win, ui);
+   ui->tree_view = _tree_tab_add(win, ui);
    ui->thread_view = _threads_tab_add(win, ui);
    ui->info_view = _info_tab_add(win, ui);
 
    elm_table_pack(ui->content, ui->info_view, 0, 0, 1, 1);
+   elm_table_pack(ui->content, ui->tree_view, 0, 0, 1, 1);
    elm_table_pack(ui->content, ui->main_view, 0, 0, 1, 1);
    elm_table_pack(ui->content, ui->thread_view, 0, 0, 1, 1);
 
@@ -1126,8 +1251,9 @@ ui_process_win_add(Evas_Object *parent_win, int pid, 
const char *cmd, int poll_d
                    _win_resize_cb, ui);
 
    evas_object_resize(win, 480 * elm_config_scale_get(), -1);
-   evas_object_geometry_get(parent_win, &x, &y, &w, &h);
-   if (x > 0 && y > 0)
+   if (parent_win)
+     evas_object_geometry_get(parent_win, &x, &y, &w, &h);
+   if (parent_win && x > 0 && y > 0)
      evas_object_move(win, x + 20, y + 10);
    else
      elm_win_center(win, EINA_TRUE, EINA_TRUE);
@@ -1139,5 +1265,6 @@ ui_process_win_add(Evas_Object *parent_win, int pid, 
const char *cmd, int poll_d
    eina_lock_new(&_lock);
 
    _proc_info_update(ui);
+   _tree_view_update(ui);
 }
 
diff --git a/src/bin/ui/ui_process_view.h b/src/bin/ui/ui_process_view.h
index 4acce12..606e8a3 100644
--- a/src/bin/ui/ui_process_view.h
+++ b/src/bin/ui/ui_process_view.h
@@ -9,16 +9,19 @@ typedef struct _Ui_Process {
    Evas_Object  *content;
 
    Evas_Object  *btn_main;
+   Evas_Object  *btn_tree;
    Evas_Object  *btn_info;
    Evas_Object  *btn_thread;
 
    Evas_Object  *main_view;
+   Evas_Object  *tree_view;
    Evas_Object  *info_view;
    Evas_Object  *thread_view;
 
    Evas_Object  *entry_info;
 
    Evas_Object     *genlist_threads;
+   Evas_Object     *genlist_tree;
    Evisum_Ui_Cache *cache;
 
    Evas_Object  *entry_pid_cmd;

-- 


Reply via email to