[Pkg-wmaker-commits] [wmacpi] 39/105: Imported Upstream version 1.33
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Tue Aug 18 01:13:43 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 92c8932b9d48fb4180ed659bd3bc15d7e854ee29
Author: Doug Torrance <dtorrance at monmouthcollege.edu>
Date: Mon Nov 24 05:55:06 2014 -0600
Imported Upstream version 1.33
---
AUTHORS | 15 ++
COPYING | 2 +
ChangeLog | 80 ++++++++
INSTALL | 10 +
Makefile | 25 +++
README | 63 ++++++
libacpi.c | 213 +++++++++++++++++++
libapm.c | 91 +++++++++
master.xpm | 207 +++++++++++++++++++
master_low.xpm | 111 ++++++++++
wmacpi.c | 634 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
wmacpi.h | 52 +++++
12 files changed, 1503 insertions(+)
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..ed910da
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,15 @@
+ timecop
+ timecop at japan.co.jp
+ all the code
+
+ Daniel Pittman <daniel at rimspace.net>
+ sent some suggestions and a patch for a broken APM implementations.
+ version 1.1 includes his patch in a modified form
+
+ Michael G. Henderson <mghenderson at lanl.gov>
+ some weird dude who generated a lot of random noise about my dockapp and
+ forced me to change the name to wmacpi. general asshole.
+
+ portions of master.xpm that i was too lazy to draw (the plug and battery
+ icons) came from wmapm-2 by jedgar. the numbers were copied off some other
+ dockapp, too. the button was drawn by ME. PHEAR YES PHEAR IT.
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..f4f3ea5
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,2 @@
+#include <GNU_GPL_v2>
+ [...]
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..5bb8f42
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,80 @@
+2001 Apr 29 1.33
+ Little fix to ACPI version check so that I don't have to make a new
+ version each time a new kernel comes out
+
+2001 Mar 24 1.32
+ Split ACPI and APM portions in different source files
+ Added power_init() function - handles checking subsystem presence,
+ version, etc. Enumerates batteries in ACPI implementation
+ ACPI: Beginnings of multiple battery support - not fully implemented
+ ACPI: Get the battery ID from /proc/acpi/battery instead of hard-coding
+ it in - also helps with multi battery stuff
+ Added some stupid command line help
+ Added -c option to set critical battery alarm level. Defaults to
+ 10 percent, and added -b option to make noise when this critical level
+ is reached
+ APM: Updated for critical alarm stuff
+ Made a 20 color "low" quality pixmap for machines running 8bit displays
+ Updated README with some stuff, made separate INSTALL file
+
+2001 Mar 13 1.31
+ Update for intel ACPI release version 20010313
+ Minor updates for new /proc layout
+
+2001 Mar 07 1.3
+ Update for intel ACPI release verion 20010302
+ Proc format changed a little bit, so updates were necessary.
+ Added a check for specific acpi subsystem version - since each
+ new version seems to have a new interface, better be safe than
+ sorry :)
+ As usual, please test and report to me.
+
+ This ONLY works with linux acpica 20010302. Download this version from
+ http://developer.intel.com/technology/iapc/acpi/downloads.htm - it's a
+ patch against 2.4.2
+
+2001 Feb 28 1.21
+ Finally read through the ACPI specification. Hah, they had all my
+ questions answered :) Thus,
+
+ Confirmed remaining percentage formula (correct)
+
+ Now calculate "time remaining" according to the spec formula
+
+ Removed "battery load" hack since we now have "time remaining"
+
+ Fixed bug in display_percentage (10% didn't display right)
+
+ Released version 1.21
+
+2001 Feb 23 1.2
+ Added support for ACPI. This is very untested, and not very clean.
+ This has been tested on machines with only ONE battery, and only
+ with kernel 2.4.2 (that's where ACPI started to work for me)
+
+ Added some hackery to do with ACPI. Check README.
+
+ Released 1.2
+
+2001 Jan 16 1.1
+ Fixed all the stuff so that wmapm works as advertised:
+ Fixed dumb bug where after charging was done new message didn't scroll.
+
+ Added support for fucked APM bioses that display stuff wrong. (See
+ README to learn how to enable it. Obviously, it's disabled by default)
+
+ Reorganized apminfo structure and got rid of redundancy.
+
+ Reorganized acquire_apm_info. All APM data is processed there.
+
+ Fixed display_state to do the Right Thing.
+
+ Fixed red blinking button to actually blink on critical battery, and
+ to stop when it isn't critical anymore. I don't think it ever worked
+ right in 1.0.
+
+ Created ChangeLog.
+
+ Updated README.
+
+ Released 1.1.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..01b1e42
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,10 @@
+to install:
+
+* vi Makefile
+* change what you want, according to instructions, save Makefile
+* make
+* copy wmacpi somewhere useful
+* dance
+* <somewhere useful>/wmacpi &
+* phear
+(if it doesn't work, skip the phear step)
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..79f379c
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,25 @@
+# set options. pick one, acpi or apm. comment out the other one. don't
+# uncomment both, bad things will happen :)
+
+OPT = -O3 -DACPI
+#OPT = -O3 -DAPM
+
+# uncomment this to make wmacpi use less system colors (looks uglier too)
+#OPT += -DLOW_COLOR
+
+# debugging options (don't bother with these)
+#OPT = -pg -g -DPRO -DACPI
+
+CC = gcc
+CFLAGS = $(OPT) -Wall -ansi -I/usr/X11R6/include
+LDFLAGS = $(OPT) -L/usr/X11R6/lib -lX11 -lXpm -lXext
+
+SRCS = wmacpi.c libapm.c libacpi.c
+OBJS = wmacpi.o libapm.o libacpi.o
+
+all: wmacpi
+
+wmacpi: $(OBJS)
+
+clean:
+ rm -f *.o *~ wmacpi trace *.out *.bb *.bbg
diff --git a/README b/README
new file mode 100644
index 0000000..91e454d
--- /dev/null
+++ b/README
@@ -0,0 +1,63 @@
+For install instructions, see "INSTALL" file.
+
+Usage:
+
++-------------+
+|battery graph| <- visual percentage battery remaining
+|[:][=] [100%]| <- [:] - on AC (blink when charging) [=] - on battery
+|[00:00] [///]| <- [00:00] time remaining [///] timer mode switch
+|status area| <- messages scroll here
++-------------+
+
+see wmacpi -h for some command line switches
+
+Timer mode, available only when "on-battery", keeps track how long your laptop
+has been away from AC power. Clicking the button toggles between timer and
+standard "time remaining" mode.
+
+******************************************************************************
+
+Implementation of "ACPI" mode:
+
+As far as I know, there aren't any tools available right now to process battery
+statistics provided in /proc/power by ACPI stuff in 2.4.x kernels. This is my
+attempt to have a usable dockapp battery monitor for ACPI laptop systems.
+Since version 1.32 I've added some code to detect multiple batteries. However
+it's not fully implemented yet, and while it will detect and enumerate
+batteries, the statistics reported are for the first found battery.
+ * Your battery is "Control Method" type
+ * Your ACPI BIOS is supported by current version of ACPI in kernel
+ 2.4.2 + patches
+ * You applied acpi subsystem patch version 20010313 (from intel.com)
+
+If you are still using plain 2.4.2 kernel, keep using wmacpi 1.21.
+To use ACPI support, just follow "INSTALL" instructions. Makefile has been
+updated to include -DACPI. If you don't have ACPI, you don't need this version
+of wmapm. Information below only applies to APM systems, without ACPI support.
+
+Implementation of "APM" mode
+
+This works on all machines that have a standard non-borked APM implementation.
+For people with broken APM implementations, I added some stuff, which was
+sent to me by Daniel Pittman <daniel at rimspace.net>, to compensate for some
+of the stupidity. If you see dumb behaviour from wmapm, consider editing
+wmapm.c and uncomment one, or both, of these lines (on lines 19 and 20):
+
+#define RETARDED_APM if your bios thinks the battery is charging all the time
+when it's on AC power. What this will do is stop "charging" process as soon
+as the battery reaches 100%.
+
+#define STUPID_APM if your bios shows -1 minutes remaining when AC is plugged
+in, or when battery is charging.
+
+If your bios is even dumber than this, and you come up with another special
+case that needs to be handled, feel free to #ifdef it under <badword>_APM and
+send me a diff -u. I will include it in the next version. Any of these
+changes would have to go into acquire_apm_info. Note, I changed format of
+apminfo structure to get rid of redundancy - now there is only one power state
+variable, which keeps track whether we are on AC, charging, battery, etc.
+
+Note, all the *_APM stuff is untested - my laptop has a working BIOS :) If you
+test this and it doesn't work as advertised, go ahead and send me a fix.
+
+ -timecop
diff --git a/libacpi.c b/libacpi.c
new file mode 100644
index 0000000..0d04c92
--- /dev/null
+++ b/libacpi.c
@@ -0,0 +1,213 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#include "wmacpi.h"
+
+#define MAXBATT 8
+
+#ifdef ACPI
+#ifdef PRO
+extern char *state[];
+#endif
+extern APMInfo *apminfo;
+static char batteries[MAXBATT][128];
+static char battinfo[MAXBATT][128];
+int batt_count;
+/* temp buffer */
+char buf[512];
+
+/* local proto */
+int acpi_get_design_cap(int battery);
+
+/* see if we have ACPI support and check version */
+int power_init(void)
+{
+ FILE *acpi;
+ char buf[4096];
+ DIR *battdir;
+ struct dirent *batt;
+ char *name;
+ char *tmp;
+
+ if (!(acpi = fopen("/proc/acpi/info", "r"))) {
+ fprintf(stderr, "This system does not support ACPI\n");
+ return 1;
+ }
+
+ /* okay, now see if we got the right version */
+ fread(buf, 4096, 1, acpi);
+ tmp = strstr(buf, "ersion:");
+ if (tmp) {
+ tmp += 16;
+ if (atoi(tmp) < 20010313) {
+ fprintf(stderr, "This version requires ACPI subsystem version 20010313\n");
+ fclose(acpi);
+ return 1;
+ }
+ } else {
+ fprintf(stderr, "Perhaps old ACPI subsystem - consider upgrading to\n"
+ "at least version 20010313\n");
+ fclose(acpi);
+ return 1;
+ }
+
+ /* yep, all good */
+ fclose(acpi);
+
+ /* now enumerate batteries */
+ batt_count = 0;
+ battdir = opendir("/proc/acpi/battery");
+ if (battdir == NULL) {
+ fprintf(stderr, "No batteries or ACPI not supported\n");
+ return 1;
+ }
+ while ((batt = readdir(battdir))) {
+ name = batt->d_name;
+
+ /* skip . and .. */
+ if (!strncmp(".", name, 1) || !strncmp("..", name, 2))
+ continue;
+
+ sprintf(batteries[batt_count], "/proc/acpi/battery/%s/status", name);
+ sprintf(battinfo[batt_count], "/proc/acpi/battery/%s/info", name);
+ eprint(1, "battery detected at %s\n", batteries[batt_count]);
+ batt_count++;
+ }
+ closedir(battdir);
+
+ /* tell user some info */
+ eprint(1, "%d batteries detected\n", batt_count);
+ fprintf(stderr, "wmacpi: found %d batter%s\n", batt_count,
+ (batt_count == 1) ? "y" : "ies");
+
+ return 0;
+}
+
+int acpi_get_design_cap(int battery)
+{
+ FILE *acpi;
+ char *ptr;
+ int design_cap;
+
+ if (battery > MAXBATT)
+ return -1;
+
+ if (!(acpi = fopen(battinfo[battery], "r")))
+ return -1;
+
+ fread(buf, 512, 1, acpi);
+ fclose(acpi);
+
+ if ((ptr = strstr(buf, "Last Full Capacity"))) {
+ ptr += 25;
+ sscanf(ptr, "%d", &design_cap);
+ eprint(1, "last full capacity: %d\n", design_cap);
+ } else {
+ /* hack. if there isnt any info on last capacity, we are
+ * screwed, but let's not come back here again */
+ design_cap = -1;
+ eprint(1, "Cannot retrieve design capacity!");
+ }
+
+ return design_cap;
+}
+
+void acquire_info(void)
+{
+ FILE *acpi;
+ char *ptr;
+ char stat;
+
+ static int dcap = 0xdeadbeef;
+
+ int percent = 100; /* battery percentage */
+ int ptemp, rate, rtime = 0;
+
+ if (dcap == 0xdeadbeef) {
+ /* get from first battery for now */
+ dcap = acpi_get_design_cap(0);
+ }
+
+ if (!(acpi = fopen(batteries[0], "r")))
+ return;
+
+ eprint(1, "opened acpi file successfully");
+ fread(buf, 512, 1, acpi);
+ fclose(acpi);
+
+ /* This section of the code will calculate "percentage remaining"
+ * using battery capacity, and the following formula (acpi spec 3.9.2):
+ * percentage = (current_capacity / last_full_capacity) * 100; */
+ if ((ptr = strstr(buf, "Remaining Capacity"))) {
+ ptr += 25;
+ sscanf(ptr, "%d", &ptemp);
+ eprint(1, "capacity: %d\n", ptemp);
+ percent = (float)((float)ptemp / (float)dcap) * 100;
+ eprint(1, "percent: %d\n", percent);
+ }
+ apminfo->percentage = percent;
+
+ /* this section of code will calculate "time remaining"
+ * using battery remaining capacity, and battery "rate" (3.9.3) */
+ if ((ptr = strstr(buf, "Present Rate"))) {
+ ptr += 25;
+ sscanf(ptr, "%d", &rate);
+ eprint(1, "rate: %d\n", rate);
+ if (rate <= 0)
+ rate = 0;
+ /* time remaining in minutes */
+ rtime = ((float)((float)ptemp / (float)rate)) * 60;
+ if (rtime <= 0)
+ rtime = 0;
+ eprint(1, "time rem: %d\n", rtime);
+ }
+ apminfo->rtime = rtime;
+
+ if ((ptr = strstr(buf, "State:"))) {
+ /* found battery discharging. This is used to determine if
+ * we are on AC power or not. Notice check for "ch" later on */
+ stat = *(ptr + 25);
+ if (stat == 'o') /* "ok" : charged, on ac power */
+ apminfo->power = POWER;
+ else
+ /* we set this, and later on use percentage
+ * value to determine high/med/low */
+ apminfo->power = HIGH;
+
+ /* but if we are on power, we might be charging too. Check. */
+ if ((ptr = strstr(buf, "State:"))) {
+ /* found battery charging line. We will change power state
+ * if we are on power, and charging. */
+ stat = *(ptr + 25);
+ /* this is seriously stupid - but we catch "critical" */
+ if (stat == 'c' && (*(ptr + 26) == 'h'))
+ apminfo->power = CHARGING;
+ }
+ }
+
+ /* we are not on power, and not charging. So, it would make sense
+ * to check if battery is "critical low", and calculate interesting
+ * things like battery HIGH/LOW, and maybe battery usage LOAD
+ * This will be replaced with some code to allow setting user-specified
+ * low / critical alarms */
+ if ((apminfo->power != POWER) && (apminfo->power != CHARGING)) {
+ eprint(1, "entering battery status check");
+ if ((ptr = strstr(buf, "State:"))) {
+ stat = *(ptr + 25);
+ /* only check "c" here because we already caught "CHarging" earlier
+ * and also look into crit_level */
+ if (stat == 'c' || (apminfo->percentage <= apminfo->crit_level)) {
+ /* nothing else to do here - critical battery. get out */
+ eprint(1, "Received critical battery status");
+ apminfo->power = CRIT;
+ }
+ }
+ }
+ process_plugin_timer();
+
+ eprint(1, "current state: %s (%d)", state[apminfo->power], apminfo->power);
+}
+#endif /* ACPI */
diff --git a/libapm.c b/libapm.c
new file mode 100644
index 0000000..684da76
--- /dev/null
+++ b/libapm.c
@@ -0,0 +1,91 @@
+#include <stdio.h>
+#include "wmacpi.h"
+
+#ifdef APM
+#ifdef PRO
+extern char *state[];
+#endif
+extern APMInfo *apminfo;
+extern int crit_level;
+
+int power_init(void)
+{
+ FILE *apm;
+
+ if (!(apm = fopen("/proc/apm", "r"))) {
+ fprintf(stderr, "This system does not support APM\n");
+ return 1;
+ }
+ fclose(apm);
+
+ return 0;
+}
+
+void acquire_info(void)
+{
+ FILE *apm;
+ char buf[256];
+ char min[10];
+
+ int ac_line, batt, percent, rtime;
+
+#ifdef PRO
+ /* testing */
+ if (!(apm = fopen("apm", "r")))
+ return;
+#else
+ if (!(apm = fopen("/proc/apm", "r")))
+ return;
+#endif
+
+ fgets(buf, 255, apm);
+ sscanf(buf, "%*s %*s %*s %x %x %*s %d%% %d %s",
+ &ac_line, &batt, &percent, &rtime, min);
+
+ eprint(0, "%02x %02x, %03d%%, %d", ac_line, batt, percent, rtime);
+ apminfo->percentage = percent;
+ apminfo->rtime = rtime;
+
+ switch (ac_line) {
+ case 0: /* on battery. calculate status. handle charging under AC */
+ switch (batt) {
+ case 0:
+ apminfo->power = HIGH;
+ break;
+ case 1:
+ apminfo->power = LOW;
+ break;
+ case 2:
+ apminfo->power = CRIT;
+ break;
+ }
+
+ /* check user-defined critical alarm */
+ if (apminfo->percentage <= apminfo->crit_level)
+ apminfo->power = CRIT;
+
+ break;
+ case 1: /* on AC power. Check if battery is being charged */
+#ifdef RETARDED_APM
+ /* this is incase your battery is "charging" all the fucking time,
+ * even when it's actually done charging */
+ if ((batt == 3) && (percent != 100))
+#else
+ if (batt == 3)
+#endif
+ apminfo->power = CHARGING;
+ else
+ apminfo->power = POWER;
+ break;
+#ifdef STUPID_APM
+ /* treatment for GAY apm bioses that show wrong time
+ * remaining when AC is plugged in */
+ apminfo->rtime = 0;
+#endif
+ }
+ fclose(apm);
+ process_plugin_timer();
+
+ eprint(1, "current state: %s (%d)", state[apminfo->power], apminfo->power);
+}
+#endif /* APM */
diff --git a/master.xpm b/master.xpm
new file mode 100644
index 0000000..30c5d58
--- /dev/null
+++ b/master.xpm
@@ -0,0 +1,207 @@
+/* XPM */
+static char * master_xpm[] = {
+"157 88 116 2",
+" c None",
+". c #000000",
+"+ c #FF0000",
+"@ c #FF0900",
+"# c #FF1200",
+"$ c #FF1C00",
+"% c #202020",
+"& c #FF2F00",
+"* c #FF3800",
+"= c #FF4200",
+"- c #FF4B00",
+"; c #FF5E00",
+"> c #FF6700",
+", c #FF7100",
+"' c #FF7A00",
+") c #FF8D00",
+"! c #FF9700",
+"~ c #FFA000",
+"{ c #FFA900",
+"] c #FFBC00",
+"^ c #FFC600",
+"/ c #FFCF00",
+"( c #FFD900",
+"_ c #FFEC00",
+": c #FFF500",
+"< c #FFFF00",
+"[ c #F5FF00",
+"} c #E2FF00",
+"| c #D9FF00",
+"1 c #CFFF00",
+"2 c #C6FF00",
+"3 c #B3FF00",
+"4 c #AAFF00",
+"5 c #A0FF00",
+"6 c #97FF00",
+"7 c #84FF00",
+"8 c #7AFF00",
+"9 c #71FF00",
+"0 c #67FF00",
+"a c #54FF00",
+"b c #4BFF00",
+"c c #42FF00",
+"d c #38FF00",
+"e c #25FF00",
+"f c #1CFF00",
+"g c #12FF00",
+"h c #09FF00",
+"i c #400000",
+"j c #400300",
+"k c #400500",
+"l c #400700",
+"m c #400C00",
+"n c #400E00",
+"o c #401100",
+"p c #401300",
+"q c #401800",
+"r c #401A00",
+"s c #401D00",
+"t c #401F00",
+"u c #402400",
+"v c #402600",
+"w c #402800",
+"x c #402B00",
+"y c #402F00",
+"z c #403200",
+"A c #403400",
+"B c #403700",
+"C c #403B00",
+"D c #403E00",
+"E c #404000",
+"F c #3E4000",
+"G c #394000",
+"H c #374000",
+"I c #344000",
+"J c #324000",
+"K c #2D4000",
+"L c #2B4000",
+"M c #284000",
+"N c #264000",
+"O c #214000",
+"P c #1F4000",
+"Q c #1D4000",
+"R c #1A4000",
+"S c #154000",
+"T c #134000",
+"U c #114000",
+"V c #0E4000",
+"W c #0A4000",
+"X c #074000",
+"Y c #054000",
+"Z c #034000",
+"` c #C7C7C7",
+" . c #303030",
+".. c #20B2AE",
+"+. c #004941",
+"@. c #188A86",
+"#. c #DAF5B2",
+"$. c #355600",
+"%. c #FEFFFF",
+"&. c #AAAFA9",
+"*. c #315900",
+"=. c #D0D2D1",
+"-. c #FDFEF6",
+";. c #FF2D00",
+">. c #DA0710",
+",. c #F3FFF9",
+"'. c #A5F812",
+"). c #A7ACB2",
+"!. c #4F5354",
+"~. c #87F91F",
+"{. c #94F625",
+"]. c #C0C6BC",
+"^. c #22B2AE",
+"/. c #027E72",
+"(. 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 ",
+" . + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 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 ",
+" . 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 ` . + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % 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 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 ` . + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % 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 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 ` . + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % 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 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 ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
+" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % ` . . . . .% . . . .% . . . .% . . . .% . . . .% . . . .% . . . .% . . . .% . . . .% . . . .% . . . . ",
+" . % % % % % % ..........% % % % ....................% % ` . % % % % % +.+.+.% % % +.+.+.% % % ..% % % % % ` . ",
+" . % % % % % ..% % % % ......% % ..% % % % % % % % ..% % ` . % % +.% +.% % % +.% +.% % % +.% ..% ..% ..% % ` . 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 ",
+" . % ..% % % % % % % % % % % % % ....................% % ` . % % % % % +.+.+.% % % +.+.+.% % % % % ..% % % ` . 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 ",
+" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . ",
+" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
+" . % % ......% % % +.+.+. 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
new file mode 100644
index 0000000..2156b41
--- /dev/null
+++ b/master_low.xpm
@@ -0,0 +1,111 @@
+/* XPM */
+static char * master_xpm[] = {
+"157 88 20 1",
+" c None",
+". c #000000",
+"+ c #FF0000",
+"@ c #202020",
+"# c #FFF500",
+"$ c #09FF00",
+"% c #400000",
+"& c #403B00",
+"* c #034000",
+"= c #AAAFA9",
+"- c #20B2AE",
+"; c #004941",
+"> c #188A86",
+", c #D0D2D1",
+"' c #FEFFFF",
+") c #4F5354",
+"! c #22B2AE",
+"~ c #027E72",
+"{ c #034A40",
+"] c #107D79",
+" . ++++ 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 -@@@@-@;@@@@- at -@@@@-@;@@@@-@@@@@ @-@@@@- at -@@@@-@@@@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @!!!!!;@",
+"@-@@@@-@;@@@@- at -@@@@;@;@@@@-@;@@@@-@;@@@@- at -@@@@-@;@@@@- at -@@@@-@;@@@@-@@-@@ @-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@@@!!@",
+"@-@@@@-@;@@@@- at -@@@@;@;@@@@-@;@@@@-@;@@@@- at -@@@@-@;@@@@- at -@@@@-@;@@@@-@@-@@ @-@@@@- at -@@@@-@@-@@-@@@@- at -@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@@@!!@",
+"@@----@@@;;;;]@]----]@]----]@@;;;;]@]----]@]----]@@;;;;]@]----]@]----]@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @!!!!!@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@"};
diff --git a/wmacpi.c b/wmacpi.c
new file mode 100644
index 0000000..c5c48e5
--- /dev/null
+++ b/wmacpi.c
@@ -0,0 +1,634 @@
+/* apm/acpi dockapp - phear it 1.3
+ * Copyright (C) 2000, 2001 timecop at japan.co.jp
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* #define RETARDED_APM */
+/* #define STUPID_APM */
+/* see README if you need to #define these or not. No user serviceable
+ * parts below */
+
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <time.h>
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/extensions/shape.h>
+#include <X11/xpm.h>
+
+#include "wmacpi.h"
+
+#if defined(ACPI) && defined(APM)
+# error Cannot compile with ACPI and APM compiled in. Please select only one.
+#endif
+
+/* main pixmap */
+#ifdef LOW_COLOR
+#include "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 */
+ Pixmap text; /* pixmap for text scroller */
+ int tw; /* text width inside text pixmap */
+ int update; /* need to redraw? */
+ int pressed; /* is the button pressed? */
+ DspMode dspmode; /* time remaining or battery timer */
+ Mode blink; /* should we blink the LED? (critical battery) */
+} Dockapp;
+
+/* for debug printing */
+#ifdef PRO
+char *state[] = { "AC", "Charging", "High", "Low", "Crit" };
+#endif
+
+/* globals */
+Dockapp *dockapp;
+APMInfo *apminfo;
+int count = 0; /* global timer variable */
+int noisy_critical = 0; /* ring xbell annoyingly if critical? */
+
+/* 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(int x, int y, int width, int tw, int reset);
+static void display_percentage(int percent);
+static void display_state(void);
+static void display_time(int minutes);
+static void blink_button(Mode mode);
+
+#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; \
+}
+
+static void redraw_window(void)
+{
+ if (dockapp->update) {
+ eprint(1, "redrawing window");
+ 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);
+ dockapp->update = 0;
+ }
+}
+
+static void new_window(char *name)
+{
+ 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;
+ 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);
+
+ 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) {
+ fprintf(stderr, "FATAL: Not enough colors for main pixmap!\n");
+ exit(1);
+ }
+
+ /* text area is 318x7, or 53 characters long */
+ dockapp->text = XCreatePixmap(dockapp->display, dockapp->win, 318, 7,
+ DefaultDepth(dockapp->display,
+ dockapp->screen));
+ if (!dockapp->text) {
+ fprintf(stderr, "FATAL: Cannot create text scroll pixmap!\n");
+ exit(1);
+ }
+
+ 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);
+}
+
+static void render_text(char *string)
+{
+ int i, c, k;
+
+ if (strlen(string) > 53)
+ return;
+
+ eprint(1, "rendering: %s", 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);
+ }
+ k = 0;
+
+ for (i = 0; string[i]; i++) {
+ 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);
+ } 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);
+ } else if (c == '.') {
+ XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
+ dockapp->gc, 140, 58, 6, 7, k, 0);
+ } else if (c == '-') {
+ XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
+ dockapp->gc, 126, 58, 6, 7, k, 0);
+ }
+ k += 6;
+ }
+ dockapp->tw = k; /* length of text segment */
+ /* re-scroll the message */
+ scroll_text(6, 50, 52, dockapp->tw, 1);
+ /* reset the scroll repeat counter */
+ count = 0;
+}
+
+static int open_display(char *display)
+{
+ dockapp->display = XOpenDisplay(display);
+ if (!dockapp->display) {
+ fprintf(stderr, "Unable to open display '%s'\n", display);
+ return 1;
+ }
+ return 0;
+}
+
+static void scroll_text(int x, int y, int width, int tw, int reset)
+{
+ static int pos, first, stop;
+
+ if (reset) {
+ pos = 0;
+ first = 0;
+ stop = 0;
+ XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text,
+ dockapp->gc, 0, 0, width, 7, x, y);
+ }
+
+ 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;
+
+ eprint(0, "scrolling");
+
+ 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, obar;
+ unsigned int bar;
+
+ eprint(1, "received: %d\n", percent);
+
+ if (op == percent)
+ return;
+
+ if (percent < 0)
+ percent = 0;
+ if (percent > 100)
+ percent = 100;
+
+ if (percent < 100) { /* 0 - 99 */
+ copy_xpm_area(95, 48, 8, 7, 37, 17);
+ if (percent >= 10)
+ copy_xpm_area((percent / 10) * 6 + 67, 28, 5, 7, 40, 17);
+ copy_xpm_area((percent % 10) * 6 + 67, 28, 5, 7, 46, 17);
+ } else
+ copy_xpm_area(95, 37, 21, 9, 37, 16); /* 100% */
+ op = percent;
+
+ bar = percent / 1.8518;
+
+ if (bar == obar)
+ return;
+
+ copy_xpm_area(66, 0, bar, 8, 5, 5);
+ if (bar < 54)
+ copy_xpm_area(66 + bar, 18, 54 - bar, 8, bar + 5, 5);
+ obar = bar;
+}
+
+static void display_time(int minutes)
+{
+ static int ohour = -1, omin = -1;
+ static int counter;
+ int hour, min, tmp;
+
+ if (minutes == -1) { /* error - blink 00:00 */
+ counter++;
+ if (counter == 5) {
+ copy_xpm_area(80, 76, 31, 11, 7, 32);
+ } else if (counter == 10) {
+ copy_xpm_area(114, 76, 31, 11, 7, 32);
+ }
+ if (counter > 10)
+ counter = 0;
+ ohour = omin = -1;
+ return;
+ }
+
+ /* render time on the display */
+ hour = minutes / 60;
+ min = minutes % 60;
+
+ if (hour == ohour && min == omin)
+ return;
+
+ eprint(0, "redrawing time");
+ tmp = hour / 10;
+ copy_xpm_area(tmp * 7 + 1, 76, 6, 11, 7, 32);
+ tmp = hour % 10;
+ copy_xpm_area(tmp * 7 + 1, 76, 6, 11, 14, 32);
+ tmp = min / 10;
+ copy_xpm_area(tmp * 7 + 1, 76, 6, 11, 25, 32);
+ tmp = min % 10;
+ copy_xpm_area(tmp * 7 + 1, 76, 6, 11, 32, 32);
+ copy_xpm_area(71, 76, 3, 11, 21, 32);
+ ohour = hour;
+ omin = min;
+}
+
+static void display_state(void)
+{
+ static int dopower;
+ static int docharging;
+ static int dobattery;
+ static int docritical;
+ static int counter;
+
+ switch (apminfo->power) {
+ case POWER:
+ eprint(0, "selected ac power case");
+ if (!dopower) {
+ dopower = 1;
+ docharging = 0;
+ dobattery = 0;
+ dockapp->blink = OFF;
+ copy_xpm_area(67, 38, 12, 7, 6, 17);
+ copy_xpm_area(82, 48, 11, 7, 20, 17);
+ render_text("On AC power");
+ }
+ break;
+ case CHARGING:
+ eprint(0, "selected charging case");
+ counter++;
+ if (counter == 10) {
+ copy_xpm_area(67, 38, 12, 7, 6, 17);
+ } else if (counter == 20) {
+ copy_xpm_area(67, 48, 12, 7, 6, 17);
+ }
+ if (counter > 20)
+ counter = 0;
+ if (!docharging) {
+ render_text("Battery is charging");
+ /* get rid of battery symbol */
+ copy_xpm_area(82, 48, 12, 7, 20, 17);
+ /* housekeeping */
+ dockapp->blink = OFF;
+ docharging = 1;
+ dopower = 0;
+ dobattery = 0;
+ }
+ break;
+ case HIGH:
+ case LOW:
+ case CRIT:
+ eprint(0, "selected battery case");
+ if (!dobattery) {
+ render_text("On Battery");
+ /* display battery symbol */
+ copy_xpm_area(82, 38, 12, 7, 20, 17);
+ /* get rid of AC power symbol */
+ copy_xpm_area(67, 48, 12, 7, 6, 17);
+ dobattery = 1;
+ dopower = 0;
+ docharging = 0;
+ }
+ if (apminfo->power == CRIT) {
+ dockapp->blink = BLINK;
+ if (!docritical) {
+ render_text("Battery Critical Low");
+ docritical = 1;
+ }
+ } else {
+ if (docritical) {
+ render_text("On Battery");
+ docritical = 0;
+ }
+ dockapp->blink = OFF;
+ }
+ break;
+ }
+}
+
+static void blink_button(Mode mode)
+{
+ static int counter;
+ static int clear;
+
+ if ((mode == OFF) && !clear) {
+ eprint(0, "we are off");
+ copy_xpm_area(136, 38, 3, 3, 44, 30);
+ clear = 1;
+ return;
+ }
+ if (mode != BLINK)
+ return;
+
+ counter++;
+
+ if (counter == 5) {
+ copy_xpm_area(137, 33, 3, 3, 44, 30);
+ clear = 0;
+ } else if (counter == 10) {
+ copy_xpm_area(136, 38, 3, 3, 44, 30);
+ clear = 0;
+ /* make some noise */
+ if (noisy_critical)
+ XBell(dockapp->display, 100);
+ }
+ if (counter > 10)
+ counter = 0;
+}
+
+int main(int argc, char **argv)
+{
+ char *display = NULL;
+ char ch;
+ int update = 0;
+
+ dockapp = calloc(1, sizeof(Dockapp));
+ apminfo = calloc(1, sizeof(APMInfo));
+
+ dockapp->blink = OFF;
+ apminfo->crit_level = 10;
+
+ /* see if whatever we want to use is supported */
+ if (power_init()) {
+ /* power_init functions handle printing error messages */
+ exit(1);
+ }
+
+ /* parse command-line options */
+ while ((ch = getopt(argc, argv, "bd:c:h")) != EOF) {
+ switch (ch) {
+ case 'b':
+ noisy_critical = 1;
+ break;
+ case 'c':
+ if (optarg) {
+ apminfo->crit_level = atoi(optarg);
+ if ((apminfo->crit_level < 0) || (apminfo->crit_level > 100)) {
+ fprintf(stderr, "Please use values between 0 and 100%%\n");
+ apminfo->crit_level = 10;
+ fprintf(stderr, "Using default value of 10%%\n");
+ }
+ }
+ break;
+ case 'd':
+ if (optarg)
+ display = strdup(optarg);
+ break;
+ case 'h':
+ printf("wmacpi - help\t\t[timecop at japan.co.jp]\n\n"
+ "-d display\t\tdisplay on remote display <display>\n"
+ "-b\t\t\tmake noise when battery is critical low (beep)\n"
+ "-c value\t\tset critical low alarm at <value> percent\n"
+ "\t\t\t(default: 10 percent)\n"
+ "-h\t\t\tdisplay this help\n");
+ return 0;
+ break;
+ }
+
+ }
+
+ /* open local or command-line specified display */
+ if (open_display(display))
+ exit(1);
+
+ /* make new dockapp window */
+ new_window("apm");
+
+ /* get initial statistics */
+ acquire_info();
+
+ dockapp->dspmode = REMAIN;
+
+ /* main loop */
+ while (1) {
+ XEvent event;
+ while (XPending(dockapp->display)) {
+ eprint(0, "X11 activity");
+ XNextEvent(dockapp->display, &event);
+ switch (event.type) {
+ case Expose:
+ /* update */
+ dockapp->update = 1;
+ while (XCheckTypedEvent(dockapp->display, Expose, &event));
+ redraw_window();
+ break;
+ case DestroyNotify:
+ XCloseDisplay(dockapp->display);
+ exit(0);
+ break;
+ case ButtonPress:
+ /* press event */
+ if (event.xbutton.x >= 44 && event.xbutton.x <= 57 &&
+ event.xbutton.y >= 30 && event.xbutton.y <= 43) {
+ eprint(0, "inside button!");
+ dockapp->pressed = 1;
+ copy_xpm_area(118, 38, 15, 15, 44, 30);
+ }
+ break;
+ case ButtonRelease:
+ /* release event */
+ if (event.xbutton.x >= 44 && event.xbutton.x <= 57 &&
+ event.xbutton.y >= 30 && event.xbutton.y <= 43 &&
+ dockapp->pressed) {
+ /* handle button press */
+ eprint(0, "release still inside button!");
+ dockapp->pressed = 0;
+ copy_xpm_area(136, 38, 15, 15, 44, 30);
+ if ((apminfo->power != POWER) && (apminfo->power != CHARGING)) {
+ dockapp->dspmode = !dockapp->dspmode;
+ eprint(1, "Mode: %d", dockapp->dspmode);
+ }
+ /* end button press handler */
+ }
+ if (dockapp->pressed) {
+ copy_xpm_area(136, 38, 15, 15, 44, 30);
+ dockapp->pressed = 0;
+ }
+ break;
+ }
+ }
+
+ if (update++ == 30) {
+ eprint(1, "polling apm");
+ acquire_info();
+ update = 0;
+ }
+
+ if (count++ == 256) {
+ scroll_text(6, 50, 52, dockapp->tw, 1);
+ count = 0;
+ }
+
+ /* it's okay to test here because display_time will not draw anything
+ * unless there is a change. Also if we switched power states from
+ * battery to charging/etc, we need to exit from "timer" mode */
+ if (dockapp->dspmode == REMAIN || apminfo->power == POWER || apminfo->power == CHARGING) {
+ display_time(apminfo->rtime);
+ } else {
+ display_time((time(NULL) - apminfo->timer) / 60);
+ }
+
+ display_state();
+ blink_button(dockapp->blink);
+ display_percentage(apminfo->percentage);
+ scroll_text(6, 50, 52, dockapp->tw, 0);
+
+ /* redraw_window, if anything changed - determined inside
+ * redraw_window. */
+ redraw_window();
+ usleep(100000);
+ }
+ return 0;
+}
+
+/* this handles enabling "on-battery" timer. It only needs to happen once
+ * for each unplug event. Functions from libapm and libacpi call this to
+ * start the timer */
+void process_plugin_timer(void)
+{
+ static int timer;
+
+ if ((apminfo->power != POWER) && (apminfo->power != CHARGING) && !timer) {
+ eprint(1, "not AC and not charging, and timer is not started");
+ eprint(1, "starting battery timer");
+ apminfo->timer = time(NULL);
+ timer = 1;
+ }
+ if (((apminfo->power == POWER) || (apminfo->power == CHARGING)) && timer) {
+ eprint(1, "disabling battery timer");
+ timer = 0;
+ }
+
+}
diff --git a/wmacpi.h b/wmacpi.h
new file mode 100644
index 0000000..e9c15a5
--- /dev/null
+++ b/wmacpi.h
@@ -0,0 +1,52 @@
+#ifndef _WMACPI_H_
+#define _WMACPI_H_
+
+#ifdef PRO
+#define eprint(level, fmt, arg...) \
+ switch (level) { \
+ case 0: \
+ break; \
+ case 1: \
+ fprintf(stderr, __FUNCTION__": " fmt, ##arg); \
+ fprintf(stderr, "\n"); \
+ break; \
+ }
+#else
+#define eprint(level, fmt, arg...) \
+ do { } while (0)
+#endif
+
+typedef enum {
+ REMAIN,
+ TIMER
+} DspMode;
+
+typedef enum {
+ BLINK,
+ OFF
+} Mode;
+
+typedef enum {
+ POWER, /* on AC, Battery charged */
+ CHARGING, /* on AC, Charging */
+ HIGH, /* on Battery, HIGH */
+ LOW, /* on Battery, LOW */
+ CRIT /* on Battery, CRIT */
+} State;
+
+typedef struct {
+ State power; /* power state: Battery levels or AC */
+ int percentage; /* battery percentage (-1 if no battery) */
+ int rtime; /* remaining time */
+ int timer; /* how long been on battery? */
+ int crit_level; /* anything below this is critical low */
+} APMInfo;
+
+/* detect plugin events */
+void process_plugin_timer(void);
+/* check if apm/acpi is enabled, etc */
+int power_init(void);
+/* fill APMInfo with data */
+void acquire_info(void);
+
+#endif /* _WMACPI_H_ */
--
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