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