diff --git a/src/modules/sysinfo/e-module-sysinfo.edj b/src/modules/sysinfo/e-module-sysinfo.edj new file mode 100644 index 000000000..b861ae1b1 Binary files /dev/null and b/src/modules/sysinfo/e-module-sysinfo.edj differ diff --git a/src/modules/sysinfo/mod.c b/src/modules/sysinfo/mod.c new file mode 100644 index 000000000..dc13db157 --- /dev/null +++ b/src/modules/sysinfo/mod.c @@ -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; +} + diff --git a/src/modules/sysinfo/module.desktop.in b/src/modules/sysinfo/module.desktop.in new file mode 100644 index 000000000..b3a69d994 --- /dev/null +++ b/src/modules/sysinfo/module.desktop.in @@ -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 diff --git a/src/modules/sysinfo/sysinfo.c b/src/modules/sysinfo/sysinfo.c new file mode 100644 index 000000000..4da8a392c --- /dev/null +++ b/src/modules/sysinfo/sysinfo.c @@ -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; +} + diff --git a/src/modules/sysinfo/sysinfo.h b/src/modules/sysinfo/sysinfo.h new file mode 100644 index 000000000..a6191ba81 --- /dev/null +++ b/src/modules/sysinfo/sysinfo.h @@ -0,0 +1,238 @@ +#ifndef SYSINFO_H +#define SYSINFO_H + +#include "e.h" +#ifdef HAVE_EEZE +# include +#else +# include +#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