netstar pushed a commit to branch master.

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

commit a62a93efd0c389ee11f79ed5dcb3dcfb43c5b45c
Author: Alastair Poole <[email protected]>
Date:   Sat Apr 18 13:41:25 2020 +0100

    ui: Add process menu.
    
    Also add user names -> id
---
 data/images/cancel.png  | Bin 0 -> 3300 bytes
 data/images/kill.png    | Bin 0 -> 2847 bytes
 data/images/meson.build |   2 +
 data/images/start.png   | Bin 0 -> 4261 bytes
 data/images/stop.png    | Bin 0 -> 4645 bytes
 data/images/window.png  | Bin 0 -> 2642 bytes
 src/bin/ui.c            | 104 +++++++++++++++++++++++++++++++++++++++++++++++-
 7 files changed, 104 insertions(+), 2 deletions(-)

diff --git a/data/images/cancel.png b/data/images/cancel.png
new file mode 100644
index 0000000..8ee3534
Binary files /dev/null and b/data/images/cancel.png differ
diff --git a/data/images/kill.png b/data/images/kill.png
new file mode 100644
index 0000000..6e85e9d
Binary files /dev/null and b/data/images/kill.png differ
diff --git a/data/images/meson.build b/data/images/meson.build
index 68628bb..9bb8d75 100644
--- a/data/images/meson.build
+++ b/data/images/meson.build
@@ -1,3 +1,5 @@
 install_data('go-up.png', 'go-down.png',
              'battery.png', 'network.png',
+             'window.png', 'start.png', 'stop.png',
+             'kill.png', 'cancel.png',
              install_dir: join_paths(dir_data, 'evisum/images'))
diff --git a/data/images/start.png b/data/images/start.png
new file mode 100644
index 0000000..81cc076
Binary files /dev/null and b/data/images/start.png differ
diff --git a/data/images/stop.png b/data/images/stop.png
new file mode 100644
index 0000000..a67822c
Binary files /dev/null and b/data/images/stop.png differ
diff --git a/data/images/window.png b/data/images/window.png
new file mode 100644
index 0000000..6ad779c
Binary files /dev/null and b/data/images/window.png differ
diff --git a/src/bin/ui.c b/src/bin/ui.c
index 0dcf6d0..fc3ba87 100644
--- a/src/bin/ui.c
+++ b/src/bin/ui.c
@@ -848,6 +848,7 @@ _item_del(void *data, Evas_Object *obj EINA_UNUSED)
 {
    Proc_Info *proc = data;
    free(proc);
+   proc = NULL;
 }
 
 static Evas_Object *
@@ -875,7 +876,7 @@ _item_create(Evas_Object *parent)
 
    label = elm_label_add(table);
    evas_object_data_set(table, "proc_uid", label);
-   evas_object_size_hint_align_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(label, 1.0, EVAS_HINT_EXPAND);
    evas_object_size_hint_weight_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(label);
    rect = evas_object_rectangle_add(table);
@@ -980,6 +981,7 @@ _content_get(void *data, Evas_Object *obj, const char 
*source)
 {
    Ui *ui;
    Proc_Info *proc;
+   struct passwd *pwd_entry;
    Evas_Object *l, *r;
    Evas_Coord w, h;
 
@@ -1005,7 +1007,11 @@ _content_get(void *data, Evas_Object *obj, const char 
*source)
 
    evas_object_geometry_get(ui->btn_uid, NULL, NULL, &w, &h);
    l = evas_object_data_get(it->obj, "proc_uid");
-   elm_object_text_set(l, eina_slstr_printf("%d", proc->uid));
+   pwd_entry = getpwuid(proc->uid);
+   if (pwd_entry)
+     elm_object_text_set(l, pwd_entry->pw_name);
+   else
+     elm_object_text_set(l, eina_slstr_printf("%d", proc->uid));
    r = evas_object_data_get(l, "rect");
    evas_object_size_hint_min_set(r, w, 1);
 
@@ -1515,6 +1521,98 @@ _btn_kill_clicked_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_info
    kill(ui->selected_pid, SIGKILL);
 }
 
+static void
+_item_menu_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *ev 
EINA_UNUSED)
+{
+   evas_object_del(obj);
+}
+
+static void
+_item_menu_start_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Proc_Info *proc;
+
+   proc = data;
+   if (!proc) return;
+
+   kill(proc->pid, SIGCONT);
+}
+
+static void
+_item_menu_stop_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Proc_Info *proc;
+
+   proc = data;
+   if (!proc) return;
+
+   kill(proc->pid, SIGSTOP);
+}
+
+static void
+_item_menu_kill_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Proc_Info *proc;
+
+   proc = data;
+   if (!proc) return;
+
+   kill(proc->pid, SIGKILL);
+}
+
+static
+Evas_Object *
+_item_menu_create(Ui *ui, Proc_Info *proc)
+{
+   Elm_Object_Item *menu_main, *menu_it, *menu_it2;
+   Evas_Object *menu;
+   Eina_Bool stopped;
+   if (!proc) return NULL;
+
+   menu = elm_menu_add(ui->win);
+   if (!menu) return NULL;
+
+   evas_object_smart_callback_add(menu, "dismissed", _item_menu_dismissed_cb, 
NULL);
+
+   stopped = !!strcmp(proc->state, "stop");
+
+   menu_main = menu_it = elm_menu_item_add(menu, NULL, 
_icon_path_get("window"), proc->command, NULL, NULL);
+   menu_it2 = elm_menu_item_add(menu, menu_it, _icon_path_get("start"), 
"Start", _item_menu_start_cb, proc);
+   if (stopped) elm_object_item_disabled_set(menu_it2, EINA_TRUE);
+   menu_it2 = elm_menu_item_add(menu, menu_it, _icon_path_get("stop"), "Stop", 
_item_menu_stop_cb, proc);
+   if (!stopped) elm_object_item_disabled_set(menu_it2, EINA_TRUE);
+   elm_menu_item_add(menu, menu_it, _icon_path_get("kill"), "Kill", 
_item_menu_kill_cb, proc);
+   elm_menu_item_separator_add(menu, menu_it);
+   elm_menu_item_add(menu, menu_it, _icon_path_get("cancel"), "Cancel", 
_item_menu_dismissed_cb, NULL);
+
+   return menu;
+}
+
+static void
+_item_pid_secondary_clicked_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, 
Evas_Object *obj, void *event_info)
+{
+   Evas_Object *menu;
+   Evas_Event_Mouse_Up *ev;
+   Ui *ui;
+   Elm_Object_Item *it;
+   Proc_Info *proc;
+
+   ev = event_info;
+   if (ev->button != 3) return;
+
+   it = elm_genlist_at_xy_item_get(obj, ev->output.x, ev->output.y, NULL);
+   proc = elm_object_item_data_get(it);
+   if (!proc) return;
+
+   ui = data;
+
+   menu = _item_menu_create(ui, proc);
+   if (!menu) return;
+
+   elm_menu_move(menu, ev->canvas.x, ev->canvas.y);
+   evas_object_show(menu);
+}
+
 static void
 _item_pid_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info)
 {
@@ -1721,6 +1819,8 @@ _ui_tab_system_add(Ui *ui)
    evas_object_smart_callback_add(ui->btn_state, "clicked", 
_btn_state_clicked_cb, ui);
    evas_object_smart_callback_add(ui->btn_cpu_usage, "clicked", 
_btn_cpu_usage_clicked_cb, ui);
    evas_object_smart_callback_add(ui->genlist_procs, "selected", 
_item_pid_clicked_cb, ui);
+   evas_object_event_callback_add(ui->genlist_procs, EVAS_CALLBACK_MOUSE_UP,
+                                  _item_pid_secondary_clicked_cb, ui);
    evas_object_smart_callback_add(ui->genlist_procs, "unrealized", 
_item_unrealized_cb, ui);
 }
 

-- 


Reply via email to