process_list: Use a table.

We know the number of elements.
This commit is contained in:
Alastair Poole 2021-01-03 14:14:57 +00:00
parent 2d9ca2dc37
commit 110d772fd5
2 changed files with 40 additions and 54 deletions

View File

@ -14,6 +14,12 @@
extern int EVISUM_EVENT_CONFIG_CHANGED; extern int EVISUM_EVENT_CONFIG_CHANGED;
typedef struct
{
Sort_Type type;
int (*sort_cb)(const void *p1, const void *p2);
} Sorter;
typedef struct typedef struct
{ {
Ecore_Thread *thread; Ecore_Thread *thread;
@ -21,6 +27,7 @@ typedef struct
Ecore_Event_Handler *handler[2]; Ecore_Event_Handler *handler[2];
Eina_Bool skip_wait; Eina_Bool skip_wait;
Sorter sorters[SORT_BY_MAX - 1];
Eina_Hash *cpu_times; Eina_Hash *cpu_times;
Ecore_Timer *resize_timer; Ecore_Timer *resize_timer;
@ -563,63 +570,23 @@ _process_list_cancel_cb(void *data, Ecore_Thread *thread)
(void) pd; (void) pd;
} }
static Eina_List * static Eina_List *
_process_list_sort(Ui *ui, Eina_List *list) _process_list_sort(Eina_List *list, Ui_Data *pd)
{ {
switch (ui->proc.sort_type) Ui *ui;
{ Sorter s;
case SORT_BY_NONE: ui = pd->ui;
case SORT_BY_PID:
list = eina_list_sort(list, eina_list_count(list), _sort_by_pid);
break;
case SORT_BY_UID: s = pd->sorters[ui->proc.sort_type];
list = eina_list_sort(list, eina_list_count(list), _sort_by_uid);
break;
case SORT_BY_NICE: list = eina_list_sort(list, eina_list_count(list), s.sort_cb);
list = eina_list_sort(list, eina_list_count(list), _sort_by_nice);
break;
case SORT_BY_PRI:
list = eina_list_sort(list, eina_list_count(list), _sort_by_pri);
break;
case SORT_BY_CPU:
list = eina_list_sort(list, eina_list_count(list), _sort_by_cpu);
break;
case SORT_BY_THREADS:
list = eina_list_sort(list, eina_list_count(list), _sort_by_threads);
break;
case SORT_BY_SIZE:
list = eina_list_sort(list, eina_list_count(list), _sort_by_size);
break;
case SORT_BY_RSS:
list = eina_list_sort(list, eina_list_count(list), _sort_by_rss);
break;
case SORT_BY_CMD:
list = eina_list_sort(list, eina_list_count(list), _sort_by_cmd);
break;
case SORT_BY_STATE:
list = eina_list_sort(list, eina_list_count(list), _sort_by_state);
break;
case SORT_BY_CPU_USAGE:
list = eina_list_sort(list, eina_list_count(list), _sort_by_cpu_usage);
break;
}
if (ui->proc.sort_reverse) if (ui->proc.sort_reverse)
list = eina_list_reverse(list); list = eina_list_reverse(list);
return list; return list;
} }
static Eina_List * static Eina_List *
_process_list_uid_trim(Eina_List *list, uid_t uid) _process_list_uid_trim(Eina_List *list, uid_t uid)
{ {
@ -701,7 +668,7 @@ _process_list_get(Ui_Data *pd)
list = _process_list_uid_trim(list, getuid()); list = _process_list_uid_trim(list, getuid());
list = _process_list_search_trim(list, pd); list = _process_list_search_trim(list, pd);
list = _process_list_sort(ui, list); list = _process_list_sort(list, pd);
return list; return list;
} }
@ -907,7 +874,7 @@ _btn_cmd_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
static void static void
_btn_cpu_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, _btn_cpu_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED) void *event_info EINA_UNUSED)
{ {
Ui_Data *pd = data; Ui_Data *pd = data;
Ui *ui = pd->ui; Ui *ui = pd->ui;
@ -920,7 +887,7 @@ _btn_cpu_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
static void static void
_btn_threads_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, _btn_threads_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED) void *event_info EINA_UNUSED)
{ {
Ui_Data *pd = data; Ui_Data *pd = data;
Ui *ui = pd->ui; Ui *ui = pd->ui;
@ -990,7 +957,7 @@ _item_menu_cancel_cb(void *data, Evas_Object *obj EINA_UNUSED,
static void static void
_item_menu_debug_cb(void *data, Evas_Object *obj EINA_UNUSED, _item_menu_debug_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED) void *event_info EINA_UNUSED)
{ {
Proc_Info *proc; Proc_Info *proc;
const char *terminal = "xterm"; const char *terminal = "xterm";
@ -1306,7 +1273,6 @@ _ui_content_system_add(Ui_Data *pd, Evas_Object *parent)
evas_object_smart_callback_add(btn, "clicked", evas_object_smart_callback_add(btn, "clicked",
_btn_cpu_clicked_cb, pd); _btn_cpu_clicked_cb, pd);
pd->btn_state = btn = elm_button_add(parent); pd->btn_state = btn = elm_button_add(parent);
_btn_icon_state_init(btn, _btn_icon_state_init(btn,
(ui->proc.sort_type == SORT_BY_STATE ? (ui->proc.sort_type == SORT_BY_STATE ?
@ -1356,7 +1322,7 @@ _ui_content_system_add(Ui_Data *pd, Evas_Object *parent)
evas_object_event_callback_add(pd->genlist, EVAS_CALLBACK_MOUSE_UP, evas_object_event_callback_add(pd->genlist, EVAS_CALLBACK_MOUSE_UP,
_item_pid_secondary_clicked_cb, pd); _item_pid_secondary_clicked_cb, pd);
evas_object_smart_callback_add(pd->genlist, "unrealized", evas_object_smart_callback_add(pd->genlist, "unrealized",
_item_unrealized_cb, pd); _item_unrealized_cb, pd);
elm_box_pack_end(bx, tbl); elm_box_pack_end(bx, tbl);
fr = elm_frame_add(parent); fr = elm_frame_add(parent);
@ -1581,7 +1547,7 @@ _win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_U
ecore_thread_cancel(pd->thread); ecore_thread_cancel(pd->thread);
if (pd->thread) if (pd->thread)
ecore_thread_wait(pd->thread, 0.2); ecore_thread_wait(pd->thread, 0.5);
if (pd->resize_timer) if (pd->resize_timer)
ecore_timer_del(pd->resize_timer); ecore_timer_del(pd->resize_timer);
@ -1599,6 +1565,23 @@ _win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_U
free(pd); free(pd);
} }
static void
_init(Ui_Data *pd)
{
pd->sorters[SORT_BY_NONE].sort_cb = _sort_by_pid;
pd->sorters[SORT_BY_PID].sort_cb = _sort_by_pid;
pd->sorters[SORT_BY_UID].sort_cb = _sort_by_uid;
pd->sorters[SORT_BY_NICE].sort_cb = _sort_by_nice;
pd->sorters[SORT_BY_PRI].sort_cb = _sort_by_pri;
pd->sorters[SORT_BY_CPU].sort_cb = _sort_by_cpu;
pd->sorters[SORT_BY_THREADS].sort_cb = _sort_by_threads;
pd->sorters[SORT_BY_SIZE].sort_cb = _sort_by_size;
pd->sorters[SORT_BY_RSS].sort_cb = _sort_by_rss;
pd->sorters[SORT_BY_CMD].sort_cb = _sort_by_cmd;
pd->sorters[SORT_BY_STATE].sort_cb = _sort_by_state;
pd->sorters[SORT_BY_CPU_USAGE].sort_cb = _sort_by_cpu_usage;
}
void void
ui_process_list_win_add(Ui *ui) ui_process_list_win_add(Ui *ui)
{ {
@ -1618,6 +1601,7 @@ ui_process_list_win_add(Ui *ui)
pd->ui = ui; pd->ui = ui;
pd->handler[0] = ecore_event_handler_add(EVISUM_EVENT_CONFIG_CHANGED, pd->handler[0] = ecore_event_handler_add(EVISUM_EVENT_CONFIG_CHANGED,
_evisum_config_changed_cb, pd); _evisum_config_changed_cb, pd);
_init(pd);
ui->proc.win = pd->win = win = elm_win_util_standard_add("evisum", "evisum"); ui->proc.win = pd->win = win = elm_win_util_standard_add("evisum", "evisum");
elm_win_autodel_set(win, EINA_TRUE); elm_win_autodel_set(win, EINA_TRUE);

View File

@ -17,6 +17,8 @@ typedef enum
SORT_BY_CMD, SORT_BY_CMD,
SORT_BY_STATE, SORT_BY_STATE,
SORT_BY_CPU_USAGE, SORT_BY_CPU_USAGE,
SORT_BY_MAX,
} Sort_Type; } Sort_Type;
void void