format: allow some key presses.

This is totally bogus. Need to reboot into linux and sort out
the horrible formatting and spacing etc etc etc.
This commit is contained in:
Alastair Poole 2018-10-02 14:56:25 +01:00
parent 18be59950d
commit f5a1292c39
2 changed files with 138 additions and 26 deletions

155
src/ui.c
View File

@ -241,16 +241,61 @@ _sort_by_state(const void *p1, const void *p2)
return strcmp(inf1->state, inf2->state);
}
const char *
_data_unit_symbol_get(Data_Unit unit)
{
const char *symbol;
switch (unit)
{
case DATA_UNIT_KB:
symbol = "K";
break;
case DATA_UNIT_MB:
symbol = "M";
break;
case DATA_UNIT_GB:
symbol = "G";
break;
}
return symbol;
}
static void
_fields_append(Ui *ui, Proc_Stats *proc)
{
const char *format;
int64_t mem_size, mem_rss;
if (ui->program_pid == proc->pid)
return;
format = _data_unit_symbol_get(ui->data_unit);
mem_size = proc->mem_size;
mem_rss = proc->mem_rss;
if (ui->data_unit == DATA_UNIT_KB)
{
mem_size >>= 10;
mem_rss >>= 10;
}
else if (ui->data_unit == DATA_UNIT_MB)
{
mem_size >>= 20;
mem_rss >>= 10;
}
else
{
mem_size >>= 30;
mem_rss >>= 30;
}
eina_strlcat(ui->fields[PROCESS_INFO_FIELD_PID], eina_slstr_printf("<link>%d</link> <br>", proc->pid), TEXT_FIELD_MAX);
eina_strlcat(ui->fields[PROCESS_INFO_FIELD_UID], eina_slstr_printf("%d <br>", proc->uid), TEXT_FIELD_MAX);
eina_strlcat(ui->fields[PROCESS_INFO_FIELD_SIZE], eina_slstr_printf("%lld K<br>", proc->mem_size >> 10), TEXT_FIELD_MAX);
eina_strlcat(ui->fields[PROCESS_INFO_FIELD_RSS], eina_slstr_printf("%lld K<br>", proc->mem_rss >> 10), TEXT_FIELD_MAX);
eina_strlcat(ui->fields[PROCESS_INFO_FIELD_SIZE], eina_slstr_printf("%lld %c<br>", mem_size, *format), TEXT_FIELD_MAX);
eina_strlcat(ui->fields[PROCESS_INFO_FIELD_RSS], eina_slstr_printf("%lld %c<br>", mem_rss, *format), TEXT_FIELD_MAX);
eina_strlcat(ui->fields[PROCESS_INFO_FIELD_COMMAND], eina_slstr_printf("%s<br>", proc->command), TEXT_FIELD_MAX);
eina_strlcat(ui->fields[PROCESS_INFO_FIELD_STATE], eina_slstr_printf("%s <br>", proc->state), TEXT_FIELD_MAX);
eina_strlcat(ui->fields[PROCESS_INFO_FIELD_CPU_USAGE], eina_slstr_printf("%.1f%% <br>", proc->cpu_usage), TEXT_FIELD_MAX);
@ -828,29 +873,29 @@ _entry_pid_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info
ui->panel_visible = EINA_TRUE;
}
static unsigned long _disk_used = 0, _disk_total = 0;
static char *
_progress_disk_format_cb(double val)
static unsigned long
_disk_adjust(Data_Unit unit, unsigned long value)
{
char buf[1024];
if (unit == DATA_UNIT_KB)
{
value <<= 10;
}
else if (unit == DATA_UNIT_MB)
{
}
else if (unit == DATA_UNIT_GB)
{
value >>= 10;
}
snprintf(buf, sizeof(buf), "%luM of %luM", _disk_used, _disk_total);
return strdup(buf);
}
static void
_progress_disk_format_free_cb(char *str)
{
if (str)
free(str);
return value;
}
static void
_ui_disk_add(Ui *ui, const char *path, const char *mount, unsigned long total, unsigned long used)
{
Evas_Object *frame, *progress;
const char *format;
double ratio, value;
frame = elm_frame_add(ui->disk_activity);
@ -863,14 +908,14 @@ _ui_disk_add(Ui *ui, const char *path, const char *mount, unsigned long total, u
evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_progressbar_span_size_set(progress, 1.0);
elm_progressbar_unit_format_set(progress, "");
elm_progressbar_unit_format_function_set(progress, _progress_disk_format_cb, _progress_disk_format_free_cb);
format = _data_unit_symbol_get(ui->data_unit);
elm_progressbar_unit_format_set(progress,
eina_slstr_printf("%lu%c of %lu%c", _disk_adjust(ui->data_unit, used), *format, _disk_adjust(ui->data_unit, total), *format));
elm_object_content_set(frame, progress);
_disk_used = used;
_disk_total = total;
ratio = total / 100.0;
value = used / ratio;
@ -1021,10 +1066,29 @@ _cpu_view_update(Ui *ui, results_t *results)
elm_box_pack_end(ui->cpu_activity, box);
}
static unsigned long
_mem_adjust(Data_Unit unit, unsigned long value)
{
if (unit == DATA_UNIT_KB)
{
}
else if (unit == DATA_UNIT_MB)
{
value >>= 10;
}
else if (unit == DATA_UNIT_GB)
{
value >>= 20;
}
return value;
}
static void
_memory_view_update(Ui *ui, results_t *results)
{
Evas_Object *box, *frame, *progress;
const char *format;
double ratio, value;
if (!ui->mem_visible)
@ -1032,6 +1096,8 @@ _memory_view_update(Ui *ui, results_t *results)
elm_box_clear(ui->mem_activity);
format = _data_unit_symbol_get(ui->data_unit);
box = elm_box_add(ui->content);
evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@ -1046,7 +1112,8 @@ _memory_view_update(Ui *ui, results_t *results)
evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_progressbar_span_size_set(progress, 1.0);
elm_progressbar_unit_format_set(progress, eina_slstr_printf("%lu M / %lu M", results->memory.used, results->memory.total));
elm_progressbar_unit_format_set(progress,
eina_slstr_printf("%lu %c / %lu %c", _mem_adjust(ui->data_unit, results->memory.used), *format, _mem_adjust(ui->data_unit, results->memory.total), *format));
ratio = results->memory.total / 100.0;
value = results->memory.used / ratio;
elm_progressbar_value_set(progress, value / 100);
@ -1063,7 +1130,8 @@ _memory_view_update(Ui *ui, results_t *results)
evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_progressbar_span_size_set(progress, 1.0);
elm_progressbar_unit_format_set(progress, eina_slstr_printf("%lu M / %lu M", results->memory.cached, results->memory.total));
elm_progressbar_unit_format_set(progress,
eina_slstr_printf("%lu %c / %lu %c", _mem_adjust(ui->data_unit, results->memory.cached), *format, _mem_adjust(ui->data_unit, results->memory.total), *format));
ratio = results->memory.total / 100.0;
value = results->memory.cached / ratio;
elm_progressbar_value_set(progress, value / 100);
@ -1080,7 +1148,8 @@ _memory_view_update(Ui *ui, results_t *results)
evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_progressbar_span_size_set(progress, 1.0);
elm_progressbar_unit_format_set(progress, eina_slstr_printf("%lu M / %lu M", results->memory.buffered, results->memory.total));
elm_progressbar_unit_format_set(progress,
eina_slstr_printf("%lu %c / %lu %c", _mem_adjust(ui->data_unit, results->memory.buffered), *format, _mem_adjust(ui->data_unit, results->memory.total), *format));
ratio = results->memory.total / 100.0;
value = results->memory.buffered / ratio;
elm_progressbar_value_set(progress, value / 100);
@ -1097,7 +1166,8 @@ _memory_view_update(Ui *ui, results_t *results)
evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_progressbar_span_size_set(progress, 1.0);
elm_progressbar_unit_format_set(progress, eina_slstr_printf("%lu M / %lu M", results->memory.shared, results->memory.total));
elm_progressbar_unit_format_set(progress,
eina_slstr_printf("%lu %c / %lu %c", _mem_adjust(ui->data_unit, results->memory.shared), *format, _mem_adjust(ui->data_unit, results->memory.total), *format));
ratio = results->memory.total / 100.0;
value = results->memory.shared / ratio;
elm_progressbar_value_set(progress, value / 100);
@ -2076,6 +2146,36 @@ _ui_tabs_add(Evas_Object *parent, Ui *ui)
return table;
}
static void
_evisum_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Key_Down *ev;
Ui *ui;
ev = event_info;
ui = data;
if (!ev || !ev->keyname)
return;
if (!strcasecmp(ev->keyname, "K"))
{
ui->data_unit = DATA_UNIT_KB;
}
else if (!strcasecmp(ev->keyname, "M"))
{
ui->data_unit = DATA_UNIT_MB;
}
else if (!strcasecmp(ev->keyname, "G"))
{
ui->data_unit = DATA_UNIT_GB;
}
else if (!strcmp(ev->keyname, "Escape"))
{
ui_shutdown(ui);
}
}
Ui *
ui_add(Evas_Object *parent)
{
@ -2092,6 +2192,7 @@ ui_add(Evas_Object *parent)
ui->program_pid = getpid();
ui->panel_visible = EINA_TRUE;
ui->disk_visible = ui->cpu_visible = ui->mem_visible = ui->extra_visible = EINA_TRUE;
ui->data_unit = DATA_UNIT_MB;
memset(ui->cpu_times, 0, PID_MAX * sizeof(int64_t));
@ -2114,6 +2215,8 @@ ui_add(Evas_Object *parent)
_ui_disk_view_add(ui);
_ui_extra_view_add(ui);
evas_object_event_callback_add(ui->content, EVAS_CALLBACK_KEY_DOWN, _evisum_key_down_cb, ui);
/* Start polling the data */
_disk_view_update(ui);
_process_panel_update(ui);

View File

@ -24,6 +24,13 @@ typedef enum
#define PROCESS_INFO_FIELDS 7
typedef enum
{
DATA_UNIT_KB,
DATA_UNIT_MB,
DATA_UNIT_GB,
} Data_Unit;
typedef enum
{
SORT_BY_NONE,
@ -102,6 +109,8 @@ typedef struct Ui
pid_t selected_pid;
pid_t program_pid;
Data_Unit data_unit;
#define TEXT_FIELD_MAX 65535
char *fields[PROCESS_INFO_FIELDS];