forked from enlightenment/enlightenment
parent
9ca7a6a0dc
commit
ec414c6f6a
1
TODO
1
TODO
|
@ -33,6 +33,7 @@ Some of the things (in very short form) that need to be done to E17...
|
||||||
ESSENTIAL FEATURES
|
ESSENTIAL FEATURES
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
* if a parent window is "on top" child dialog windows should also be "on top"
|
||||||
* in addition to smart place should add manual placement and place at pointer
|
* in addition to smart place should add manual placement and place at pointer
|
||||||
and maybe a few others.
|
and maybe a few others.
|
||||||
* support xrandr to change res from e itself (and save it etc.)
|
* support xrandr to change res from e itself (and save it etc.)
|
||||||
|
|
|
@ -4,6 +4,16 @@
|
||||||
#include "e.h"
|
#include "e.h"
|
||||||
#include "e_mod_main.h"
|
#include "e_mod_main.h"
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#ifdef __i386__
|
||||||
|
#include <machine/apm_bios.h>
|
||||||
|
#endif
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* TODO List:
|
/* TODO List:
|
||||||
*
|
*
|
||||||
* which options should be in main menu, and which in face menu?
|
* which options should be in main menu, and which in face menu?
|
||||||
|
@ -16,6 +26,9 @@ static void _battery_config_menu_new(Battery *e);
|
||||||
static int _battery_cb_check(void *data);
|
static int _battery_cb_check(void *data);
|
||||||
static Status *_battery_linux_acpi_check(Battery *ef);
|
static Status *_battery_linux_acpi_check(Battery *ef);
|
||||||
static Status *_battery_linux_apm_check(Battery *ef);
|
static Status *_battery_linux_apm_check(Battery *ef);
|
||||||
|
/* Should these be #ifdef'd ? */
|
||||||
|
static Status *_battery_bsd_acpi_check(Battery *ef);
|
||||||
|
static Status *_battery_bsd_apm_check(Battery *ef);
|
||||||
|
|
||||||
static Battery_Face *_battery_face_new(E_Container *con);
|
static Battery_Face *_battery_face_new(E_Container *con);
|
||||||
static void _battery_face_free(Battery_Face *ef);
|
static void _battery_face_free(Battery_Face *ef);
|
||||||
|
@ -98,7 +111,7 @@ e_modapi_about(E_Module *m)
|
||||||
e_error_dialog_show(_("Enlightenment Battery Module"),
|
e_error_dialog_show(_("Enlightenment Battery Module"),
|
||||||
_("A basic battery meter that uses either ACPI or APM\n"
|
_("A basic battery meter that uses either ACPI or APM\n"
|
||||||
"on Linux to monitor your battery and AC power adaptor\n"
|
"on Linux to monitor your battery and AC power adaptor\n"
|
||||||
"status. This will only work under Linux and is only\n"
|
"status. This will work under Linux and FreeBSD and is only\n"
|
||||||
"as accurate as your BIOS or kernel drivers."));
|
"as accurate as your BIOS or kernel drivers."));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -635,24 +648,57 @@ _battery_cb_check(void *data)
|
||||||
Status *ret = NULL;
|
Status *ret = NULL;
|
||||||
|
|
||||||
ef = data;
|
ef = data;
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
int acline;
|
||||||
|
size_t len;
|
||||||
|
int apm_fd = -1;
|
||||||
|
int acline_mib[3] = {-1};
|
||||||
|
|
||||||
if (ef->battery_check_mode == 0)
|
if (ef->battery_check_mode == 0)
|
||||||
{
|
{
|
||||||
if (ecore_file_is_dir("/proc/acpi"))
|
len = sizeof(acline);
|
||||||
ef->battery_check_mode = CHECK_LINUX_ACPI;
|
if (sysctlbyname("hw.acpi.acline", &acline, &len, NULL, 0) == 0)
|
||||||
else if (ecore_file_exists("/proc/apm"))
|
{
|
||||||
ef->battery_check_mode = CHECK_LINUX_APM;
|
len = 3;
|
||||||
|
if (sysctlnametomib("hw.acpi.acline", acline_mib, &len) == 0)
|
||||||
|
ef->battery_check_mode = CHECK_ACPI;
|
||||||
|
} else {
|
||||||
|
apm_fd = open("/dev/apm", O_RDONLY);
|
||||||
|
if (apm_fd != -1)
|
||||||
|
ef->battery_check_mode = CHECK_APM;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
switch (ef->battery_check_mode)
|
switch (ef->battery_check_mode)
|
||||||
{
|
{
|
||||||
case CHECK_LINUX_ACPI:
|
case CHECK_ACPI:
|
||||||
|
ret = _battery_bsd_acpi_check(ef);
|
||||||
|
break;
|
||||||
|
case CHECK_APM:
|
||||||
|
ret = _battery_bsd_apm_check(ef);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (ef->battery_check_mode == 0)
|
||||||
|
{
|
||||||
|
if (ecore_file_is_dir("/proc/acpi"))
|
||||||
|
ef->battery_check_mode = CHECK_ACPI;
|
||||||
|
else if (ecore_file_exists("/proc/apm"))
|
||||||
|
ef->battery_check_mode = CHECK_APM;
|
||||||
|
}
|
||||||
|
switch (ef->battery_check_mode)
|
||||||
|
{
|
||||||
|
case CHECK_ACPI:
|
||||||
ret = _battery_linux_acpi_check(ef);
|
ret = _battery_linux_acpi_check(ef);
|
||||||
break;
|
break;
|
||||||
case CHECK_LINUX_APM:
|
case CHECK_APM:
|
||||||
ret = _battery_linux_apm_check(ef);
|
ret = _battery_linux_apm_check(ef);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
if (ret->has_battery)
|
if (ret->has_battery)
|
||||||
|
@ -1026,6 +1072,263 @@ _battery_linux_apm_check(Battery *ef)
|
||||||
return stat;
|
return stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Status *
|
||||||
|
_battery_bsd_acpi_check(Battery *ef)
|
||||||
|
{
|
||||||
|
/* Assumes only a single battery - I don't know how multiple batts
|
||||||
|
* are represented in sysctl */
|
||||||
|
|
||||||
|
Ecore_List *bats;
|
||||||
|
char buf[4096], buf2[4096];
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
int bat_max = 0;
|
||||||
|
int bat_filled = 0;
|
||||||
|
int bat_level = 0;
|
||||||
|
int bat_drain = 1;
|
||||||
|
|
||||||
|
int bat_val = 0;
|
||||||
|
|
||||||
|
int discharging = 0;
|
||||||
|
int charging = 0;
|
||||||
|
int battery = 0;
|
||||||
|
|
||||||
|
int design_cap_unknown = 0;
|
||||||
|
int last_full_unknown = 0;
|
||||||
|
int rate_unknown = 0;
|
||||||
|
int level_unknown = 0;
|
||||||
|
|
||||||
|
int hours, minutes;
|
||||||
|
|
||||||
|
int mib_state[4];
|
||||||
|
int mib_life[4];
|
||||||
|
int mib_time[4];
|
||||||
|
int mib_units[4];
|
||||||
|
size_t len;
|
||||||
|
int state;
|
||||||
|
int level;
|
||||||
|
int time;
|
||||||
|
int life;
|
||||||
|
int batteries;
|
||||||
|
|
||||||
|
Status *stat;
|
||||||
|
|
||||||
|
stat = E_NEW(Status, 1);
|
||||||
|
|
||||||
|
/* Read some information on first run. */
|
||||||
|
len = 4;
|
||||||
|
sysctlnametomib("hw.acpi.battery.state", mib_state, &len);
|
||||||
|
len = sizeof(state);
|
||||||
|
if (sysctl(mib_state, 4, &state, &len, NULL, 0) == -1)
|
||||||
|
/* ERROR */
|
||||||
|
state = -1;
|
||||||
|
|
||||||
|
len = 4;
|
||||||
|
sysctlnametomib("hw.acpi.battery.life", mib_life, &len);
|
||||||
|
len = sizeof(life);
|
||||||
|
if (sysctl(mib_life, 4, &life, &len, NULL, 0) == -1)
|
||||||
|
/* ERROR */
|
||||||
|
level = -1;
|
||||||
|
|
||||||
|
bat_val = life;
|
||||||
|
|
||||||
|
len = 4;
|
||||||
|
sysctlnametomib("hw.acpi.battery.time", mib_time, &len);
|
||||||
|
len = sizeof(time);
|
||||||
|
if (sysctl(mib_time, 4, &time, &len, NULL, 0) == -1)
|
||||||
|
/* ERROR */
|
||||||
|
time = -2;
|
||||||
|
|
||||||
|
len = 4;
|
||||||
|
sysctlnametomib("hw.acpi.battery.units", mib_units, &len);
|
||||||
|
len = sizeof(batteries);
|
||||||
|
if (sysctl(mib_time, 4, &batteries, &len, NULL, 0) == -1)
|
||||||
|
/* ERROR */
|
||||||
|
batteries = 1;
|
||||||
|
|
||||||
|
if (ef->battery_prev_drain < 1)
|
||||||
|
ef->battery_prev_drain = 1;
|
||||||
|
|
||||||
|
if (bat_drain < 1)
|
||||||
|
bat_drain = ef->battery_prev_drain;
|
||||||
|
|
||||||
|
ef->battery_prev_drain = bat_drain;
|
||||||
|
|
||||||
|
/*if (bat_filled > 0)
|
||||||
|
bat_val = (100 * bat_level) / bat_filled;
|
||||||
|
else
|
||||||
|
bat_val = 100;
|
||||||
|
|
||||||
|
if (state == BATTERY_STATE_DISCHARGING)
|
||||||
|
minutes = (60 * bat_level) / bat_drain;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (bat_filled > 0)
|
||||||
|
minutes = (60 * (bat_filled - bat_level)) / bat_drain;
|
||||||
|
else
|
||||||
|
minutes = 0;
|
||||||
|
}*/
|
||||||
|
minutes = time;
|
||||||
|
hours = minutes / 60;
|
||||||
|
minutes -= (hours * 60);
|
||||||
|
|
||||||
|
if (hours < 0)
|
||||||
|
hours = 0;
|
||||||
|
if (minutes < 0)
|
||||||
|
minutes = 0;
|
||||||
|
|
||||||
|
if (batteries == 1) /* hw.acpi.battery.units = 1 means NO BATTS */
|
||||||
|
{
|
||||||
|
stat->has_battery = 0;
|
||||||
|
stat->state = BATTERY_STATE_NONE;
|
||||||
|
stat->reading = strdup(_("NO BAT"));
|
||||||
|
stat->time = strdup("--:--");
|
||||||
|
stat->level = 1.0;
|
||||||
|
}
|
||||||
|
else if ((state == BATTERY_STATE_CHARGING) ||
|
||||||
|
(state == BATTERY_STATE_DISCHARGING))
|
||||||
|
{
|
||||||
|
ef->battery_prev_battery = 1;
|
||||||
|
stat->has_battery = 1;
|
||||||
|
if (state == BATTERY_STATE_CHARGING)
|
||||||
|
{
|
||||||
|
stat->state = BATTERY_STATE_CHARGING;
|
||||||
|
ef->alarm_triggered = 0;
|
||||||
|
}
|
||||||
|
else if (state == BATTERY_STATE_DISCHARGING)
|
||||||
|
{
|
||||||
|
stat->state = BATTERY_STATE_DISCHARGING;
|
||||||
|
if (stat->level < 0.1) /* Why this if condition */
|
||||||
|
{
|
||||||
|
if (((hours * 60) + minutes) <= ef->conf->alarm)
|
||||||
|
stat->alarm = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!level)
|
||||||
|
{
|
||||||
|
stat->reading = strdup(_("BAD DRIVER"));
|
||||||
|
stat->time = strdup("--:--");
|
||||||
|
stat->level = 0.0;
|
||||||
|
}
|
||||||
|
else if (time == -1)
|
||||||
|
{
|
||||||
|
snprintf(buf, sizeof(buf), "%i%%", bat_val);
|
||||||
|
stat->reading = strdup(buf);
|
||||||
|
stat->time = strdup("--:--");
|
||||||
|
stat->level = (double)bat_val / 100.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
snprintf(buf, sizeof(buf), "%i%%", bat_val);
|
||||||
|
stat->reading = strdup(buf);
|
||||||
|
snprintf(buf, sizeof(buf), "%i:%02i", hours, minutes);
|
||||||
|
stat->time = strdup(buf);
|
||||||
|
stat->level = (double)bat_val / 100.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stat->has_battery = 1;
|
||||||
|
stat->state = BATTERY_STATE_NONE;
|
||||||
|
stat->reading = strdup(_("FULL"));
|
||||||
|
stat->time = strdup("--:--");
|
||||||
|
stat->level = 1.0;
|
||||||
|
}
|
||||||
|
return stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Status *
|
||||||
|
_battery_bsd_apm_check(Battery *ef)
|
||||||
|
{
|
||||||
|
int ac_stat, bat_stat, bat_val, time_val;
|
||||||
|
char buf[4096];
|
||||||
|
int hours, minutes;
|
||||||
|
int apm_fd = -1;
|
||||||
|
struct apm_info info;
|
||||||
|
|
||||||
|
Status *stat;
|
||||||
|
|
||||||
|
apm_fd = open("/dev/apm", O_RDONLY);
|
||||||
|
|
||||||
|
if (apm_fd != -1 && ioctl(apm_fd, APMIO_GETINFO, &info) != -1)
|
||||||
|
{
|
||||||
|
/* set values */
|
||||||
|
ac_stat = info.ai_acline;
|
||||||
|
bat_stat = info.ai_batt_stat;
|
||||||
|
bat_val = info.ai_batt_life;
|
||||||
|
time_val = info.ai_batt_time;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
stat = E_NEW(Status, 1);
|
||||||
|
|
||||||
|
if (info.ai_batteries == 1) /* ai_batteries == 1 means NO battery,
|
||||||
|
ai_batteries == 2 means 1 battery */
|
||||||
|
{
|
||||||
|
stat->has_battery = 0;
|
||||||
|
stat->state = BATTERY_STATE_NONE;
|
||||||
|
stat->reading = strdup("NO BAT");
|
||||||
|
stat->time = strdup("--:--");
|
||||||
|
stat->level = 1.0;
|
||||||
|
return stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ef->battery_prev_battery = 1;
|
||||||
|
stat->has_battery = 1;
|
||||||
|
|
||||||
|
if (ac_stat) /* Wallpowered */
|
||||||
|
{
|
||||||
|
stat->state = BATTERY_STATE_CHARGING;
|
||||||
|
stat->time = strdup("--:--");
|
||||||
|
switch (bat_stat) /* On FreeBSD the time_val is -1 when AC ist plugged
|
||||||
|
in. This means we don't know how long the battery
|
||||||
|
will recharge */
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
stat->reading = strdup(_("High"));
|
||||||
|
stat->level = 1.0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
stat->reading = strdup(_("Low"));
|
||||||
|
stat->level = 0.5;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
stat->reading = strdup(_("Danger"));
|
||||||
|
stat->level = 0.25;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
stat->reading = strdup(_("Charging"));
|
||||||
|
stat->level = 1.0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* Running on battery */
|
||||||
|
{
|
||||||
|
stat->state = BATTERY_STATE_DISCHARGING;
|
||||||
|
|
||||||
|
snprintf(buf, sizeof(buf), "%i%%", bat_val);
|
||||||
|
stat->reading = strdup(buf);
|
||||||
|
stat->level = (double)bat_val / 100.0;
|
||||||
|
|
||||||
|
hours = time_val / 3600;
|
||||||
|
minutes = (time_val / 60) % 60;
|
||||||
|
snprintf(buf, sizeof(buf), "%i:%02i", hours, minutes);
|
||||||
|
stat->time = strdup(buf);
|
||||||
|
|
||||||
|
if (stat->level < 0.1) /* Why this if condition? */
|
||||||
|
{
|
||||||
|
if (((hours * 60) + minutes) <= ef->conf->alarm)
|
||||||
|
stat->alarm = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stat;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_battery_face_level_set(Battery_Face *ef, double level)
|
_battery_face_level_set(Battery_Face *ef, double level)
|
||||||
{
|
{
|
||||||
|
@ -1063,3 +1366,4 @@ _battery_face_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi)
|
||||||
face = data;
|
face = data;
|
||||||
e_gadman_mode_set(face->gmc->gadman, E_GADMAN_MODE_EDIT);
|
e_gadman_mode_set(face->gmc->gadman, E_GADMAN_MODE_EDIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,8 @@ typedef struct _Battery_Face Battery_Face;
|
||||||
typedef struct _Status Status;
|
typedef struct _Status Status;
|
||||||
|
|
||||||
#define CHECK_NONE 0
|
#define CHECK_NONE 0
|
||||||
#define CHECK_LINUX_ACPI 1
|
#define CHECK_ACPI 1
|
||||||
#define CHECK_LINUX_APM 2
|
#define CHECK_APM 2
|
||||||
|
|
||||||
struct _Config
|
struct _Config
|
||||||
{
|
{
|
||||||
|
@ -57,9 +57,16 @@ struct _Battery_Face
|
||||||
E_Gadman_Client *gmc;
|
E_Gadman_Client *gmc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
#define BATTERY_STATE_NONE 0
|
||||||
|
#define BATTERY_STATE_DISCHARGING 1
|
||||||
|
#define BATTERY_STATE_CHARGING 2
|
||||||
|
#define BATTERY_STATE_REMOVED 7
|
||||||
|
#else
|
||||||
#define BATTERY_STATE_NONE 0
|
#define BATTERY_STATE_NONE 0
|
||||||
#define BATTERY_STATE_CHARGING 1
|
#define BATTERY_STATE_CHARGING 1
|
||||||
#define BATTERY_STATE_DISCHARGING 2
|
#define BATTERY_STATE_DISCHARGING 2
|
||||||
|
#endif
|
||||||
|
|
||||||
struct _Status
|
struct _Status
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue