all repos — tint2 @ ffd659208aee512520b6a8670deede7fb821b9f1

fork of the tint2 desktop panel for my custom setup - only minimized windows across all desktops for the taskbar

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.
Sebastian Reichel sre@ring0.de
commit

ffd659208aee512520b6a8670deede7fb821b9f1

parent

ae375ae526f55dd7b5ee288f3f18f5618c79d111

4 files changed, 105 insertions(+), 0 deletions(-)

jump to
M src/battery/battery.csrc/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 default_battery() { battery_enabled = 0; + battery_tooltip_enabled = 1; battery_found = 0; percentage_hide = 101; battery_low_cmd_sent = 0;

@@ -218,6 +220,13 @@ if (!battery_timeout)

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 @@ battery->area.size_mode = SIZE_BY_CONTENT;

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; }
M src/battery/battery.hsrc/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 @@ #ifdef __linux

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
M src/battery/linux.csrc/battery/linux.c

@@ -284,4 +284,76 @@ *seconds = 3600 * total_energy_now / total_power_now;

} } +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
M src/config.csrc/config.c

@@ -434,6 +434,11 @@ if (percentage_hide == 0)

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) {