From ffd659208aee512520b6a8670deede7fb821b9f1 Mon Sep 17 00:00:00 2001 From: Sebastian Reichel Date: Wed, 5 Aug 2015 02:15:06 +0200 Subject: [PATCH] Add battery tooltip support This adds a new config option 'battery_tooltip' (enabled by default), which can be used to enable a tooltip for the battery widget providing details for all installed batteries. --- src/battery/battery.c | 12 ++++++++ src/battery/battery.h | 16 ++++++++++ src/battery/linux.c | 72 +++++++++++++++++++++++++++++++++++++++++++ src/config.c | 5 +++ 4 files changed, 105 insertions(+) diff --git a/src/battery/battery.c b/src/battery/battery.c index ccd10fb..a830ac0 100644 --- a/src/battery/battery.c +++ b/src/battery/battery.c @@ -47,6 +47,7 @@ PangoFontDescription *bat1_font_desc; PangoFontDescription *bat2_font_desc; struct batstate battery_state; int battery_enabled; +int battery_tooltip_enabled; int percentage_hide; static timeout* battery_timeout; @@ -135,6 +136,7 @@ void update_battery_tick(void* arg) void default_battery() { battery_enabled = 0; + battery_tooltip_enabled = 1; battery_found = 0; percentage_hide = 101; battery_low_cmd_sent = 0; @@ -218,6 +220,13 @@ void init_battery() battery_timeout = add_timeout(10, 30000, update_battery_tick, 0, &battery_timeout); } +const char* battery_get_tooltip(void* obj) { +#if defined(__linux) + return linux_batteries_get_tooltip(); +#else + return g_strdup("No tooltip support for this OS!"); +#endif +} void init_battery_panel(void *p) { @@ -242,6 +251,9 @@ void init_battery_panel(void *p) battery->area._resize = resize_battery; battery->area.on_screen = 1; battery->area.resize = 1; + + if (battery_tooltip_enabled) + battery->area._get_tooltip_text = battery_get_tooltip; } diff --git a/src/battery/battery.h b/src/battery/battery.h index e7729b3..6354827 100644 --- a/src/battery/battery.h +++ b/src/battery/battery.h @@ -51,6 +51,7 @@ extern struct batstate battery_state; extern PangoFontDescription *bat1_font_desc; extern PangoFontDescription *bat2_font_desc; extern int battery_enabled; +extern int battery_tooltip_enabled; extern int percentage_hide; extern int8_t battery_low_status; @@ -62,6 +63,20 @@ extern char *battery_rclick_command; extern char *battery_uwheel_command; extern char *battery_dwheel_command; +static inline gchar* chargestate2str(enum chargestate state) { + switch(state) { + case BATTERY_CHARGING: + return "Charging"; + case BATTERY_DISCHARGING: + return "Discharging"; + case BATTERY_FULL: + return "Full"; + case BATTERY_UNKNOWN: + default: + return "Unknown"; + }; +} + // default global data void default_battery(); @@ -83,6 +98,7 @@ void battery_action(int button); gboolean init_linux_batteries(); void free_linux_batteries(); void update_linux_batteries(enum chargestate *state, gint64 *energy_now, gint64 *energy_full, int *seconds); +const char* linux_batteries_get_tooltip(); #endif #endif diff --git a/src/battery/linux.c b/src/battery/linux.c index 79f50eb..7054827 100644 --- a/src/battery/linux.c +++ b/src/battery/linux.c @@ -284,4 +284,76 @@ void update_linux_batteries(enum chargestate *state, gint64 *energy_now, gint64 } } +static gchar* energy_human_readable(struct psy_battery *bat) { + gint now = bat->energy_now; + gint full = bat->energy_full; + gchar unit = bat->energy_in_uamp ? 'A' : 'W'; + + if (full >= 1000000) { + return g_strdup_printf("%d.%d / %d.%d %ch", + now / 1000000, (now % 1000000) / 100000, + full / 1000000, (full % 1000000) / 100000, + unit); + } else if (full >= 1000) { + return g_strdup_printf("%d.%d / %d.%d m%ch", + now / 1000, (now % 1000) / 100, + full / 1000, (full % 1000) / 100, + unit); + } else { + return g_strdup_printf("%d / %d µ%ch", now, full, unit); + } +} + +static gchar* power_human_readable(struct psy_battery *bat) { + gint power = bat->power_now; + gchar unit = bat->power_in_uamp ? 'A' : 'W'; + + if (power >= 1000000) { + return g_strdup_printf("%d.%d %c", power / 1000000, (power % 1000000) / 100000, unit); + } else if (power >= 1000) { + return g_strdup_printf("%d.%d m%c", power / 1000, (power % 1000) / 100, unit); + } else if (power > 0) { + return g_strdup_printf("%d µ%c", power, unit); + } else { + return g_strdup_printf("0 %c", unit); + } +} + +const char* linux_batteries_get_tooltip() { + GList *l; + GString *tooltip = g_string_new(""); + gchar *result; + + for (l = batteries; l != NULL; l = l->next) { + struct psy_battery *bat = l->data; + + if (tooltip->len) + g_string_append_c(tooltip, '\n'); + + g_string_append_printf(tooltip, "%s\n", bat->name); + + if (!bat->present) { + g_string_append_printf(tooltip, "\tnot connected"); + continue; + } + + gchar *power = power_human_readable(bat); + gchar *energy = energy_human_readable(bat); + gchar *state = (bat->status == BATTERY_UNKNOWN) ? "Level" : chargestate2str(bat->status); + + guint percentage = 0.5 + ((bat->energy_now <= bat->energy_full ? bat->energy_now : bat->energy_full) * 100.0) / bat->energy_full; + + g_string_append_printf(tooltip, "\t%s: %s (%u %%)\n\tPower: %s", + state, energy, percentage, power); + + g_free(power); + g_free(energy); + } + + result = tooltip->str; + g_string_free(tooltip, FALSE); + + return result; +} + #endif diff --git a/src/config.c b/src/config.c index 4c8ba76..378e2b6 100644 --- a/src/config.c +++ b/src/config.c @@ -434,6 +434,11 @@ void add_entry (char *key, char *value) percentage_hide = 101; #endif } + else if (strcmp (key, "battery_tooltip") == 0) { +#ifdef ENABLE_BATTERY + battery_tooltip_enabled = atoi(value); +#endif + } /* Clock */ else if (strcmp (key, "time1_format") == 0) {