diff --git a/src/modules/battery/e_mod_sysctl.c b/src/modules/battery/e_mod_sysctl.c index 293ee429a..ed6ee1032 100644 --- a/src/modules/battery/e_mod_sysctl.c +++ b/src/modules/battery/e_mod_sysctl.c @@ -126,7 +126,8 @@ _battery_sysctl_start(void) # endif _battery_sysctl_battery_update(); - bat->last_update = ecore_time_get(); + if (bat) + bat->last_update = ecore_time_get(); return 1; } @@ -184,6 +185,8 @@ _battery_sysctl_battery_update() ecore_poller_poller_interval_set(bat->poll, battery_config->poll_interval); # if defined(__OpenBSD__) || defined(__NetBSD__) + charge = 0; + /* last full capacity */ bat->mib[3] = 7; bat->mib[4] = 0; diff --git a/src/modules/sysinfo/batman/batman.c b/src/modules/sysinfo/batman/batman.c index 75a642558..9a9858a45 100644 --- a/src/modules/sysinfo/batman/batman.c +++ b/src/modules/sysinfo/batman/batman.c @@ -98,7 +98,9 @@ _batman_popup_create(Instance *inst) elm_box_pack_end(box, label); evas_object_show(label); - if (inst->cfg->batman.have_power && (inst->cfg->batman.full < 99)) + if (eina_list_count(batman_device_batteries) == 0) + snprintf(buf, sizeof(buf), _("No Battery Found")); + else if (inst->cfg->batman.have_power && (inst->cfg->batman.full < 99)) snprintf(buf, sizeof(buf), _("Battery Charging")); else if (inst->cfg->batman.full >= 99) snprintf(buf, sizeof(buf), _("Battery Fully Charged")); @@ -112,6 +114,16 @@ _batman_popup_create(Instance *inst) if (!eina_list_count(udis) || !eina_list_data_find(udis, bat->udi)) { udis = eina_list_append(udis, bat->udi); + if (bat->vendor && bat->vendor[0] && bat->model && bat->model[0]) + { + label = elm_label_add(box); + E_EXPAND(label); E_ALIGN(label, 0.5, 0.5); + snprintf(buf, sizeof(buf), "%s (%s)", bat->vendor, bat->model); + elm_object_text_set(label, buf); + elm_box_pack_end(box, label); + evas_object_show(label); + } + pbar = elm_progressbar_add(box); E_EXPAND(pbar); E_FILL(pbar); elm_progressbar_span_size_set(pbar, 200 * e_scale); diff --git a/src/modules/sysinfo/batman/batman.h b/src/modules/sysinfo/batman/batman.h index 68f1d91d0..31085a8e7 100644 --- a/src/modules/sysinfo/batman/batman.h +++ b/src/modules/sysinfo/batman/batman.h @@ -58,13 +58,6 @@ struct _Battery Eina_Bool got_prop E_BITFIELD; Eldbus_Proxy *proxy; int * mib; -#if defined(__FreeBSD__) || defined(__DragonFly__) - int * mib_state; - int * mib_units; - int * mib_time; - int batteries; - int time_min; -#endif }; struct _Ac_Adapter diff --git a/src/modules/sysinfo/batman/batman_sysctl.c b/src/modules/sysinfo/batman/batman_sysctl.c index 2ef39134d..a912c301a 100644 --- a/src/modules/sysinfo/batman/batman_sysctl.c +++ b/src/modules/sysinfo/batman/batman_sysctl.c @@ -3,6 +3,11 @@ #include #include +#if defined(__FreeBSD__) || defined(__DragonFly__) +# include +# include +#endif + #if defined(__OpenBSD__) || defined(__NetBSD__) # include # include @@ -25,10 +30,13 @@ _batman_sysctl_start(Instance *inst) struct sensordev snsrdev; size_t sdlen = sizeof(struct sensordev); char name[256]; -#elif defined(__FreeBSD__) || defined(__DragonFly__) - size_t len; -#endif -#if defined(__OpenBSD__) || defined(__NetBSD__) + + if (eina_list_count(batman_device_batteries) != 0) + { + _batman_sysctl_battery_update(inst); + return 1; + } + for (devn = 0;; devn++) { mib[2] = devn; @@ -79,41 +87,49 @@ _batman_sysctl_start(Instance *inst) } } #elif defined(__FreeBSD__) || defined(__DragonFly__) - if ((sysctlbyname("hw.acpi.battery.life", NULL, &len, NULL, 0)) != -1) + size_t len; + int i, count, fd; + union acpi_battery_ioctl_arg battio; + + if (eina_list_count(batman_device_batteries) != 0) { - Battery *bat = E_NEW(Battery, 1); - if (!bat) - return 0; - bat->inst = inst; - bat->mib = malloc(sizeof(int) * 4); - if (!bat->mib) return 0; - sysctlnametomib("hw.acpi.battery.life", bat->mib, &len); - - bat->mib_state = malloc(sizeof(int) * 4); - if (!bat->mib_state) return 0; - sysctlnametomib("hw.acpi.battery.state", bat->mib_state, &len); - - bat->mib_time = malloc(sizeof(int) * 4); - if (!bat->mib_time) return 0; - sysctlnametomib("hw.acpi.battery.time", bat->mib_time, &len); - - bat->mib_units = malloc(sizeof(int) * 4); - if (!bat->mib_units) return 0; - sysctlnametomib("hw.acpi.battery.units", bat->mib_units, &len); - - bat->last_update = ecore_time_get(); - bat->udi = eina_stringshare_add("hw.acpi.battery"); - bat->technology = eina_stringshare_add("Unknown"); - bat->model = eina_stringshare_add("Unknown"); - bat->vendor = eina_stringshare_add("Unknown"); - - bat->poll = ecore_poller_add(ECORE_POLLER_CORE, - inst->cfg->batman.poll_interval, - _batman_sysctl_battery_update_poll, inst); - - batman_device_batteries = eina_list_append(batman_device_batteries, bat); + _batman_sysctl_battery_update(inst); + return 1; } + if ((fd = open("/dev/acpi", O_RDONLY)) == -1) + return 0; + + if (ioctl(fd, ACPIIO_BATT_GET_UNITS, &count) == -1) + { + close(fd); + return 0; + } + + for (i = 0; i < count; i++) + { + battio.unit = i; + if (ioctl(fd, ACPIIO_BATT_GET_BIF, &battio) != -1) + { + Battery *bat = E_NEW(Battery, 1); + if (!bat) return 0; + + bat->inst = inst; + bat->last_update = ecore_time_get(); + bat->last_full_charge = battio.bif.lfcap; + bat->model = eina_stringshare_add(battio.bif.model); + bat->vendor = eina_stringshare_add(battio.bif.oeminfo); + bat->technology = eina_stringshare_add(battio.bif.type); + bat->poll = ecore_poller_add(ECORE_POLLER_CORE, + inst->cfg->batman.poll_interval, + _batman_sysctl_battery_update_poll, inst); + + batman_device_batteries = eina_list_append(batman_device_batteries, bat); + } + } + + close(fd); + if ((sysctlbyname("hw.acpi.acline", NULL, &len, NULL, 0)) != -1) { Ac_Adapter *ac = E_NEW(Ac_Adapter, 1); @@ -155,11 +171,6 @@ _batman_sysctl_stop(void) E_FREE_FUNC(bat->model, eina_stringshare_del); E_FREE_FUNC(bat->vendor, eina_stringshare_del); E_FREE_FUNC(bat->poll, ecore_poller_del); -#if defined(__FreeBSD__) || defined(__DragonFly__) - E_FREE(bat->mib_state); - E_FREE(bat->mib_time); - E_FREE(bat->mib_units); -#endif E_FREE(bat->mib); E_FREE(bat); } @@ -189,9 +200,9 @@ _batman_sysctl_battery_update(Instance *inst) struct sensor s; size_t slen = sizeof(struct sensor); #elif defined(__FreeBSD__) || defined(__DragonFly__) - double _time; - int value; + union acpi_battery_ioctl_arg battio; size_t len; + int value, fd, i = 0; #endif EINA_LIST_FOREACH(batman_device_batteries, l, bat) { @@ -284,44 +295,38 @@ _batman_sysctl_battery_update(Instance *inst) } _batman_device_update(bat->inst); #elif defined(__FreeBSD__) || defined(__DragonFly__) - len = sizeof(value); - if ((sysctl(bat->mib, 4, &value, &len, NULL, 0)) == -1) + + if ((fd = open("/dev/acpi", O_RDONLY)) != -1) { - return EINA_FALSE; + battio.unit = i; + + if (ioctl(fd, ACPIIO_BATT_GET_BATTINFO, &battio) != -1) + { + bat->got_prop = 1; + + bat->percent = battio.battinfo.cap; + + if (battio.battinfo.state & ACPI_BATT_STAT_CHARGING) + bat->charging = EINA_TRUE; + else + bat->charging = EINA_FALSE; + + bat->time_left = battio.battinfo.min * 60; + if (bat->charge_rate > 0) + { + bat->time_full = (bat->last_full_charge - bat->current_charge) / bat->charge_rate; + } + } + else + { + bat->time_full = bat->time_left = -1; + } + + close(fd); } - bat->percent = value; - - _time = ecore_time_get(); - bat->last_update = _time; - - len = sizeof(value); - if ((sysctl(bat->mib_state, 4, &value, &len, NULL, 0)) == -1) - { - return EINA_FALSE; - } - - bat->charging = !value; - bat->got_prop = 1; - - bat->time_full = -1; - bat->time_left = -1; - - len = sizeof(bat->time_min); - if ((sysctl(bat->mib_time, 4, &bat->time_min, &len, NULL, 0)) == -1) - { - bat->time_min = -1; - } - - len = sizeof(bat->batteries); - if ((sysctl(bat->mib_units, 4, &bat->batteries, &len, NULL, 0)) == -1) - { - bat->batteries = 1; - } - - if (bat->time_min >= 0) bat->time_left = bat->time_min * 60; - if (bat->batteries == 1) bat->time_left = -1; _batman_device_update(inst); + i++; #endif }