ui: options kthreads check.

This commit is contained in:
Alastair Poole 2020-10-03 14:19:29 +01:00
parent 45a1eef26f
commit b04cde56b8
6 changed files with 171 additions and 55 deletions

View File

@ -52,6 +52,7 @@ _config_init()
Evisum_Config *cfg = calloc(1, sizeof(Evisum_Config));
cfg->version = CONFIG_VERSION;
cfg->poll_delay = 3;
cfg->show_kthreads = 1;
return cfg;
}

View File

@ -3,7 +3,7 @@
#include "ui/ui.h"
#define CONFIG_VERSION 0x0005
#define CONFIG_VERSION 0x0006
typedef struct _Evisum_Config
{
@ -14,6 +14,7 @@ typedef struct _Evisum_Config
int height;
int poll_delay;
Eina_Bool effects;
Eina_Bool show_kthreads;
} Evisum_Config;
void config_init(void);

View File

@ -1111,3 +1111,107 @@ proc_info_all_get(void)
return processes;
}
static Eina_Bool
_child_add(Eina_List *parents, Proc_Info *child)
{
Eina_List *l;
Proc_Info *parent;
EINA_LIST_FOREACH(parents, l, parent)
{
if (parent->pid == child->ppid)
{
parent->children = eina_list_append(parent->children, child);
return 1;
}
}
return 0;
}
Eina_List *
proc_info_all_children_get()
{
Proc_Info *proc;
Eina_List *l;
Eina_List *procs;
procs = proc_info_all_get();
EINA_LIST_FOREACH(procs, l, proc)
{
int ok =_child_add(procs, proc);
(void) ok;
}
return procs;
}
Eina_List *
_append_wanted(Eina_List *wanted, Eina_List *tree)
{
Eina_List *l;
Proc_Info *parent;
EINA_LIST_FOREACH(tree, l, parent)
{
wanted = eina_list_append(wanted, parent);
if (parent->children)
wanted = _append_wanted(wanted, parent->children);
}
return wanted;
}
Eina_List *
proc_info_pid_children_get(pid_t pid)
{
Proc_Info *proc;
Eina_List *l, *procs, *wanted = NULL;
procs = proc_info_all_children_get();
EINA_LIST_FOREACH(procs, l, proc)
{
if (!wanted && proc->pid == pid)
{
wanted = eina_list_append(wanted, proc);
if (proc->children)
wanted = _append_wanted(wanted, proc->children);
}
}
EINA_LIST_FREE(procs, proc)
{
if (!eina_list_data_find(wanted, proc))
{
proc_info_free(proc);
}
}
return wanted;
}
void
proc_info_all_children_free(Eina_List *pstree)
{
Proc_Info *parent, *child;
EINA_LIST_FREE(pstree, parent)
{
EINA_LIST_FREE(parent->children, child)
proc_info_pid_children_free(child);
proc_info_free(parent);
}
}
void
proc_info_pid_children_free(Proc_Info *proc)
{
Proc_Info *child;
EINA_LIST_FREE(proc->children, child)
proc_info_free(child);
proc_info_free(proc);
}

View File

@ -1,21 +1,6 @@
#ifndef __PROC_H__
#define __PROC_H__
/**
* @file
* @brief Routines for querying processes.
*/
/**
* @brief Querying Processes
* @defgroup Proc
*
* @{
*
* Query processes.
*
*/
#include <Eina.h>
#include <stdint.h>
#include <unistd.h>
@ -50,53 +35,31 @@ typedef struct _Proc_Info
char *thread_name;
Eina_List *threads;
Eina_List *children;
} Proc_Info;
/**
* Query a full list of running processes and return a list.
*
* @return A list of Proc_Info pointers for all processes.
*/
Eina_List *
proc_info_all_get(void);
/**
* Query a process for its current state.
*
* @param pid The process ID to query.
*
* @return A Proc_Info pointer containing the process information.
*/
Proc_Info *
proc_info_by_pid(int pid);
/**
* Free a Proc_Info * pointer;
*
* @param proc The object to free.
*/
void
proc_info_free(Proc_Info *proc);
/**
* Enable or disable the listing of kernel threads.
*
* @param enabled Boolean true or false (show/hide).
*/
void
proc_info_kthreads_show_set(Eina_Bool enabled);
/**
* Return the current policy for listing kernel threads.
*
* @return True or false (enabled/disabled).
*/
Eina_Bool
proc_info_kthreads_show_get(void);
/**
* @}
*/
Eina_List *
proc_info_all_children_get(void);
Eina_List *
proc_info_pid_children_get(pid_t pid);
void
proc_info_pid_children_free(Proc_Info *procs);
#endif

View File

@ -33,6 +33,9 @@ _config_save(Ui *ui)
_evisum_config->height = h;
_evisum_config->effects = evisum_ui_effects_enabled_get();
_evisum_config->poll_delay = ui->poll_delay;
_evisum_config->show_kthreads = ui->show_kthreads;
proc_info_kthreads_show_set(ui->show_kthreads);
config_save(_evisum_config);
}
@ -50,6 +53,9 @@ _config_load(Ui *ui)
evas_object_resize(ui->win, _evisum_config->width, _evisum_config->height);
evisum_ui_effects_enabled_set(_evisum_config->effects);
ui->show_kthreads = _evisum_config->show_kthreads;
proc_info_kthreads_show_set(ui->show_kthreads);
}
static int
@ -1150,10 +1156,20 @@ _main_menu_slider_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *eve
_proc_pid_cpu_times_reset(ui);
}
static void
_main_menu_show_threads_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
Ui *ui = data;
ui->show_kthreads = elm_check_state_get(obj);
_config_save(ui);
}
static void
_main_menu_create(Ui *ui, Evas_Object *btn)
{
Evas_Object *o, *bx, *hbox, *sep, *fr, *sli;
Evas_Object *o, *bx, *bx2, *hbox, *sep, *fr, *sli;
Evas_Object *chk;
Evas_Coord ox, oy, ow, oh;
evas_object_geometry_get(btn, &ox, &oy, &ow, &oh);
@ -1168,11 +1184,15 @@ _main_menu_create(Ui *ui, Evas_Object *btn)
evas_object_show(bx);
fr = elm_frame_add(o);
elm_object_text_set(fr, _("Options"));
elm_object_text_set(fr, _("Actions"));
evas_object_size_hint_weight_set(fr, EXPAND, EXPAND);
evas_object_size_hint_align_set(fr, FILL, FILL);
evas_object_show(fr);
evas_object_size_hint_min_set(fr, 100, 100);
elm_object_content_set(fr, bx);
elm_object_content_set(o, fr);
hbox = elm_box_add(o);
elm_box_horizontal_set(hbox, 1);
evas_object_size_hint_align_set(hbox, FILL, FILL);
@ -1210,6 +1230,18 @@ _main_menu_create(Ui *ui, Evas_Object *btn)
btn = _btn_create(hbox, "evisum", _("About"), _about_clicked_cb, ui);
elm_box_pack_end(hbox, btn);
elm_box_pack_end(bx, hbox);
fr = elm_frame_add(o);
elm_object_text_set(fr, _("Options"));
evas_object_size_hint_weight_set(fr, EXPAND, EXPAND);
evas_object_size_hint_align_set(fr, FILL, FILL);
evas_object_show(fr);
bx2 = elm_box_add(o);
evas_object_size_hint_weight_set(bx2, EXPAND, EXPAND);
evas_object_size_hint_align_set(bx2, FILL, FILL);
evas_object_show(bx2);
sli = elm_slider_add(o);
evas_object_size_hint_weight_set(sli, EXPAND, EXPAND);
@ -1225,13 +1257,27 @@ _main_menu_create(Ui *ui, Evas_Object *btn)
evas_object_smart_callback_add(sli, "changed", _main_menu_slider_changed_cb, ui);
evas_object_show(sli);
_main_menu_slider_changed_cb(ui, sli, NULL);
elm_box_pack_end(bx2, sli);
elm_box_pack_end(bx, hbox);
elm_box_pack_end(bx, sli);
sep = elm_separator_add(bx2);
evas_object_size_hint_align_set(sep, FILL, FILL);
evas_object_size_hint_weight_set(sep, EXPAND, EXPAND);
elm_separator_horizontal_set(sep, 1);
evas_object_show(sep);
elm_box_pack_end(bx2, sep);
evas_object_size_hint_min_set(fr, 100, 100);
elm_object_content_set(fr, bx);
elm_object_content_set(o, fr);
chk = elm_check_add(bx2);
evas_object_size_hint_weight_set(chk, EXPAND, EXPAND);
evas_object_size_hint_align_set(chk, FILL, FILL);
elm_object_text_set(chk, _("Show kernel threads?"));
elm_check_state_set(chk, _evisum_config->show_kthreads);
evas_object_show(chk);
evas_object_smart_callback_add(chk, "changed",
_main_menu_show_threads_changed_cb, ui);
elm_box_pack_end(bx2, chk);
elm_object_content_set(fr, bx2);
elm_box_pack_end(bx, fr);
elm_ctxpopup_direction_priority_set(o, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_DOWN,
ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
@ -1534,7 +1580,7 @@ _evisum_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
ui->show_self = !ui->show_self;
if (ev->keyname[0] == 'k' || ev->keyname[0] == 'K')
proc_info_kthreads_show_set(!proc_info_kthreads_show_get());
ui->show_kthreads = !ui->show_kthreads;
_config_save(ui);
}

View File

@ -104,6 +104,7 @@ typedef struct Ui
Sort_Type sort_type;
Eina_Bool sort_reverse;
Eina_Bool show_self;
Eina_Bool show_kthreads;
Eina_Bool shutdown_now;
Ecore_Animator *animator;