Enlightenment: Add the sysinfo gadget that includes battery, temp, frequency, cpu, mem, and net

This is a gadget using the new api that has separate gadgets for battery, temperature, net status, cpu load, mem usage, cpu frequency, and one gadget called sysinfo that combines all of the above.
This commit is contained in:
Stephen 'Okra' Houston 2017-01-06 16:12:20 -06:00
parent 501ea95e2c
commit cd24662e9f
5 changed files with 555 additions and 0 deletions

Binary file not shown.

181
src/modules/sysinfo/mod.c Normal file
View File

@ -0,0 +1,181 @@
#include "sysinfo.h"
static E_Config_DD *conf_edd = NULL;
static E_Config_DD *conf_item_edd = NULL;
Eina_List *sysinfo_instances = NULL;
E_Module *module = NULL;
Config *sysinfo_config = NULL;
EINTERN void
sysinfo_init(void)
{
conf_item_edd = E_CONFIG_DD_NEW("Sysinfo_Config_Item", Config_Item);
#undef T
#undef D
#define T Config_Item
#define D conf_item_edd
E_CONFIG_VAL(D, T, id, INT);
E_CONFIG_VAL(D, T, esm, INT);
E_CONFIG_VAL(D, T, batman.poll_interval, INT);
E_CONFIG_VAL(D, T, batman.alert, INT);
E_CONFIG_VAL(D, T, batman.alert_p, INT);
E_CONFIG_VAL(D, T, batman.alert_timeout, INT);
E_CONFIG_VAL(D, T, batman.suspend_below, INT);
E_CONFIG_VAL(D, T, batman.force_mode, INT);
#if defined HAVE_EEZE || defined __OpenBSD__ || defined __NetBSD__
E_CONFIG_VAL(D, T, batman.fuzzy, INT);
#endif
E_CONFIG_VAL(D, T, batman.desktop_notifications, INT);
E_CONFIG_VAL(D, T, thermal.poll_interval, INT);
E_CONFIG_VAL(D, T, thermal.low, INT);
E_CONFIG_VAL(D, T, thermal.high, INT);
E_CONFIG_VAL(D, T, thermal.sensor_type, INT);
E_CONFIG_VAL(D, T, thermal.sensor_name, STR);
E_CONFIG_VAL(D, T, thermal.units, INT);
E_CONFIG_VAL(D, T, cpuclock.poll_interval, INT);
E_CONFIG_VAL(D, T, cpuclock.restore_governor, INT);
E_CONFIG_VAL(D, T, cpuclock.auto_powersave, INT);
E_CONFIG_VAL(D, T, cpuclock.powersave_governor, STR);
E_CONFIG_VAL(D, T, cpuclock.governor, STR);
E_CONFIG_VAL(D, T, cpuclock.pstate_min, INT);
E_CONFIG_VAL(D, T, cpuclock.pstate_max, INT);
E_CONFIG_VAL(D, T, cpumonitor.poll_interval, INT);
E_CONFIG_VAL(D, T, memusage.poll_interval, INT);
E_CONFIG_VAL(D, T, netstatus.poll_interval, INT);
conf_edd = E_CONFIG_DD_NEW("Sysinfo_Config", Config);
#undef T
#undef D
#define T Config
#define D conf_edd
E_CONFIG_LIST(D, T, items, conf_item_edd);
sysinfo_config = e_config_domain_load("module.sysinfo", conf_edd);
if (!sysinfo_config)
{
Config_Item *ci;
sysinfo_config = E_NEW(Config, 1);
ci = E_NEW(Config_Item, 1);
ci->id = 0;
ci->esm = E_SYSINFO_MODULE_NONE;
ci->batman.poll_interval = 512;
ci->batman.alert = 30;
ci->batman.alert_p = 10;
ci->batman.alert_timeout = 0;
ci->batman.suspend_below = 0;
ci->batman.force_mode = 0;
ci->batman.full = -2;
ci->batman.time_left = -2;
ci->batman.time_full = -2;
ci->batman.have_battery = -2;
ci->batman.have_power = -2;
#if defined HAVE_EEZE || defined __OpenBSD__ || defined __NetBSD__
ci->batman.fuzzy = 0;
#endif
ci->batman.desktop_notifications = 0;
ci->thermal.poll_interval = 128;
ci->thermal.low = 30;
ci->thermal.high = 80;
ci->thermal.sensor_type = SENSOR_TYPE_NONE;
ci->thermal.sensor_name = NULL;
ci->thermal.temp = -900;
ci->thermal.units = CELSIUS;
ci->cpuclock.poll_interval = 32;
ci->cpuclock.restore_governor = 0;
ci->cpuclock.auto_powersave = 1;
ci->cpuclock.powersave_governor = NULL;
ci->cpuclock.governor = NULL;
ci->cpuclock.pstate_min = 1;
ci->cpuclock.pstate_max = 101;
ci->cpumonitor.poll_interval = 32;
ci->cpumonitor.total = 0;
ci->cpumonitor.idle = 0;
ci->memusage.poll_interval = 32;
ci->netstatus.poll_interval = 32;
ci->netstatus.in = 0;
ci->netstatus.out = 0;
E_CONFIG_LIMIT(ci->batman.poll_interval, 4, 4096);
E_CONFIG_LIMIT(ci->batman.alert, 0, 60);
E_CONFIG_LIMIT(ci->batman.alert_p, 0, 100);
E_CONFIG_LIMIT(ci->batman.alert_timeout, 0, 300);
E_CONFIG_LIMIT(ci->batman.suspend_below, 0, 50);
E_CONFIG_LIMIT(ci->batman.force_mode, 0, 2);
E_CONFIG_LIMIT(ci->batman.desktop_notifications, 0, 1);
E_CONFIG_LIMIT(ci->thermal.poll_interval, 1, 1024);
E_CONFIG_LIMIT(ci->thermal.low, 0, 100);
E_CONFIG_LIMIT(ci->thermal.high, 0, 220);
E_CONFIG_LIMIT(ci->thermal.units, CELSIUS, FAHRENHEIT);
E_CONFIG_LIMIT(ci->cpuclock.poll_interval, 1, 1024);
E_CONFIG_LIMIT(ci->cpumonitor.poll_interval, 1, 1024);
E_CONFIG_LIMIT(ci->memusage.poll_interval, 1, 1024);
E_CONFIG_LIMIT(ci->netstatus.poll_interval, 1, 1024);
sysinfo_config->items = eina_list_append(sysinfo_config->items, ci);
}
e_gadget_type_add("Batman", batman_create, NULL);
e_gadget_type_add("Thermal", thermal_create, NULL);
e_gadget_type_add("CpuClock", cpuclock_create, NULL);
e_gadget_type_add("CpuMonitor", cpumonitor_create, NULL);
e_gadget_type_add("MemUsage", memusage_create, NULL);
e_gadget_type_add("NetStatus", netstatus_create, NULL);
e_gadget_type_add("SysInfo", sysinfo_create, NULL);
}
EINTERN void
sysinfo_shutdown(void)
{
if (sysinfo_config)
{
Config_Item *ci;
EINA_LIST_FREE(sysinfo_config->items, ci)
{
free(ci);
}
E_FREE(sysinfo_config);
}
E_CONFIG_DD_FREE(conf_edd);
E_CONFIG_DD_FREE(conf_item_edd);
e_gadget_type_del("Batman");
e_gadget_type_del("Thermal");
e_gadget_type_del("CpuClock");
e_gadget_type_del("CpuMonitor");
e_gadget_type_del("MemUsage");
e_gadget_type_del("NetStatus");
e_gadget_type_del("SysInfo");
}
E_API E_Module_Api e_modapi =
{
E_MODULE_API_VERSION,
"Sysinfo"
};
E_API void *
e_modapi_init(E_Module *m)
{
sysinfo_init();
module = m;
sysinfo_config->module = m;
return m;
}
E_API int
e_modapi_shutdown(E_Module *m EINA_UNUSED)
{
sysinfo_shutdown();
return 1;
}
E_API int
e_modapi_save(E_Module *m EINA_UNUSED)
{
e_config_domain_save("module.sysinfo", conf_edd, sysinfo_config);
return 1;
}

View File

@ -0,0 +1,7 @@
[Desktop Entry]
Encoding=UTF-8
Type=Link
Name=Sysinfo
Comment=A gadget to visualize your system info
Icon=e-module-sysinfo
X-Enlightenment-ModuleType=system

View File

@ -0,0 +1,129 @@
#include "sysinfo.h"
static void
_sysinfo_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_data)
{
Instance *inst = data;
if (inst->o_main != event_data) return;
sysinfo_batman_remove(inst);
sysinfo_thermal_remove(inst);
sysinfo_cpuclock_remove(inst);
sysinfo_cpumonitor_remove(inst);
sysinfo_memusage_remove(inst);
sysinfo_netstatus_remove(inst);
sysinfo_config->items = eina_list_remove(sysinfo_config->items, inst->cfg);
E_FREE(inst->cfg);
}
static void
_sysinfo_created_cb(void *data, Evas_Object *obj, void *event_data EINA_UNUSED)
{
Instance *inst = data;
inst->cfg->sysinfo.o_batman = sysinfo_batman_create(inst->o_main, inst);
elm_table_pack(inst->o_main, inst->cfg->sysinfo.o_batman, 0, 0, 1, 1);
inst->cfg->sysinfo.o_thermal = sysinfo_thermal_create(inst->o_main, inst);
elm_table_pack(inst->o_main, inst->cfg->sysinfo.o_thermal, 1, 0, 1, 1);
inst->cfg->sysinfo.o_cpuclock = sysinfo_cpuclock_create(inst->o_main, inst);
elm_table_pack(inst->o_main, inst->cfg->sysinfo.o_cpuclock, 0, 1, 1, 1);
inst->cfg->sysinfo.o_cpumonitor = sysinfo_cpumonitor_create(inst->o_main, inst);
elm_table_pack(inst->o_main, inst->cfg->sysinfo.o_cpumonitor, 1, 1, 1, 1);
inst->cfg->sysinfo.o_memusage = sysinfo_memusage_create(inst->o_main, inst);
elm_table_pack(inst->o_main, inst->cfg->sysinfo.o_memusage, 0, 2, 1, 1);
inst->cfg->sysinfo.o_netstatus = sysinfo_netstatus_create(inst->o_main, inst);
elm_table_pack(inst->o_main, inst->cfg->sysinfo.o_netstatus, 1, 2, 1, 1);
E_EXPAND(inst->o_main);
E_FILL(inst->o_main);
evas_object_smart_callback_del_full(obj, "gadget_created", _sysinfo_created_cb, data);
}
static Config_Item *
_conf_item_get(int *id)
{
Config_Item *ci;
Eina_List *l;
if (*id > 0)
{
EINA_LIST_FOREACH(sysinfo_config->items, l, ci)
if (*id == ci->id && ci->esm == E_SYSINFO_MODULE_SYSINFO) return ci;
}
ci = E_NEW(Config_Item, 1);
if (*id != -1)
ci->id = eina_list_count(sysinfo_config->items)+1;
else
ci->id = -1;
ci->esm = E_SYSINFO_MODULE_SYSINFO;
ci->batman.poll_interval = 512;
ci->batman.alert = 30;
ci->batman.alert_p = 10;
ci->batman.alert_timeout = 0;
ci->batman.suspend_below = 0;
ci->batman.force_mode = 0;
ci->batman.full = -2;
ci->batman.time_left = -2;
ci->batman.time_full = -2;
ci->batman.have_battery = -2;
ci->batman.have_power = -2;
#if defined HAVE_EEZE || defined __OpenBSD__ || defined __NetBSD__
ci->batman.fuzzy = 0;
#endif
ci->batman.desktop_notifications = 0;
ci->thermal.poll_interval = 128;
ci->thermal.low = 30;
ci->thermal.high = 80;
ci->thermal.sensor_type = SENSOR_TYPE_NONE;
ci->thermal.sensor_name = NULL;
ci->thermal.units = CELSIUS;
ci->cpuclock.poll_interval = 32;
ci->cpuclock.restore_governor = 0;
ci->cpuclock.auto_powersave = 1;
ci->cpuclock.powersave_governor = NULL;
ci->cpuclock.governor = NULL;
ci->cpuclock.pstate_min = 1;
ci->cpuclock.pstate_max = 101;
ci->cpumonitor.poll_interval = 32;
ci->cpumonitor.total = 0;
ci->cpumonitor.idle = 0;
ci->memusage.poll_interval = 32;
ci->netstatus.poll_interval = 32;
ci->netstatus.in = 0;
ci->netstatus.out = 0;
sysinfo_config->items = eina_list_append(sysinfo_config->items, ci);
return ci;
}
Evas_Object *
sysinfo_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient EINA_UNUSED)
{
Instance *inst;
inst = E_NEW(Instance, 1);
inst->cfg = _conf_item_get(id);
*id = inst->cfg->id;
inst->o_main = elm_table_add(parent);
elm_table_homogeneous_set(inst->o_main, EINA_TRUE);
E_EXPAND(inst->o_main);
evas_object_size_hint_aspect_set(inst->o_main, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
evas_object_smart_callback_add(parent, "gadget_created", _sysinfo_created_cb, inst);
evas_object_smart_callback_add(parent, "gadget_removed", _sysinfo_removed_cb, inst);
evas_object_show(inst->o_main);
if (inst->cfg->id < 0) return inst->o_main;
sysinfo_instances =
eina_list_append(sysinfo_instances, inst);
return inst->o_main;
}

View File

@ -0,0 +1,238 @@
#ifndef SYSINFO_H
#define SYSINFO_H
#include "e.h"
#ifdef HAVE_EEZE
# include <Eeze.h>
#else
# include <Eldbus.h>
#endif
E_API extern E_Module_Api e_modapi;
E_API void *e_modapi_init (E_Module *m);
E_API int e_modapi_shutdown (E_Module *m);
E_API int e_modapi_save (E_Module *m);
typedef enum _E_Sysinfo_Module E_Sysinfo_Module;
enum _E_Sysinfo_Module
{
E_SYSINFO_MODULE_NONE = 0,
E_SYSINFO_MODULE_BATMAN ,
E_SYSINFO_MODULE_THERMAL,
E_SYSINFO_MODULE_CPUCLOCK,
E_SYSINFO_MODULE_CPUMONITOR,
E_SYSINFO_MODULE_MEMUSAGE,
E_SYSINFO_MODULE_NETSTATUS,
E_SYSINFO_MODULE_SYSINFO
};
typedef enum _Sensor_Type
{
SENSOR_TYPE_NONE,
#if defined __FreeBSD__ || defined __OpenBSD__ || defined __DragonflyBSD__
SENSOR_TYPE_FREEBSD,
SENSOR_TYPE_OPENBSD,
#else
SENSOR_TYPE_OMNIBOOK,
SENSOR_TYPE_LINUX_MACMINI,
SENSOR_TYPE_LINUX_I2C,
SENSOR_TYPE_LINUX_ACPI,
SENSOR_TYPE_LINUX_PCI,
SENSOR_TYPE_LINUX_PBOOK,
SENSOR_TYPE_LINUX_INTELCORETEMP,
SENSOR_TYPE_LINUX_THINKPAD,
SENSOR_TYPE_LINUX_SYS
#endif
} Sensor_Type;
typedef enum _Unit
{
CELSIUS,
FAHRENHEIT
} Unit;
typedef struct _Tempthread Tempthread;
typedef struct _Cpu_Status Cpu_Status;
typedef struct _Config Config;
typedef struct _Config_Item Config_Item;
typedef struct _Instance Instance;
struct _Tempthread
{
Instance *inst;
int poll_interval;
Sensor_Type sensor_type;
const char *sensor_name;
const char *sensor_path;
void *extn;
#ifdef HAVE_EEZE
Eina_List *tempdevs;
#endif
Eina_Bool initted : 1;
};
struct _Cpu_Status
{
Eina_List *frequencies;
Eina_List *governors;
int cur_frequency;
#ifdef __OpenBSD__
int cur_percent;
#endif
int cur_min_frequency;
int cur_max_frequency;
int can_set_frequency;
int pstate_min;
int pstate_max;
char *cur_governor;
const char *orig_governor;
unsigned char active;
unsigned char pstate;
unsigned char pstate_turbo;
};
struct _Config
{
Eina_List *items;
E_Module *module;
Evas_Object *config_dialog;
};
struct _Config_Item
{
int id;
E_Sysinfo_Module esm;
struct
{
Evas_Object *o_gadget;
/* saved * loaded config values */
int poll_interval;
int alert; /* Alert on minutes remaining */
int alert_p; /* Alert on percentage remaining */
int alert_timeout; /* Popup dismissal timeout */
int suspend_below; /* Suspend if battery drops below this level */
int suspend_method; /* Method used to suspend the machine */
int force_mode; /* force use of batget or hal */
/* just config state */
Ecore_Exe *batget_exe;
Ecore_Event_Handler *batget_data_handler;
Ecore_Event_Handler *batget_del_handler;
Ecore_Timer *alert_timer;
int full;
int time_left;
int time_full;
int have_battery;
int have_power;
int desktop_notifications;
#ifdef HAVE_EEZE
Eeze_Udev_Watch *acwatch;
Eeze_Udev_Watch *batwatch;
#endif
#if defined HAVE_EEZE || defined __OpenBSD__ || defined __NetBSD__
Eina_Bool fuzzy;
int fuzzcount;
#endif
} batman;
struct
{
Evas_Object *o_gadget;
int poll_interval;
int low, high;
int sensor_type;
int temp;
const char *sensor_name;
Unit units;
#ifdef HAVE_EEZE
Ecore_Poller *poller;
Tempthread *tth;
#endif
Ecore_Thread *th;
Eina_Bool have_temp:1;
} thermal;
struct
{
Evas_Object *o_gadget;
int poll_interval;
int restore_governor;
int auto_powersave;
const char *powersave_governor;
const char *governor;
int pstate_min;
int pstate_max;
Cpu_Status *status;
Ecore_Thread *frequency_check_thread;
Ecore_Event_Handler *handler;
} cpuclock;
struct
{
Evas_Object *o_gadget;
int poll_interval;
long total;
long idle;
Ecore_Thread *usage_check_thread;
} cpumonitor;
struct
{
Evas_Object *o_gadget;
int poll_interval;
Ecore_Thread *usage_check_thread;
} memusage;
struct
{
Evas_Object *o_gadget;
int poll_interval;
long in;
long out;
Ecore_Thread *usage_check_thread;
} netstatus;
struct {
Evas_Object *o_batman;
Evas_Object *o_thermal;
Evas_Object *o_cpuclock;
Evas_Object *o_cpumonitor;
Evas_Object *o_memusage;
Evas_Object *o_netstatus;
} sysinfo;
};
struct _Instance
{
Evas_Object *o_main;
Evas_Object *popup_battery;
Evas_Object *warning;
Config_Item *cfg;
unsigned int notification_id;
};
EINTERN Evas_Object *config_sysinfo(E_Zone *zone, Instance *inst, E_Sysinfo_Module esm);
EINTERN Evas_Object *batman_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient);
EINTERN Evas_Object *thermal_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient);
EINTERN Evas_Object *cpuclock_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient);
EINTERN Evas_Object *cpumonitor_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient);
EINTERN Evas_Object *memusage_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient);
EINTERN Evas_Object *netstatus_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient);
EINTERN Evas_Object *sysinfo_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient);
EINTERN Evas_Object *config_sysinfo(E_Zone *zone, Instance *inst, E_Sysinfo_Module esm);
EINTERN Evas_Object *sysinfo_batman_create(Evas_Object *parent, Instance *inst);
EINTERN Evas_Object *sysinfo_thermal_create(Evas_Object *parent, Instance *inst);
EINTERN Evas_Object *sysinfo_cpuclock_create(Evas_Object *parent, Instance *inst);
EINTERN Evas_Object *sysinfo_cpumonitor_create(Evas_Object *parent, Instance *inst);
EINTERN Evas_Object *sysinfo_memusage_create(Evas_Object *parent, Instance *inst);
EINTERN Evas_Object *sysinfo_netstatus_create(Evas_Object *parent, Instance *inst);
EINTERN void sysinfo_batman_remove(Instance *inst);
EINTERN void sysinfo_thermal_remove(Instance *inst);
EINTERN void sysinfo_cpuclock_remove(Instance *inst);
EINTERN void sysinfo_cpumonitor_remove(Instance *inst);
EINTERN void sysinfo_memusage_remove(Instance *inst);
EINTERN void sysinfo_netstatus_remove(Instance *inst);
extern Config *sysinfo_config;
extern Eina_List *sysinfo_instances;
extern E_Module *module;
#endif