Only display the battery icon if it has changed (should save battery time, too)

This commit is contained in:
Pierre Pronchery 2010-05-06 17:51:17 +00:00
parent c3dad8ae5f
commit 0a2aaa0735

View File

@ -41,13 +41,30 @@
/* Battery */
/* private */
/* types */
typedef enum _BatteryLevel
{
BATTERY_LEVEL_UNKNOWN = 0,
BATTERY_LEVEL_ERROR,
BATTERY_LEVEL_CAUTION,
BATTERY_LEVEL_LOW,
BATTERY_LEVEL_NORMAL,
BATTERY_LEVEL_CHARGING
} BatteryLevel;
#define BATTERY_LEVEL_LAST BATTERY_LEVEL_CHARGING
#define BATTERY_LEVEL_COUNT (BATTERY_LEVEL_LAST + 1)
typedef struct _Battery
{
PanelAppletHelper * helper;
BatteryLevel level;
/* widgets */
GtkWidget * hbox;
GtkWidget * image;
GtkWidget * scale;
guint timeout;
/* platform-specific */
#if defined(__NetBSD__) || defined(__linux__)
int fd;
#endif
@ -91,6 +108,7 @@ static GtkWidget * _battery_init(PanelApplet * applet)
return NULL;
applet->priv = battery;
battery->helper = applet->helper;
battery->level = -1;
battery->timeout = 0;
#if defined(__NetBSD__) || defined(__linux__)
battery->fd = -1;
@ -129,35 +147,31 @@ static void _battery_destroy(PanelApplet * applet)
/* battery_set */
static void _set_image(Battery * battery, BatteryLevel level);
static void _battery_set(Battery * battery, gdouble value)
{
char buf[16];
snprintf(buf, sizeof(buf), "%.1lf%%", value);
/* XXX only set image and show when necessary? */
/* XXX only show when necessary? */
if(value >= 0.0 && value <= 100.0)
gtk_widget_show(battery->hbox);
if(value < 0.0)
{
gtk_image_set_from_icon_name(GTK_IMAGE(battery->image),
"stock_dialog-question",
battery->helper->icon_size);
_set_image(battery, BATTERY_LEVEL_UNKNOWN);
value = 0.0;
snprintf(buf, sizeof(buf), "%s", _("Unknown"));
}
else if(value <= 10.0)
gtk_image_set_from_icon_name(GTK_IMAGE(battery->image),
"battery-caution", battery->helper->icon_size);
_set_image(battery, BATTERY_LEVEL_CAUTION);
else if(value <= 20.0)
gtk_image_set_from_icon_name(GTK_IMAGE(battery->image),
"battery-low", battery->helper->icon_size);
_set_image(battery, BATTERY_LEVEL_LOW);
else if(value <= 100.0)
gtk_image_set_from_icon_name(GTK_IMAGE(battery->image),
"battery", battery->helper->icon_size);
_set_image(battery, BATTERY_LEVEL_NORMAL);
else
{
gtk_image_set_from_icon_name(GTK_IMAGE(battery->image),
"error", battery->helper->icon_size);
gtk_widget_hide(battery->hbox);
_set_image(battery, BATTERY_LEVEL_ERROR);
value = 0.0;
snprintf(buf, sizeof(buf), "%s", _("Error"));
}
@ -168,6 +182,24 @@ static void _battery_set(Battery * battery, gdouble value)
#endif
}
static void _set_image(Battery * battery, BatteryLevel level)
{
char const * icons[BATTERY_LEVEL_COUNT] =
{
"stock_dialog-question",
"stock_dialog-error",
"battery-caution",
"battery-low",
"battery",
"battery" /* XXX find a better icon */
};
if(battery->level == level)
return;
gtk_image_set_from_icon_name(GTK_IMAGE(battery->image), icons[level],
battery->helper->icon_size);
}
/* callbacks */
/* on_timeout */