[Pkg-wmaker-commits] [wmacpi] 15/105: wmacpi: Bump to version 1.99r7.
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Tue Aug 18 01:13:40 UTC 2015
This is an automated email from the git hooks/post-receive script.
dtorrance-guest pushed a commit to branch master
in repository wmacpi.
commit dcf09cd33eb46dbdf95c1fe1aa87420edfd02c74
Author: Doug Torrance <dtorrance at monmouthcollege.edu>
Date: Mon Aug 18 17:56:21 2014 -0500
wmacpi: Bump to version 1.99r7.
Source obtained from http://sourceforge.net/projects/wmacpi/files/.
2004 August 18 1.99r7
Implemented the libdockapp port - this seems to close Debian bug
#227819, but it hasn't received sufficient testing.
Implemented a capacity mode for calculating time remaining (as
opposed to the normal current rate mode) - this mode samples the
remaining capacity of the battery and notes the time at which it
was sampled, and uses a history of samples to estimate the rate of
drain on the battery. From there it calculates a value for time
remaining.
Also, various cleanups have gone in:
* a reworking of the scrolling code
* generic battery number support (rather than just
using two pixmaps, one for b1 and one for b2)
* stopped the battery glyph from blinking when running on AC
---
ChangeLog | 20 +++
Makefile | 2 +-
acpi.c | 6 +-
libacpi.c | 158 +++++++++++++++++++----
libacpi.h | 31 ++---
master.xpm | 58 ++++-----
master_low.xpm | 56 ++++-----
wmacpi.1 | 18 ++-
wmacpi.c | 385 +++++++++++++++++++++++++--------------------------------
9 files changed, 410 insertions(+), 324 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index be3fdcd..1a079a1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2004 August 18 1.99r7
+ Implemented the libdockapp port - this seems to close Debian bug
+ #227819, but it hasn't received sufficient testing.
+
+ Implemented a capacity mode for calculating time remaining (as
+ opposed to the normal current rate mode) - this mode samples the
+ remaining capacity of the battery and notes the time at which it
+ was sampled, and uses a history of samples to estimate the rate of
+ drain on the battery. From there it calculates a value for time
+ remaining.
+
+ Also, various cleanups have gone in:
+
+ * a reworking of the scrolling code
+
+ * generic battery number support (rather than just
+ using two pixmaps, one for b1 and one for b2)
+
+ * stopped the battery glyph from blinking when running on AC
+
2004 July 19 1.99r6
Fix for Debian bug #250792 - the parser for the acpi files was
too stupid to deal with error conditions. I've now added some
diff --git a/Makefile b/Makefile
index 700e230..4d53ae1 100644
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,7 @@ BUILD_CLI = 1
CC := gcc
CFLAGS := $(OPT) -Wall -W -g -ansi -I/usr/X11R6/include
-LDFLAGS := $(OPT) -L/usr/X11R6/lib -lX11 -lXpm -lXext
+LDFLAGS := $(OPT) -L/usr/X11R6/lib -lX11 -lXpm -lXext -ldockapp
WMSRC := wmacpi.c libacpi.c
HEADERS := libacpi.h wmacpi.h
diff --git a/acpi.c b/acpi.c
index 8b748c5..c56b15e 100644
--- a/acpi.c
+++ b/acpi.c
@@ -86,12 +86,12 @@ int main(int argc, char *argv[])
globals = (global_t *) malloc(sizeof(global_t));
- power_init();
+ power_init(globals);
/* we want to acquire samples over some period of time, so . . . */
for(i = 0; i < samples + 2; i++) {
for(j = 0; j < globals->battery_count; j++)
- acquire_batt_info(j);
- acquire_global_info();
+ acquire_batt_info(globals, j);
+ acquire_global_info(globals);
usleep(sleep_time);
}
diff --git a/libacpi.c b/libacpi.c
index b888d5f..ac54326 100644
--- a/libacpi.c
+++ b/libacpi.c
@@ -6,17 +6,18 @@
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
+#include <time.h>
#include "libacpi.h"
extern char *state[];
-extern global_t *globals;
+/* extern global_t *globals; */
/* local proto */
int acpi_get_design_cap(int batt);
/* initialise the batteries */
-int init_batteries(void)
+int init_batteries(global_t *globals)
{
DIR *battdir;
struct dirent *batt;
@@ -83,16 +84,16 @@ int init_batteries(void)
}
/* a stub that just calls the current function */
-int reinit_batteries(void)
+int reinit_batteries(global_t *globals)
{
pdebug("reinitialising batteries\n");
- return init_batteries();
+ return init_batteries(globals);
}
/* the actual name of the subdirectory under ac_adapter may
* be anything, so we need to read the directory and use the
* name we find there. */
-int init_ac_adapters(void)
+int init_ac_adapters(global_t *globals)
{
DIR *acdir;
struct dirent *adapter;
@@ -125,14 +126,14 @@ int init_ac_adapters(void)
}
/* stub that does nothing but call the normal init function */
-int reinit_ac_adapters(void)
+int reinit_ac_adapters(global_t *globals)
{
pdebug("reinitialising ac adapters\n");
- return init_ac_adapters();
+ return init_ac_adapters(globals);
}
/* see if we have ACPI support and check version */
-int power_init(void)
+int power_init(global_t *globals)
{
FILE *acpi;
char buf[4096];
@@ -156,14 +157,14 @@ int power_init(void)
/* yep, all good */
fclose(acpi);
- if (!(retval = init_batteries()))
- retval = init_ac_adapters();
+ if (!(retval = init_batteries(globals)))
+ retval = init_ac_adapters(globals);
return retval;
}
/* reinitialise everything, to deal with changing batteries or ac adapters */
-int power_reinit(void)
+int power_reinit(global_t *globals)
{
FILE *acpi;
int retval;
@@ -173,8 +174,8 @@ int power_reinit(void)
return 1;
}
- if (!(retval = reinit_batteries()))
- retval = reinit_ac_adapters();
+ if (!(retval = reinit_batteries(globals)))
+ retval = reinit_ac_adapters(globals);
return retval;
}
@@ -202,7 +203,7 @@ int check_error(char *buf)
return 0;
}
-power_state_t get_power_status(void)
+power_state_t get_power_status(global_t *globals)
{
FILE *file;
char buf[1024];
@@ -437,7 +438,7 @@ static int calc_charge_time(int batt)
return charge_time;
}
-void acquire_batt_info(int batt)
+void acquire_batt_info(global_t *globals, int batt)
{
battery_t *binfo;
adapter_t *ap = &globals->adapter;
@@ -472,7 +473,7 @@ void acquire_batt_info(int batt)
/* we need to /know/ that we've got a valid state for the
* globals->power value . . . .*/
- ap->power = get_power_status();
+ ap->power = get_power_status(globals);
if ((ap->power != AC) && (binfo->charge_state == DISCHARGE)) {
/* we're not on power, and not charging. So we might as well
@@ -491,25 +492,44 @@ void acquire_batt_info(int batt)
binfo->valid = 1;
}
-void acquire_all_batt_info(void)
+void acquire_all_batt_info(global_t *globals)
{
int i;
for(i = 0; i < globals->battery_count; i++)
- acquire_batt_info(i);
+ acquire_batt_info(globals, i);
}
-void acquire_global_info(void)
+/*
+ * One of the feature requests I've had is for some way to deal with
+ * batteries that are too dumb or too b0rken to report a present rate
+ * value. The way to do this, obviously, is to record the time that
+ * samples were taken and use that information to calculate the rate
+ * at which the battery is draining/charging. This still won't help
+ * systems where the battery doesn't even report the remaining
+ * capacity, but without the present rate or the remaining capacity, I
+ * don't think there's /anything/ we can do to work around it.
+ *
+ * So, what we need to do is provide a way to use a different method
+ * to calculate the time remaining. What seems most sensible is to
+ * split out the code to calculate it into a seperate function, and
+ * then provide multiple implementations . . .
+ */
+
+/*
+ * the default implementation - if present rate and remaining capacity
+ * are both reported correctly, we use them.
+ */
+int calc_time_remaining_rate(global_t *globals)
{
int i;
int rtime;
float rcap = 0;
float rate = 0;
battery_t *binfo;
- adapter_t *ap = &globals->adapter;
static float rate_samples[SAMPLES];
- static int j = 0;
static int sample_count = 0;
+ static int j = 0;
static int n = 0;
/* calculate the time remaining, using the battery's remaining
@@ -529,7 +549,8 @@ void acquire_global_info(void)
}
rate_samples[j] = rate;
j++, sample_count++;
- j = j % SAMPLES;
+ if (j >= SAMPLES)
+ j = 0;
/* for the first SAMPLES number of calls we calculate the
* average based on sample_count, then we use SAMPLES to
@@ -562,16 +583,99 @@ void acquire_global_info(void)
rtime = 0;
out:
pdebug("time rem: %d\n", rtime);
- globals->rtime = rtime;
+ return rtime;
+}
+
+/*
+ * the alternative implementation - record the time at which each
+ * sample was taken, and then use the difference between the latest
+ * sample and the one SAMPLES ago to calculate the difference over
+ * that time, and from there the rate of change of capacity.
+ *
+ * XXX: this code sucks, but largely because batteries aren't exactly
+ * precision instruments - mine only report with about 70mAH
+ * resolution, so they don't report any changes until the difference
+ * is 70mAH. This means that calculating the current rate from the
+ * remaining capacity is very choppy . . .
+ *
+ * To fix this, we should calculate an average over some number of
+ * samples at the old end of the set - this would smooth out the
+ * transitions.
+ */
+int calc_time_remaining_cap(global_t *globals)
+{
+ static float cap_samples[SAMPLES];
+ static int time_samples[SAMPLES];
+ static int sample_count = 0;
+ static int current = 0;
+ static int old = 1;
+ battery_t *binfo;
+ int i;
+ int rtime;
+ int tdiff;
+ float cdiff;
+ float cap = 0;
+ float current_rate;
+
+ for (i = 0; i < globals->battery_count; i++) {
+ binfo = &batteries[i];
+ if (binfo->present && binfo->valid)
+ cap += binfo->remaining_cap;
+ }
+ cap_samples[current] = cap;
+ time_samples[current] = time(NULL);
+
+ /* if we have less than SAMPLES samples so far, we use the first
+ * sample and the current one */
+ if (sample_count < SAMPLES) {
+ cdiff = cap_samples[0] - cap_samples[current];
+ tdiff = time_samples[current] - time_samples[0];
+ current_rate = cdiff/tdiff;
+ } else {
+ /* if we have more than SAMPLES samples, we use the oldest
+ * current one, which at this point is current + 1. This will
+ * wrap the same way that current will wrap, but one cycle
+ * ahead */
+ cdiff = cap_samples[old] - cap_samples[current];
+ tdiff = time_samples[current] - time_samples[old];
+ current_rate = cdiff/tdiff;
+ }
+ if (current_rate == 0)
+ rtime = 0;
+ else
+ rtime = (int)(cap_samples[current]/(current_rate * 60.0));
+
+ sample_count++, current++, old++;
+ if (current >= SAMPLES)
+ current = 0;
+ if (old >= SAMPLES)
+ old = 0;
+
+ pdebug("time rem: %d\n", rtime);
+ return rtime;
+}
+
+void acquire_global_info(global_t *globals)
+{
+ adapter_t *ap = &globals->adapter;
+
+ switch(globals->rt_mode) {
+ case RT_RATE:
+ globals->rtime = calc_time_remaining_rate(globals);
+ break;
+ case RT_CAP:
+ globals->rtime = calc_time_remaining_cap(globals);
+ break;
+ }
/* get the power status.
* note that this is actually reported seperately from the
* battery info, under /proc/acpi/ac_adapter/AC/state */
- ap->power = get_power_status();
+ ap->power = get_power_status(globals);
}
-void acquire_all_info(void)
+void acquire_all_info(global_t *globals)
{
- acquire_all_batt_info();
- acquire_global_info();
+ acquire_all_batt_info(globals);
+ acquire_global_info(globals);
}
diff --git a/libacpi.h b/libacpi.h
index 631ef63..b28687a 100644
--- a/libacpi.h
+++ b/libacpi.h
@@ -2,7 +2,7 @@
#define _LIBACPI_H_
-#define LIBACPI_VER "0.90"
+#define LIBACPI_VER "0.91"
/* Here because we need it for definitions in this file . . . */
#define MAX_NAME 128
@@ -71,22 +71,23 @@ typedef struct {
power_state_t power;
} adapter_t;
+/* how to calculate the time remaining */
+enum rtime_mode {
+ RT_RATE, /* using the current rate, as per the ACPI spec */
+ RT_CAP, /* using the remaining capacity over time */
+};
+
typedef struct {
int rtime; /* remaining time */
int timer; /* how long been on battery? */
int crit_level; /* anything below this is critical low */
int battery_count; /* number of batteries found */
+ enum rtime_mode rt_mode;
battery_t *binfo; /* pointer to the battery being monitored */
adapter_t adapter;
} global_t;
/*
- * Note that there are some serious problems with this: firstly, handling of
- * multiple batteries sucks. I've cleaned it up a reasonable amount so far,
- * but I don't know enough about how multiple batteries are handled in the
- * actual power management code to be able to do it right. I need to plug
- * in the second battery for this LifeBook to see how it goes . . .
- *
* Moving percentage to the battery is right, but I think we need a global
* remaining capacity somewhere, too . . .
*/
@@ -124,16 +125,16 @@ battery_t batteries[MAXBATT];
int verbosity;
/* check if apm/acpi is enabled, etc */
-int power_init(void);
+int power_init(global_t *globals);
/* reinitialise everything */
-int power_reinit(void);
-int reinit_ac_adapters(void);
-int reinit_batteries(void);
+int power_reinit(global_t *globals);
+int reinit_ac_adapters(global_t *globals);
+int reinit_batteries(global_t *globals);
/* fill global_t with data */
-void acquire_batt_info(int);
-void acquire_all_batt_info(void);
-void acquire_global_info(void);
-void acquire_all_info(void);
+void acquire_batt_info(global_t *globals, int batt);
+void acquire_all_batt_info(global_t *globals);
+void acquire_global_info(global_t *globals);
+void acquire_all_info(global_t *globals);
#endif /* _WMACPI_H_ */
diff --git a/master.xpm b/master.xpm
index ba24bf1..e958772 100644
--- a/master.xpm
+++ b/master.xpm
@@ -99,8 +99,8 @@ static char * master_xpm[] = {
"@. c #027E72",
"#. c #188A86",
"$. c #22B2AE",
-"%. c #107D79",
-"&. c #034A40",
+"%. c #034A40",
+"&. c #107D79",
" . + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h ",
" . + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h ",
" . + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h ",
@@ -126,7 +126,7 @@ static char * master_xpm[] = {
" . % ..% % % % ..........% % % % ..% % % % % % % % ..% % ` . % % .% .% % % .% .% % % .% ..% ..% ..% % ` . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% ",
" . % ..% % % % % % % % % % % % % ....................% % ` . % % % % % . . .% % % . . .% % % % % ..% % % ` . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % ` . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % ",
-" . % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % ` . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % ` . i j k l % m n o p % q r s t % u v w x % y z A B % C D E F % G H I J % K L M N % O P Q R % S T U V % W X Y Z % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
" . % % ......% % % . . .#.% #.......#.% #.......#.% #. . . .#.% #.......#.% #.......#.% #.......#.% #.......#.% #.......#.% % ..% % % % % % % ",
@@ -138,23 +138,23 @@ static char * master_xpm[] = {
" . % % .% % % % .% .% % % % .% % .% % .% % % % .% .% % % % .% % ` % $.$.$.$.% % % .% % % % .% % ` . % % ......% % % . . .#.% #.......#.% #.......#.% % . . .#.% #.......#.% #.......#.% % . . .#.% #.......#.% #.......#.% % % % ..% % % #.% ",
" . % % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% % ` % $.% % % $.% % .% % % % .% % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
" . % % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% % ` % $.% % % $.% % .% % % % .% % ` . ",
-" . % % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % % ` % $.% % % $.% % % . . . .% % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . . . . . . . . . . . . . . . . ` . . . . . . . . . . . . . . . . ` ",
-" . % % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% % ` % $.$.$.$.% % % .% % % % .% % ` . % % % % % % ..........% % % % ....................% % % #.% % ......% % % ......% % % ..% % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
-" . % % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% % ` % $.% % % $.% % .% % % % .% % ` . % % % % % ..% % % % ......% % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
-" . % % .% % % % .% .% % % % .% % .% % .% % % % .% .% % % % .% % ` % $.% % % $.% % .% % % % .% % ` . % % % % % ..% % % % ..% % % % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % % % % % % % % % % . . . .%.% % ` % % % % % % % % %.........#.% % ` ",
-" . % % .% % % % .% .% % % % .% % .% % .% % % % .% .% % % % .% % ` % $.% % % $.% % .% % % % .% % ` . % % % ......% % % % ..% % % % ..% % % % % % % % ....% % #.% #. . . .#.% #. . . .#.% % % ..% % % % % % % % % % % .% % % % ..% % ` % % % % % % % % .% % % % ..% % ` ",
-" . % % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % % ` % $.$.$.$.% % % % . . . .% % % ` . % % ..% % ..% % % % ......% % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % % $.$.$.$.% % % .% % % % ..% % ` % $.$.$.$.% % % .% % % % ..% % ` ",
-" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % % ..........% % % % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % $.% % % $.% % .% % % % ..% % ` % $.% % % $.% % .% % % % ..% % ` ",
-" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % % % % % % % % % % % ....................% % % #.% % ......% % % ......% % % % % ..% % % $.% % % $.% % .% % % % ..% % ` % $.% % % $.% % .% % % % ..% % ` ",
-" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % $.% % % $.% % % . . . .%.% % ` % $.% % % $.% % %.........%.% % ` ",
-" . % $.$.$.$.% % % .% % % % ..% % ` % $.$.$.$.% % % ..% % % % .% % ` ",
-" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % $.% % % $.% % .% % % % ..% % ` % $.% % % $.% % ..% % % % .% % ` ",
-" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % % % % % . . . . .% % % % . . . . . . . . . .% % % % % % . . .% % % . . .% % % .% % % % % $.% % % $.% % .% % % % ..% % ` % $.% % % $.% % ..% % % % .% % ` ",
-" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % .% % % % . . .% % .% % % % % % % % .% % % .% .% % % .% .% % % .% .% .% .% % $.% % % $.% % .% % % % ..% % ` % $.% % % $.% % ..% % % % .% % ` ",
-" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % .% % % % .% % % % .% % % % % % % % . .% % .% .% % % .% .% % % .% % .% .% % % $.$.$.$.% % % % . . . .%.% % ` % $.$.$.$.% % % %.........%.% % ` ",
-" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % . . .% % % % .% % % % .% % % % % % % % . .% % % % % . . .% % % . . .% % % % .% % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
-" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % .% % .% % % % . . .% % .% % % % % % % % . .% % .% .% % % .% .% % % .% % .% .% % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
-" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % .% % % % . . . . .% % % % .% % % % % % % % .% % % .% .% % % .% .% % % .% .% .% .% ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ",
+" . % % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % % ` % $.% % % $.% % % . . . .% % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . . . . . . . . . . . . . . . . ` ",
+" . % % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% % ` % $.$.$.$.% % % .% % % % .% % ` . % % % % % % ..........% % % % ....................% % % #.% % ......% % % ......% % % ..% % % % % % % % % % % % % % % % % % % % ` ",
+" . % % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% % ` % $.% % % $.% % .% % % % .% % ` . % % % % % ..% % % % ......% % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % % % % % % % % % % % % % % % % ` ",
+" . % % .% % % % .% .% % % % .% % .% % .% % % % .% .% % % % .% % ` % $.% % % $.% % .% % % % .% % ` . % % % % % ..% % % % ..% % % % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % % % % % % % % % % . . . .% % % ` ",
+" . % % .% % % % .% .% % % % .% % .% % .% % % % .% .% % % % .% % ` % $.% % % $.% % .% % % % .% % ` . % % % ......% % % % ..% % % % ..% % % % % % % % ....% % #.% #. . . .#.% #. . . .#.% % % ..% % % % % % % % % % % .% % % % .% % ` ",
+" . % % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % % ` % $.$.$.$.% % % % . . . .% % % ` . % % ..% % ..% % % % ......% % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % % $.$.$.$.% % % .% % % % .% % ` ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % % ..........% % % % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % $.% % % $.% % .% % % % .% % ` ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % % % % % % % % % % % ....................% % % #.% % ......% % % ......% % % % % ..% % % $.% % % $.% % .% % % % .% % ` ",
+" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % $.% % % $.% % % . . . .% % % ` ",
+" . % $.$.$.$.% % % .% % % % .% % ` ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % $.% % % $.% % .% % % % .% % ` ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % % % % % . . . . .% % % % . . . . . . . . . .% % % % % % . . .% % % . . .% % % .% % % % % $.% % % $.% % .% % % % .% % ` ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % .% % % % . . .% % .% % % % % % % % .% % % .% .% % % .% .% % % .% .% .% .% % $.% % % $.% % .% % % % .% % ` ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % .% % % % .% % % % .% % % % % % % % . .% % .% .% % % .% .% % % .% % .% .% % % $.$.$.$.% % % % . . . .% % % ` ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % . . .% % % % .% % % % .% % % % % % % % . .% % % % % . . .% % % . . .% % % % .% % % % % % % % % % % % % % % % % % % ` ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % .% % .% % % % . . .% % .% % % % % % % % . .% % .% .% % % .% .% % % .% % .% .% % % % % % % % % % % % % % % % % % ` ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % .% % % % . . . . .% % % % .% % % % % % % % .% % % .% .% % % .% .% % % .% .% .% .% ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % .% % % % % % % % % % % % % . . . . . . . . . .% % % % % % . . .% % % . . .% % % % % .% % ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . ",
@@ -162,30 +162,30 @@ static char * master_xpm[] = {
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % $.$.$.% % % % % % @.% @.$.$.$. at .% @.$.$.$. at .% @.% % % @.% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% % % % % % % % % % % % % % % % % % % ",
" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % $.% % % $.% % % % % $.% % % % % $.% % % % % $.% $.% % % $.% $.% % % % % $.% % % % % % % % % $.% $.% % % $.% $.% % % $.% % % % % % % % % % % % % % % % % % % ",
" . % $.% % % $.% % % % % $.% % % % % $.% % % % % $.% $.% % % $.% $.% % % % % $.% % % % % % % % % $.% $.% % % $.% $.% % % $.% % % % % % % % % % % % % % % % % % % ",
-" . % @.% % % @.% % % % % @.% @.$.$.$. at .% % $.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% % % % % @.% &.$.$.$.&.% @.$.$.$. at .% @.$.$.$. at .% % % % % % % % % % % % % ",
+" . % @.% % % @.% % % % % @.% @.$.$.$. at .% % $.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% % % % % @.% %.$.$.$.%.% @.$.$.$. at .% @.$.$.$. at .% % % % % % % % % % % % % ",
" . % $.% % % $.% % % % % $.% $.% % % % % % % % % $.% % % % % $.% % % % % $.% $.% % % $.% % % % % $.% $.% % % $.% % % % % $.% % % % % % % % % % % % % % % % % % % ",
" . % $.% % % $.% % % % % $.% $.% % % % % % % % % $.% % % % % $.% % % % % $.% $.% % % $.% % % % % $.% $.% % % $.% % % % % $.% % % % % % % % % % % % % % % % % % % ",
". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % $.$.$.% % % % % % $.% @.$.$.$. at .% @.$.$.$. at .% % % % % @.% @.$.$.$. at .% @.$.$.$. at .% % % % % @.% @.$.$.$. at .% @.$.$.$. at .% % % % % % % % % % % % % % % % % $.% ",
" % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
-"% &.$.$.$.&.% @.$.$.$.% % @.$.$.$. at .% @.$.$.$.% % @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.% % % @.% % % @.% % % % % % % @.% @.% % % @.% @.% % % % % $.% % % $.% @.$.$.$.% % @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.% % % @.% @.% % % @.% @.% % % @.% @.% % % @.% @.% % % @.% @.$.$.$. at .% ",
+"% %.$.$.$.%.% @.$.$.$.% % @.$.$.$. at .% @.$.$.$.% % @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.% % % @.% % % @.% % % % % % % @.% @.% % % @.% @.% % % % % $.% % % $.% @.$.$.$.% % @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.$.$.$. at .% @.% % % @.% @.% % % @.% @.% % % @.% @.% % % @.% @.% % % @.% @.$.$.$. at .% ",
"% $.% % % $.% $.% % % $.% $.% % % % % $.% % % $.% $.% % % % % $.% % % % % $.% % % % % $.% % % $.% % % $.% % % % % % % $.% $.% % % $.% $.% % % % % $.$.% $.$.% $.% % % $.% $.% % % $.% $.% % % $.% $.% % % $.% $.% % % $.% $.% % % % % % % $.% % % $.% % % $.% $.% % % $.% $.% % % $.% $.% % % $.% $.% % % $.% % % % % $.% ",
-"% $.% % % $.% $.% % % $.% $.% % % % % $.% % % $.% $.% % % % % $.% % % % % $.% % % % % $.% % % $.% % % $.% % % % % % % $.% $.% % $.&.% $.% % % % % $.% $.% $.% $.% % % $.% $.% % % $.% $.% % % $.% $.% % % $.% $.% % % $.% $.% % % % % % % $.% % % $.% % % $.% $.% % % $.% $.% % % $.% &.$.% $.&.% $.% % % $.% % % % $.&.% ",
-"% @.$.$.$. at .% @.$.$.$.% % @.% % % % % @.% % % @.% @.$.$.$.% % @.$.$.$.% % @.&.$.$. at .% @.$.$.$. at .% % % @.% % % % % % % @.% @.$.$.&.% % @.% % % % % @.% % % @.% @.% % % @.% @.% % % @.% @.$.$.$. at .% @.$.% % @.% @.$.$.$.% % @.$.$.$. at .% % % @.% % % @.% % % @.% @.% % % @.% @.% % % @.% % &.$.&.% % @.$.$.$. at .% % &.$.&.% % ",
-"% $.% % % $.% $.% % % $.% $.% % % % % $.% % % $.% $.% % % % % $.% % % % % $.% % % $.% $.% % % $.% % % $.% % % % % % % $.% $.% % $.&.% $.% % % % % $.% % % $.% $.% % % $.% $.% % % $.% $.% % % % % $.% $.% $.% $.% % % $.% % % % % $.% % % $.% % % $.% % % $.% $.% % % $.% $.% $.% $.% &.$.% $.&.% % % % % $.% &.$.% % % % ",
+"% $.% % % $.% $.% % % $.% $.% % % % % $.% % % $.% $.% % % % % $.% % % % % $.% % % % % $.% % % $.% % % $.% % % % % % % $.% $.% % $.%.% $.% % % % % $.% $.% $.% $.% % % $.% $.% % % $.% $.% % % $.% $.% % % $.% $.% % % $.% $.% % % % % % % $.% % % $.% % % $.% $.% % % $.% $.% % % $.% %.$.% $.%.% $.% % % $.% % % % $.%.% ",
+"% @.$.$.$. at .% @.$.$.$.% % @.% % % % % @.% % % @.% @.$.$.$.% % @.$.$.$.% % @.%.$.$. at .% @.$.$.$. at .% % % @.% % % % % % % @.% @.$.$.%.% % @.% % % % % @.% % % @.% @.% % % @.% @.% % % @.% @.$.$.$. at .% @.$.% % @.% @.$.$.$.% % @.$.$.$. at .% % % @.% % % @.% % % @.% @.% % % @.% @.% % % @.% % %.$.%.% % @.$.$.$. at .% % %.$.%.% % ",
+"% $.% % % $.% $.% % % $.% $.% % % % % $.% % % $.% $.% % % % % $.% % % % % $.% % % $.% $.% % % $.% % % $.% % % % % % % $.% $.% % $.%.% $.% % % % % $.% % % $.% $.% % % $.% $.% % % $.% $.% % % % % $.% $.% $.% $.% % % $.% % % % % $.% % % $.% % % $.% % % $.% $.% % % $.% $.% $.% $.% %.$.% $.%.% % % % % $.% %.$.% % % % ",
"% $.% % % $.% $.% % % $.% $.% % % % % $.% % % $.% $.% % % % % $.% % % % % $.% % % $.% $.% % % $.% % % $.% % % % % % % $.% $.% % % $.% $.% % % % % $.% % % $.% $.% % % $.% $.% % % $.% $.% % % % % $.% % $.$.% $.% % % $.% % % % % $.% % % $.% % % $.% % % $.% $.% % % $.% $.$.% $.$.% $.% % % $.% % % % % $.% $.% % % % % ",
-"% @.% % % @.% @.$.$.$.% % @.$.$.$. at .% $.$.$.$.% % @.$.$.$. at .% $.% % % % % @.$.$.$. at .% @.% % % @.% % % $.% % % @.$.$.$. at .% @.% % % @.% @.$.$.$.&.% @.% % % @.% $.% % % $.% @.$.$.$. at .% @.% % % % % @.$.$.$. at .% @.% % % @.% @.$.$.$. at .% % % @.% % % &.$.$.$.$.% % $.$.$.% % $.% % % $.% @.% % % $.% @.$.$.$. at .% @.$.$.$. at .% ",
+"% @.% % % @.% @.$.$.$.% % @.$.$.$. at .% $.$.$.$.% % @.$.$.$. at .% $.% % % % % @.$.$.$. at .% @.% % % @.% % % $.% % % @.$.$.$. at .% @.% % % @.% @.$.$.$.%.% @.% % % @.% $.% % % $.% @.$.$.$. at .% @.% % % % % @.$.$.$. at .% @.% % % @.% @.$.$.$. at .% % % @.% % % %.$.$.$.$.% % $.$.$.% % $.% % % $.% @.% % % $.% @.$.$.$. at .% @.$.$.$. at .% ",
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
-"% % ........% % % . . . .%.% %.........#.% %.........%.% %. . . . .%.% %.........%.% %.........#.% %.........%.% %.........#.% %.........#.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % % % $. . . .$.% ",
+"% % ........% % % . . . .&.% &.........#.% &.........&.% &. . . . .&.% &.........&.% &.........#.% &.........&.% &.........#.% &.........#.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % % % $. . . .$.% ",
"% ..% % % % ..% .% % % % ..% .% % % % ..% .% % % % ..% ..% % % % ..% ..% % % % .% ..% % % % .% .% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % .% % % % .% .% % % % .% % .% % .% % % % .% .% % % % .% % $.% $.% $. .% ",
"% ..% % % % ..% .% % % % ..% .% % % % ..% .% % % % ..% ..% % % % ..% ..% % % % .% ..% % % % .% .% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % .% % % % .% .% % % % .% % .% % .% % % % .% .% % % % .% % .$.% $.% .% ",
"% ..% % % % ..% .% % % % ..% .% % % % ..% .% % % % ..% ..% % % % ..% ..% % % % .% ..% % % % .% .% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% % .% $.% $. .% ",
"% ..% % % % ..% .% % % % ..% .% % % % ..% .% % % % ..% ..% % % % ..% ..% % % % .% ..% % % % .% .% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% % .$.% $.% $.% ",
-"% %. . . . .%.% % . . . .%.% %.........%.% %.........%.% %.........%.% %.........%.% %.........%.% % . . . .%.% %.........%.% %.........%.% % % % % % %. . . . .%.% %. . . . .%.% % % % % %. . . . .%.% %. . . . .%.% % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % % $. . . .$.% % ",
+"% &. . . . .&.% % . . . .&.% &.........&.% &.........&.% &.........&.% &.........&.% &.........&.% % . . . .&.% &.........&.% &.........&.% % % % % % &. . . . .&.% &. . . . .&.% % % % % &. . . . .&.% &. . . . .&.% % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % % $. . . .$.% % ",
"% ..% % % % ..% .% % % % ..% ..% % % % .% .% % % % ..% .% % % % ..% .% % % % ..% ..% % % % ..% .% % % % ..% ..% % % % ..% .% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% % .% % % % .% ",
"% ..% % % % ..% .% % % % ..% ..% % % % .% .% % % % ..% .% % % % ..% .% % % % ..% ..% % % % ..% .% % % % ..% ..% % % % ..% .% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % .% % % % .% .% % % % .% % % % % .% % % % .% .% % % % .% % $.$.$.$.$. .% ",
"% ..% % % % ..% .% % % % ..% ..% % % % .% .% % % % ..% .% % % % ..% .% % % % ..% ..% % % % ..% .% % % % ..% ..% % % % ..% .% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % .% % % % .% .% % % % .% % .% % .% % % % .% .% % % % .% % $.% % % $.$.% ",
"% ..% % % % ..% .% % % % ..% ..% % % % .% .% % % % ..% .% % % % ..% .% % % % ..% ..% % % % ..% .% % % % ..% ..% % % % ..% .% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % .% % % % .% .% % % % .% % .% % .% % % % .% .% % % % .% % $.% % % $.$.% ",
-"% % ........% % % . . . .%.% %.........%.% %.........%.% % . . . .%.% %.........%.% %.........%.% % . . . .%.% %.........%.% %.........%.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % % $.$.$.$.$.% % ",
+"% % ........% % % . . . .&.% &.........&.% &.........&.% % . . . .&.% &.........&.% &.........&.% % . . . .&.% &.........&.% &.........&.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % . . . .% % % . . . .% % % % % % % . . . .% % % . . . .% % % $.$.$.$.$.% % ",
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % "};
diff --git a/master_low.xpm b/master_low.xpm
index cbb21ed..1d91d52 100644
--- a/master_low.xpm
+++ b/master_low.xpm
@@ -17,8 +17,8 @@ static char * master_low_xpm[] = {
", c #188A86",
"' c #22B2AE",
") c #C7C7C7",
-"! c #107D79",
-"~ c #034A40",
+"! c #034A40",
+"~ c #107D79",
" . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ",
" . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ",
" . ++++ at ++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ",
@@ -56,23 +56,23 @@ static char * master_low_xpm[] = {
" .@@-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@@= @''''@@@-@@@@-@@= . @@;;;@@@---,@,;;;,@,;;;,@@---,@,;;;,@,;;;,@@---,@,;;;,@,;;;,@@@@;@@@,@ ",
" .@@-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@@= @'@@@'@@-@@@@-@@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
" .@@-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@@= @'@@@'@@-@@@@-@@= . ",
-" .@@@----@@@----@@@@@@@----@@@----@@@= @'@@@'@@@----@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ................) ................) ",
-" .@@-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@@= @''''@@@-@@@@-@@= . @@@@@@;;;;;@@@ @;;;;;;;;;;@@ @,@@;;;@@@;;;@@@;@@@@ @@@@@@@@@@@@@@@@) @@@@@@@@@@@@@@@@) ",
-" .@@-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@@= @'@@@'@@-@@@@-@@= . @@@@@;@@@@;;;@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ @@@@@@@@@@@@@@@@) @@@@@@@@@@@@@@@@) ",
-" .@@-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@@= @'@@@'@@-@@@@-@@= . @@@@@;@@@@;@@@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ @@@@@@@@@----!@@) @@@@@@@@!;;;;,@@) ",
-" .@@-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@@= @'@@@'@@-@@@@-@@= . @@@;;;@@@@;@@@ @;@@@@@@@@;;@ @,@,---,@,---,@@@;@@@ @@@@@@@@-@@@@;@@) @@@@@@@@-@@@@;@@) ",
-" .@@@----@@@----@@@@@@@----@@@----@@@= @''''@@@@----@@@= . @@;@@;@@@@;;;@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ @''''@@@-@@@@;@@) @''''@@@-@@@@;@@) ",
-" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @;@@@@;;;;;@@@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ @'@@@'@@-@@@@;@@) @'@@@'@@-@@@@;@@) ",
-" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @;@@@@@@@@@@@@ @;;;;;;;;;;@@ @,@@;;;@@@;;;@@@@@;@@ @'@@@'@@-@@@@;@@) @'@@@'@@-@@@@;@@) ",
-" ===================================== ================= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @'@@@'@@@----!@@) @'@@@'@@!;;;;!@@) ",
-" . @''''@@@-@@@@;@@) @''''@@@;@@@@-@@) ",
-" . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @'@@@'@@-@@@@;@@) @'@@@'@@;@@@@-@@) ",
-" ........................................................ . @@@@@@-----@@@ @----------@@ @@@@---@@@---@@@-@@@@ @'@@@'@@-@@@@;@@) @'@@@'@@;@@@@-@@) ",
-" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@-@@@@---@ @-@@@@@@@@-@@ @- at -@@@- at -@@@- at -@- at -@ @'@@@'@@-@@@@;@@) @'@@@'@@;@@@@-@@) ",
-" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@-@@@@-@@@ @-@@@@@@@@--@ @- at -@@@- at -@@@-@@- at -@@ @''''@@@@----!@@) @''''@@@!;;;;!@@) ",
-" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@---@@@@-@@@ @-@@@@@@@@--@ @@@@---@@@---@@@@-@@@ @@@@@@@@@@@@@@@@) @@@@@@@@@@@@@@@@) ",
-" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@-@@-@@@@---@ @-@@@@@@@@--@ @- at -@@@- at -@@@-@@- at -@@ @@@@@@@@@@@@@@@@) @@@@@@@@@@@@@@@@) ",
-" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @-@@@@-----@@@ @-@@@@@@@@-@@ @- at -@@@- at -@@@- at -@- at -@ ))))))))))))))))) ))))))))))))))))) ",
+" .@@@----@@@----@@@@@@@----@@@----@@@= @'@@@'@@@----@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ................) ",
+" .@@-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@@= @''''@@@-@@@@-@@= . @@@@@@;;;;;@@@ @;;;;;;;;;;@@ @,@@;;;@@@;;;@@@;@@@@ @@@@@@@@@@@@@@@@) ",
+" .@@-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@@= @'@@@'@@-@@@@-@@= . @@@@@;@@@@;;;@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ @@@@@@@@@@@@@@@@) ",
+" .@@-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@@= @'@@@'@@-@@@@-@@= . @@@@@;@@@@;@@@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ @@@@@@@@@----@@@) ",
+" .@@-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@@= @'@@@'@@-@@@@-@@= . @@@;;;@@@@;@@@ @;@@@@@@@@;;@ @,@,---,@,---,@@@;@@@ @@@@@@@@-@@@@-@@) ",
+" .@@@----@@@----@@@@@@@----@@@----@@@= @''''@@@@----@@@= . @@;@@;@@@@;;;@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ @''''@@@-@@@@-@@) ",
+" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @;@@@@;;;;;@@@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ @'@@@'@@-@@@@-@@) ",
+" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @;@@@@@@@@@@@@ @;;;;;;;;;;@@ @,@@;;;@@@;;;@@@@@;@@ @'@@@'@@-@@@@-@@) ",
+" ===================================== ================= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @'@@@'@@@----@@@) ",
+" . @''''@@@-@@@@-@@) ",
+" . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @'@@@'@@-@@@@-@@) ",
+" ........................................................ . @@@@@@-----@@@ @----------@@ @@@@---@@@---@@@-@@@@ @'@@@'@@-@@@@-@@) ",
+" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@-@@@@---@ @-@@@@@@@@-@@ @- at -@@@- at -@@@- at -@- at -@ @'@@@'@@-@@@@-@@) ",
+" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@-@@@@-@@@ @-@@@@@@@@--@ @- at -@@@- at -@@@-@@- at -@@ @''''@@@@----@@@) ",
+" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@---@@@@-@@@ @-@@@@@@@@--@ @@@@---@@@---@@@@-@@@ @@@@@@@@@@@@@@@@) ",
+" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@-@@-@@@@---@ @-@@@@@@@@--@ @- at -@@@- at -@@@-@@- at -@@ @@@@@@@@@@@@@@@@) ",
+" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @-@@@@-----@@@ @-@@@@@@@@-@@ @- at -@@@- at -@@@- at -@- at -@ ))))))))))))))))) ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @-@@@@@@@@@@@@ @----------@@ @@@@---@@@---@@@@@-@@ ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . ",
@@ -80,30 +80,30 @@ static char * master_low_xpm[] = {
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@'''@@@@@@>@>'''>@>'''>@>@@@>@>'''>@>'''>@>'''>@>'''>@>'''>@@@@@@@@@@@@@ @@@@@@ ",
" ======================================================== . @'@@@'@@@@@'@@@@@'@@@@@'@'@@@'@'@@@@@'@@@@@@@@@'@'@@@'@'@@@'@@@@@@@@@@@@@ @@@@@@ ",
" . @'@@@'@@@@@'@@@@@'@@@@@'@'@@@'@'@@@@@'@@@@@@@@@'@'@@@'@'@@@'@@@@@@@@@@@@@ @@@@@@ ",
-" . @>@@@>@@@@@>@>'''>@@'''>@>'''>@>'''>@>'''>@@@@@>@~'''~@>'''>@>'''>@@@@@@@ @@@@@@ ",
+" . @>@@@>@@@@@>@>'''>@@'''>@>'''>@>'''>@>'''>@@@@@>@!'''!@>'''>@>'''>@@@@@@@ @@@@@@ ",
" . @'@@@'@@@@@'@'@@@@@@@@@'@@@@@'@@@@@'@'@@@'@@@@@'@'@@@'@@@@@'@@@@@@@@@@@@@ @@@@@@ ",
" . @'@@@'@@@@@'@'@@@@@@@@@'@@@@@'@@@@@'@'@@@'@@@@@'@'@@@'@@@@@'@@@@@@@@@@@@@ @@@@@@ ",
"................................................................. @@'''@@@@@@'@>'''>@>'''>@@@@@>@>'''>@>'''>@@@@@>@>'''>@>'''>@@@@@@@@@@@@@ @@@@'@ ",
" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
-"@~'''~@>'''@@>'''>@>'''@@>'''>@>'''>@>'''>@>@@@>@@@>@@@@@@@>@>@@@>@>@@@@@'@@@'@>'''@@>'''>@>'''>@>'''>@>'''>@>'''>@>'''>@>@@@>@>@@@>@>@@@>@>@@@>@>@@@>@>'''>@",
+"@!'''!@>'''@@>'''>@>'''@@>'''>@>'''>@>'''>@>@@@>@@@>@@@@@@@>@>@@@>@>@@@@@'@@@'@>'''@@>'''>@>'''>@>'''>@>'''>@>'''>@>'''>@>@@@>@>@@@>@>@@@>@>@@@>@>@@@>@>'''>@",
"@'@@@'@'@@@'@'@@@@@'@@@'@'@@@@@'@@@@@'@@@@@'@@@'@@@'@@@@@@@'@'@@@'@'@@@@@''@''@'@@@'@'@@@'@'@@@'@'@@@'@'@@@'@'@@@@@@@'@@@'@@@'@'@@@'@'@@@'@'@@@'@'@@@'@@@@@'@",
-"@'@@@'@'@@@'@'@@@@@'@@@'@'@@@@@'@@@@@'@@@@@'@@@'@@@'@@@@@@@'@'@@'~@'@@@@@'@'@'@'@@@'@'@@@'@'@@@'@'@@@'@'@@@'@'@@@@@@@'@@@'@@@'@'@@@'@'@@@'@~'@'~@'@@@'@@@@'~@",
-"@>'''>@>'''@@>@@@@@>@@@>@>'''@@>'''@@>~''>@>'''>@@@>@@@@@@@>@>''~@@>@@@@@>@@@>@>@@@>@>@@@>@>'''>@>'@@>@>'''@@>'''>@@@>@@@>@@@>@>@@@>@>@@@>@@~'~@@>'''>@@~'~@@",
-"@'@@@'@'@@@'@'@@@@@'@@@'@'@@@@@'@@@@@'@@@'@'@@@'@@@'@@@@@@@'@'@@'~@'@@@@@'@@@'@'@@@'@'@@@'@'@@@@@'@'@'@'@@@'@@@@@'@@@'@@@'@@@'@'@@@'@'@'@'@~'@'~@@@@@'@~'@@@@",
+"@'@@@'@'@@@'@'@@@@@'@@@'@'@@@@@'@@@@@'@@@@@'@@@'@@@'@@@@@@@'@'@@'!@'@@@@@'@'@'@'@@@'@'@@@'@'@@@'@'@@@'@'@@@'@'@@@@@@@'@@@'@@@'@'@@@'@'@@@'@!'@'!@'@@@'@@@@'!@",
+"@>'''>@>'''@@>@@@@@>@@@>@>'''@@>'''@@>!''>@>'''>@@@>@@@@@@@>@>''!@@>@@@@@>@@@>@>@@@>@>@@@>@>'''>@>'@@>@>'''@@>'''>@@@>@@@>@@@>@>@@@>@>@@@>@@!'!@@>'''>@@!'!@@",
+"@'@@@'@'@@@'@'@@@@@'@@@'@'@@@@@'@@@@@'@@@'@'@@@'@@@'@@@@@@@'@'@@'!@'@@@@@'@@@'@'@@@'@'@@@'@'@@@@@'@'@'@'@@@'@@@@@'@@@'@@@'@@@'@'@@@'@'@'@'@!'@'!@@@@@'@!'@@@@",
"@'@@@'@'@@@'@'@@@@@'@@@'@'@@@@@'@@@@@'@@@'@'@@@'@@@'@@@@@@@'@'@@@'@'@@@@@'@@@'@'@@@'@'@@@'@'@@@@@'@@''@'@@@'@@@@@'@@@'@@@'@@@'@'@@@'@''@''@'@@@'@@@@@'@'@@@@@",
-"@>@@@>@>'''@@>'''>@''''@@>'''>@'@@@@@>'''>@>@@@>@@@'@@@>'''>@>@@@>@>'''~@>@@@>@'@@@'@>'''>@>@@@@@>'''>@>@@@>@>'''>@@@>@@@~''''@@'''@@'@@@'@>@@@'@>'''>@>'''>@",
+"@>@@@>@>'''@@>'''>@''''@@>'''>@'@@@@@>'''>@>@@@>@@@'@@@>'''>@>@@@>@>'''!@>@@@>@'@@@'@>'''>@>@@@@@>'''>@>@@@>@>'''>@@@>@@@!''''@@'''@@'@@@'@>@@@'@>'''>@>'''>@",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@",
-"@@;;;;@@@----!@!;;;;,@!;;;;!@!----!@!;;;;!@!;;;;,@!;;;;!@!;;;;,@!;;;;,@@@@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @@----@@@----@@@@@@@----@@@----@@ @@'---'@",
+"@@;;;;@@@----~@~;;;;,@~;;;;~@~----~@~;;;;~@~;;;;,@~;;;;~@~;;;;,@~;;;;,@@@@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @@----@@@----@@@@@@@----@@@----@@ @@'---'@",
"@;@@@@;@-@@@@;@-@@@@;@-@@@@;@;@@@@;@;@@@@-@;@@@@- at -@@@@;@;@@@@;@;@@@@;@@;@@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@ @'@'@'-@",
"@;@@@@;@-@@@@;@-@@@@;@-@@@@;@;@@@@;@;@@@@-@;@@@@- at -@@@@;@;@@@@;@;@@@@;@@;@@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@ @-'@'@-@",
"@;@@@@;@-@@@@;@-@@@@;@-@@@@;@;@@@@;@;@@@@-@;@@@@- at -@@@@;@;@@@@;@;@@@@;@@@@@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@ @-@'@'-@",
"@;@@@@;@-@@@@;@-@@@@;@-@@@@;@;@@@@;@;@@@@-@;@@@@- at -@@@@;@;@@@@;@;@@@@;@@@@@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@ @-'@'@'@",
-"@!----!@@----!@!;;;;!@!;;;;!@!;;;;!@!;;;;!@!;;;;!@@----!@!;;;;!@!;;;;!@@@@@ @!----!@!----!@@@@@!----!@!----!@ @@----@@@----@@@@@@@----@@@----@@ @'---'@@",
+"@~----~@@----~@~;;;;~@~;;;;~@~;;;;~@~;;;;~@~;;;;~@@----~@~;;;;~@~;;;;~@@@@@ @~----~@~----~@@@@@~----~@~----~@ @@----@@@----@@@@@@@----@@@----@@ @'---'@@",
"@;@@@@;@-@@@@;@;@@@@- at -@@@@;@-@@@@;@-@@@@;@;@@@@;@-@@@@;@;@@@@;@-@@@@;@@@@@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@ @-@@@@-@",
"@;@@@@;@-@@@@;@;@@@@- at -@@@@;@-@@@@;@-@@@@;@;@@@@;@-@@@@;@;@@@@;@-@@@@;@@@@@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@ @'''''-@",
"@;@@@@;@-@@@@;@;@@@@- at -@@@@;@-@@@@;@-@@@@;@;@@@@;@-@@@@;@;@@@@;@-@@@@;@@;@@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@ @'@@@''@",
"@;@@@@;@-@@@@;@;@@@@- at -@@@@;@-@@@@;@-@@@@;@;@@@@;@-@@@@;@;@@@@;@-@@@@;@@;@@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@ @'@@@''@",
-"@@;;;;@@@----!@!;;;;!@!;;;;!@@----!@!;;;;!@!;;;;!@@----!@!;;;;!@!;;;;!@@@@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @@----@@@----@@@@@@@----@@@----@@ @'''''@@",
+"@@;;;;@@@----~@~;;;;~@~;;;;~@@----~@~;;;;~@~;;;;~@@----~@~;;;;~@~;;;;~@@@@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @@----@@@----@@@@@@@----@@@----@@ @'''''@@",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@"};
diff --git a/wmacpi.1 b/wmacpi.1
index 381587b..304a423 100644
--- a/wmacpi.1
+++ b/wmacpi.1
@@ -18,9 +18,12 @@ battery no ]
.RI -s
sample rate ]
[
-.RI -v
+.RI -f
]
+[
+.RI -v
]
+[
.RI -n
]
[
@@ -99,6 +102,17 @@ minute. Minimum is 1, ie once a minute, default is 20, maximum is 600.
Disable blinking power glyph when charging. Note that it still blinks when
the battery reports its capacity state as critical.
.TP
+.B \-f
+Force the use of capacity mode for calculating time remaining. By defalt
+.B wmacpi
+will use the reported values of remaining capacity and present rate to
+calculate the time remaining on battery. This flag will force the use
+of the remaining capacity and time samples to calculate the present
+rate of drain, and from there the time remaining. Note that this mode
+of calculation generally underreports the time remaining. This mode
+works around certain buggy ACPI BIOSes that fail to report the current
+rate.
+.TP
.B \-w
Run wmacpi in command line mode - this operates identically to
.B acpi
@@ -152,4 +166,4 @@ This manual page was originally written by Simon Richter
<sjr at debian.org> for the Debian GNU/Linux system, and then updated by
Simon Fowler.
.br
-Last modification by Simon Fowler <simon at dreamcraft.com.au>, 2004-04-15.
+Last modification by Simon Fowler <simon at dreamcraft.com.au>, 2004-08-15.
diff --git a/wmacpi.c b/wmacpi.c
index abde0d3..3473541 100644
--- a/wmacpi.c
+++ b/wmacpi.c
@@ -18,6 +18,8 @@
#define _GNU_SOURCE
+#include <dockapp.h>
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -35,56 +37,48 @@
#include "libacpi.h"
#include "wmacpi.h"
-#define WMACPI_VER "1.99r6"
+#define WMACPI_VER "1.99r7"
/* main pixmap */
#ifdef LOW_COLOR
#include "master_low.xpm"
+static char **master_xpm = master_low_xpm;
#else
#include "master.xpm"
#endif
-typedef struct {
- Display *display; /* X11 display struct */
- int screen; /* current screen */
- Window root; /* root window */
- Window win; /* one window */
- Window iconwin; /* another one */
- Pixmap pixmap; /* UI pixmap, window pixmap */
- Pixmap mask; /* mask pixmap for shape */
- GC gc; /* main drawing GC */
+struct dockapp {
+ Display *display; /* display */
+ Window win; /* main window */
+ Pixmap pixmap; /* main pixmap */
+ Pixmap mask; /* mask pixmap */
Pixmap text; /* pixmap for text scroller */
+ unsigned width; /* width of pixmap */
+ unsigned height; /* height of pixmap */
+ int screen; /* current screen */
int tw; /* text width inside text pixmap */
int update; /* need to redraw? */
int blink; /* should we blink the LED? (critical battery) */
int bell; /* bell on critical low, or not? */
int scroll; /* scroll message text? */
int scroll_reset; /* reset the scrolling text */
-} Dockapp;
+};
/* globals */
-Dockapp *dockapp;
-global_t *globals;
+struct dockapp *dockapp;
+/* global_t *globals; */
/* this gives us a variable scroll rate, depending on the importance of the
* message . . . */
#define DEFAULT_SCROLL_RESET 150;
int scroll_reset = DEFAULT_SCROLL_RESET;
-/* proto for local stuff */
-static void new_window(char *name);
-static int open_display(char *display);
-static void redraw_window(void);
-static void render_text(char *string);
-static void scroll_text(void);
-static void display_percentage(int percent);
-static void display_time(int minutes);
-
-#define copy_xpm_area(x, y, w, h, dx, dy) \
-{ \
- XCopyArea(dockapp->display, dockapp->pixmap, dockapp->pixmap, \
- dockapp->gc, x, y, w, h, dx, dy); \
- dockapp->update = 1; \
+/* copy a chunk of pixmap around the app */
+static void copy_xpm_area(int x, int y, int w, int h, int dx, int dy)
+{
+ XCopyArea(DADisplay, dockapp->pixmap, dockapp->pixmap,
+ DAGC, x, y, w, h, dx, dy);
+ dockapp->update = 1;
}
/* display AC power symbol */
@@ -127,77 +121,35 @@ static void reset_scroll(void) {
dockapp->scroll_reset = 1;
}
+static void clear_text_area(void) {
+ copy_xpm_area(66, 9, 52, 7, 6, 50);
+}
+
static void redraw_window(void)
{
if (dockapp->update) {
- XCopyArea(dockapp->display, dockapp->pixmap, dockapp->iconwin,
- dockapp->gc, 0, 0, 64, 64, 0, 0);
XCopyArea(dockapp->display, dockapp->pixmap, dockapp->win,
- dockapp->gc, 0, 0, 64, 64, 0, 0);
+ DAGC, 0, 0, 64, 64, 0, 0);
dockapp->update = 0;
}
}
-static void new_window(char *name)
+static void new_window(char *display, char *name, int argc, char **argv)
{
- XpmAttributes attr;
- Pixel fg, bg;
- XGCValues gcval;
- XSizeHints sizehints;
- XClassHint classhint;
- XWMHints wmhints;
-
- dockapp->screen = DefaultScreen(dockapp->display);
- dockapp->root = DefaultRootWindow(dockapp->display);
-
- sizehints.flags = USSize | USPosition;
- sizehints.width = 64;
- sizehints.height = 64;
-
- fg = BlackPixel(dockapp->display, dockapp->screen);
- bg = WhitePixel(dockapp->display, dockapp->screen);
-
- dockapp->win = XCreateSimpleWindow(dockapp->display, dockapp->root,
- 0, 0, sizehints.width,
- sizehints.height, 1, fg, bg);
- dockapp->iconwin =
- XCreateSimpleWindow(dockapp->display, dockapp->win, 0, 0,
- sizehints.width, sizehints.height, 1, fg, bg);
-
- XSetWMNormalHints(dockapp->display, dockapp->win, &sizehints);
- classhint.res_name = name;
- classhint.res_class = name;
- XSetClassHint(dockapp->display, dockapp->win, &classhint);
+ /* Initialise the dockapp window and appicon */
+ DAInitialize(display, name, 64, 64, argc, argv);
+ dockapp->display = DADisplay;
+ dockapp->win = DAWindow;
XSelectInput(dockapp->display, dockapp->win,
- ExposureMask | ButtonPressMask | ButtonReleaseMask |
- StructureNotifyMask);
- XSelectInput(dockapp->display, dockapp->iconwin,
- ExposureMask | ButtonPressMask | ButtonReleaseMask |
- StructureNotifyMask);
-
- XStoreName(dockapp->display, dockapp->win, name);
- XSetIconName(dockapp->display, dockapp->win, name);
-
- gcval.foreground = fg;
- gcval.background = bg;
- gcval.graphics_exposures = False;
-
- dockapp->gc =
- XCreateGC(dockapp->display, dockapp->win,
- GCForeground | GCBackground | GCGraphicsExposures,
- &gcval);
-
- attr.exactColors = 0;
- attr.alloc_close_colors = 1;
- attr.closeness = 1L << 15;
- attr.valuemask = XpmExactColors | XpmAllocCloseColors | XpmCloseness;
- if (XpmCreatePixmapFromData(dockapp->display, dockapp->win,
- master_xpm, &dockapp->pixmap,
- &dockapp->mask, &attr) != XpmSuccess) {
- pfatal("FATAL: Not enough colors for main pixmap!\n");
- exit(1);
- }
+ ExposureMask | ButtonPressMask | ButtonReleaseMask |
+ StructureNotifyMask);
+
+ /* create the main pixmap . . . */
+ DAMakePixmapFromData(master_xpm, &dockapp->pixmap, &dockapp->mask,
+ &dockapp->width, &dockapp->height);
+ DASetPixmap(dockapp->pixmap);
+ DASetShape(dockapp->mask);
/* text area is 318x7, or 53 characters long */
dockapp->text = XCreatePixmap(dockapp->display, dockapp->win, 318, 7,
@@ -207,23 +159,87 @@ static void new_window(char *name)
pfatal("FATAL: Cannot create text scroll pixmap!\n");
exit(1);
}
+ DAShow();
+}
+
+static void copy_to_text_buffer(int sx, int sy, int w, int h, int dx, int dy)
+{
+ XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
+ DAGC, sx, sy, w, h, dx, dy);
+}
+
+static void copy_to_text_area(int sx, int sy, int w, int h, int dx, int dy)
+{
+ XCopyArea(dockapp->display, dockapp->text, dockapp->pixmap,
+ DAGC, sx, sy, w, h, dx, dy);
+}
+
+static void scroll_text(void)
+{
+ static int start, end, stop;
+ int x = 6; /* x coord of the start of the text area */
+ int y = 50; /* y coord */
+ int width = 52; /* width of the text area */
+ int height = 7; /* height of the text area */
+ int tw = dockapp->tw; /* width of the rendered text */
+ int sx, dx, w;
+
+ if (!dockapp->scroll)
+ return;
+
+ /*
+ * Conceptually this is viewing the text through a scrolling
+ * window - the window starts out with the end immediately before
+ * the text, and stops when the start of the window is immediately
+ * after the end of the text.
+ *
+ * We begin with the start of the window at pixel (0 - width) and
+ * as we scroll we render only the portion of the window above
+ * pixel 0. The destination of the copy during this period starts
+ * out at the end of the text area and works left as more of the
+ * text is being copied, until a full window is being copied.
+ *
+ * As the end of the window moves out past the end of the text, we
+ * want to keep the destination at the beginning of the text area,
+ * but copy a smaller and smaller chunk of the text. Eventually the
+ * start of the window will scroll past the end of the text, at
+ * which point we stop doing any work and wait to be reset.
+ */
+
+ if (dockapp->scroll_reset) {
+ start = 0 - width;
+ end = 0;
+ stop = 0;
+ clear_text_area();
+ dockapp->scroll_reset = 0;
+ }
+
+ if (stop)
+ return;
- XShapeCombineMask(dockapp->display, dockapp->win, ShapeBounding, 0, 0,
- dockapp->mask, ShapeSet);
- XShapeCombineMask(dockapp->display, dockapp->iconwin, ShapeBounding, 0,
- 0, dockapp->mask, ShapeSet);
-
- wmhints.initial_state = WithdrawnState;
- wmhints.flags = StateHint;
- wmhints.icon_window = dockapp->iconwin;
- wmhints.icon_x = sizehints.x;
- wmhints.icon_y = sizehints.y;
- wmhints.window_group = dockapp->win;
- wmhints.flags =
- StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
- XSetWMHints(dockapp->display, dockapp->win, &wmhints);
-
- XMapWindow(dockapp->display, dockapp->win);
+ w = 52;
+ if (end < 52)
+ w = end;
+ else if (end > tw)
+ w = 52 - (end - tw);
+
+ dx = x + 52 - w;
+ if (end > tw)
+ dx = x;
+
+ sx = start;
+ if (start < 0)
+ sx = 0;
+
+ if (start > tw)
+ stop = 1;
+
+ clear_text_area();
+ copy_to_text_area(sx, 0, w, height, dx, y);
+ start += 2;
+ end += 2;
+
+ dockapp->update = 1;
}
static void render_text(char *string)
@@ -241,8 +257,7 @@ static void render_text(char *string)
/* prepare the text area by clearing it */
for (i = 0; i < 54; i++) {
- XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
- dockapp->gc, 133, 57, 6, 8, i * 6, 0);
+ copy_to_text_buffer(133, 57, 6, 8, i * 6, 0);
}
k = 0;
@@ -250,18 +265,14 @@ static void render_text(char *string)
c = toupper(string[i]);
if (c >= 'A' && c <= 'Z') { /* letter */
c = c - 'A';
- XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
- dockapp->gc, c * 6, 67, 6, 7, k, 0);
+ copy_to_text_buffer(c * 6, 67, 6, 7, k, 0);
} else if (c >= '0' && c <= '9') { /* number */
c = c - '0';
- XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
- dockapp->gc, c * 6 + 66, 58, 6, 7, k, 0);
+ copy_to_text_buffer(c * 6 + 66, 58, 6, 7, k, 0);
} else if (c == '.') {
- XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
- dockapp->gc, 140, 58, 6, 7, k, 0);
+ copy_to_text_buffer(140, 58, 6, 7, k, 0);
} else if (c == '-') {
- XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
- dockapp->gc, 126, 58, 6, 7, k, 0);
+ copy_to_text_buffer(126, 58, 6, 7, k, 0);
}
k += 6;
}
@@ -271,69 +282,14 @@ static void render_text(char *string)
scroll_text();
}
-static int open_display(char *display)
-{
- dockapp->display = XOpenDisplay(display);
- if (!dockapp->display) {
- perr("Unable to open display '%s'\n", display);
- return 1;
- }
- return 0;
-}
-
-static void scroll_text(void)
-{
- static int pos, first, stop;
- int x = 6;
- int y = 50;
- int width = 52;
- int tw = dockapp->tw;
-
- if (!dockapp->scroll)
- return;
-
- if (dockapp->scroll_reset) {
- pos = 0;
- first = 0;
- stop = 0;
- XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
- dockapp->gc, 0, 0, width, 7, x, y);
- dockapp->scroll_reset = 0;
- }
-
- if (stop) {
- return;
- }
-
- if ((first == 0) && pos == 0) {
- pos = width;
- first = 1;
- }
-
- if (pos == (0 - tw - 2)) {
- first = 1;
- pos = width;
- stop = 1;
- return;
- }
- pos -= 2;
-
- if (pos > 0) {
- copy_xpm_area(66, 9, pos, 7, x, y); /* clear */
- XCopyArea(dockapp->display, dockapp->text, dockapp->pixmap,
- dockapp->gc, 0, 0, width - pos, 7, x + pos, y);
- } else { /* don't need to clear, already in text */
- XCopyArea(dockapp->display, dockapp->text, dockapp->pixmap,
- dockapp->gc, abs(pos), 0, width, 7, x, y);
- }
- dockapp->update = 1;
-}
-
static void display_percentage(int percent)
{
static int op = -1;
static unsigned int obar;
unsigned int bar;
+ int width = 54; /* width of the bar */
+ float ratio = 100.0/width; /* ratio between the current percentage
+ * and the number of pixels in the bar */
if (percent == -1)
percent = 0;
@@ -355,7 +311,7 @@ static void display_percentage(int percent)
copy_xpm_area(95, 37, 21, 9, 37, 16); /* 100% */
op = percent;
- bar = percent / 1.8518;
+ bar = (int)((float)percent / ratio);
if (bar == obar)
return;
@@ -454,7 +410,7 @@ static void blink_battery_glyph(void)
really_blink_battery_glyph();
}
-static void set_power_panel(void)
+static void set_power_panel(global_t *globals)
{
enum panel_states power = PS_NULL;
battery_t *binfo = globals->binfo;
@@ -477,7 +433,7 @@ static void set_power_panel(void)
if (binfo->charge_state == CHARGE)
blink_power_glyph();
- if (binfo->state == CRIT)
+ if ((binfo->state == CRIT) && (ap->power == BATT))
blink_battery_glyph();
if (binfo->state == HARD_CRIT) {
@@ -527,7 +483,7 @@ enum messages {
M_NULL, /* empty starting state */
};
-static void set_message(void)
+static void set_message(global_t *globals)
{
static enum messages state = M_NULL;
battery_t *binfo = globals->binfo;
@@ -583,7 +539,7 @@ static void set_message(void)
}
}
-void set_time_display(void)
+void set_time_display(global_t *globals)
{
battery_t *binfo = &batteries[battery_no];
@@ -595,30 +551,16 @@ void set_time_display(void)
invalid_time_display();
}
-/*
- * This should really be fixed so that it can handle more than two batteries.
- */
-
-void set_id_1(void)
-{
- copy_xpm_area(118, 38, 15, 15, 44, 30);
-}
-
-void set_id_2(void)
-{
- copy_xpm_area(136, 38, 15, 15, 44, 30);
-}
-
void set_batt_id_area(int bno)
{
- switch(bno) {
- case 0:
- set_id_1();
- break;
- case 1:
- set_id_2();
- break;
- }
+ int w = 7; /* Width of the number */
+ int h = 11; /* Height of the number */
+ int dx = 50; /* x coord of the target area */
+ int dy = 31; /* y coord of the target area */
+ int sx = (bno + 1) * 7; /* source x coord */
+ int sy = 76; /* source y coord */
+
+ copy_xpm_area(sx, sy, w, h, dx, dy);
}
void usage(char *name)
@@ -632,6 +574,7 @@ void usage(char *name)
"-m <battery number>\tbattery number to monitor\n"
"-s <sample rate>\tnumber of times per minute to sample battery information\n"
"\t\t\tdefault 20 (once every three seconds)\n"
+ "-f\t\t\tforce the use of capacity mode for calculating time remaining\n"
"-n\t\t\tdo not blink\n"
"-w\t\t\trun in command line mode\n"
"-a <samples>\t\tsamples to average over (cli mode only)\n"
@@ -647,7 +590,7 @@ void print_version(void)
printf(" Using libacpi version %s\n", LIBACPI_VER);
}
-void cli_wmacpi(int samples)
+void cli_wmacpi(global_t *globals, int samples)
{
int i, j, sleep_time = 0;
battery_t *binfo;
@@ -660,8 +603,8 @@ void cli_wmacpi(int samples)
/* we want to acquire samples over some period of time, so . . . */
for(i = 0; i < samples + 2; i++) {
for(j = 0; j < globals->battery_count; j++)
- acquire_batt_info(j);
- acquire_global_info();
+ acquire_batt_info(globals, j);
+ acquire_global_info(globals);
usleep(sleep_time);
}
@@ -709,9 +652,11 @@ int main(int argc, char **argv)
int sleep_rate = 10;
int sleep_time = 1000000/sleep_rate;
int scroll_count = 0;
+ enum rtime_mode rt_mode = RT_RATE;
battery_t *binfo;
+ global_t *globals;
- dockapp = calloc(1, sizeof(Dockapp));
+ dockapp = calloc(1, sizeof(struct dockapp));
globals = calloc(1, sizeof(global_t));
dockapp->blink = 1;
@@ -731,7 +676,7 @@ int main(int argc, char **argv)
* are available /before/ we can decide if the battery we want to
* monitor is available. */
/* parse command-line options */
- while ((ch = getopt(argc, argv, "d:c:m:s:a:hnwbrvV")) != EOF) {
+ while ((ch = getopt(argc, argv, "d:c:m:s:a:fhnwbrvV")) != EOF) {
switch (ch) {
case 'c':
if (optarg) {
@@ -768,6 +713,9 @@ int main(int argc, char **argv)
exit(1);
}
break;
+ case 'f':
+ rt_mode = RT_CAP;
+ break;
case 'h':
usage(argv[0]);
return 0;
@@ -805,10 +753,12 @@ int main(int argc, char **argv)
}
- if (power_init())
+ if (power_init(globals))
/* power_init functions handle printing error messages */
exit(1);
+ globals->rt_mode = rt_mode;
+
if (battery_no > globals->battery_count) {
pfatal("Battery %d not available for monitoring.\n", battery_no);
exit(1);
@@ -816,30 +766,26 @@ int main(int argc, char **argv)
/* check for cli mode */
if (cli) {
- cli_wmacpi(samples);
+ cli_wmacpi(globals, samples);
exit(0);
}
battery_no--;
- /* open local or command-line specified display */
- if (open_display(display))
- exit(1);
-
/* make new dockapp window */
/* Don't even /think/ of asking me why, but if I set the window name to
* "acpi", the app refuses to dock properly - it's just plain /weird/.
* So, wmacpi it is . . . */
- new_window("wmacpi");
+ new_window(display, "wmacpi", argc, argv);
/* get initial statistics */
- acquire_all_info();
+ acquire_all_info(globals);
binfo = &batteries[battery_no];
globals->binfo = binfo;
pinfo("monitoring battery %s\n", binfo->name);
clear_time_display();
- set_power_panel();
- set_message();
+ set_power_panel(globals);
+ set_message(globals);
set_batt_id_area(battery_no);
/* main loop */
@@ -868,6 +814,7 @@ int main(int argc, char **argv)
binfo = globals->binfo;
pinfo("changing to monitor battery %d\n", battery_no + 1);
set_batt_id_area(battery_no);
+ dockapp->update = 1;
break;
}
}
@@ -899,19 +846,19 @@ int main(int argc, char **argv)
* translates to 600 sleeps. So, we change the default sample
* rate to 20, and the calculation below becomes . . .*/
if (sample_count++ == ((sleep_rate*60)/samplerate)) {
- acquire_all_info();
+ acquire_all_info(globals);
/* we need to be able to reinitialise batteries and adapters, because
* they change - you can hotplug batteries on most laptops these days
* and who knows what kind of shit will be happening soon . . . */
if (batt_count++ >= batt_reinit) {
- if(reinit_batteries())
+ if(reinit_batteries(globals))
pfatal("Oh my god, the batteries are gone!\n");
batt_count = 0;
}
if (ac_count++ >= ac_reinit) {
- if(reinit_ac_adapters())
+ if(reinit_ac_adapters(globals))
pfatal("What happened to our AC adapters?!?\n");
ac_count = 0;
}
@@ -934,9 +881,9 @@ int main(int argc, char **argv)
* much time remained until the batteries were fully charged . . .
* That would be rather useful, though given it would vary rather a lot
* it seems likely that it'd be little more than a rough guesstimate. */
- set_time_display();
- set_power_panel();
- set_message();
+ set_time_display(globals);
+ set_power_panel(globals);
+ set_message(globals);
display_percentage(binfo->percentage);
scroll_text();
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wmaker/wmacpi.git
More information about the Pkg-wmaker-commits
mailing list