wmacpi: Bump to wmacpi-ng version 0.50.

Source obtained from http://sourceforge.net/projects/wmacpi/files/.

2003 July 6 0.50
	Finally got rid of that annoying button - that space now contains
	a 'B 1' or 'B 2' (only those two at present, since I'm too lazy to
	fix it so that the number is generic. It should work fine for
	anyone who doesn't have a freakish system with more than two
	batteries . . .)

	A few more code cleanups.
This commit is contained in:
Doug Torrance 2014-08-18 17:56:10 -05:00 committed by Carlos R. Mafra
parent 9fcd703e60
commit a68f78f034
26 changed files with 1463 additions and 910 deletions

Binary file not shown.

BIN
wmacpi/.xvpics/master.xpm Normal file

Binary file not shown.

Binary file not shown.

View file

@ -1,339 +1,2 @@
GNU GENERAL PUBLIC LICENSE #include <GNU_GPL_v2>
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View file

@ -1,3 +1,74 @@
2003 July 6 0.50
Finally got rid of that annoying button - that space now contains
a 'B 1' or 'B 2' (only those two at present, since I'm too lazy to
fix it so that the number is generic. It should work fine for
anyone who doesn't have a freakish system with more than two
batteries . . .)
A few more code cleanups.
2003 July 1 0.19
libacpi cleanups and reworking - we now handle the charging
battery case properly, it seems.
Also, some attempts to make error printing a bit cleaner; still a
long way to go on that, though . . .
2003 June 24 0.15
Removed process_plugin_timer(), since it was doing nothing useful
at all . . .
2003 June 23 0.14
Removed libapm.c - wmacpi-ng is specifically for ACPI, with no APM
support.
2003 June 23 0.13
Some more code cleanups, designed to move libacpi to more of a
library than something built into wmacpi-ng. This is useful with
the seperate programs, though at present it's not used much.
2003 June 21 0.12
Added a command line tool, acpi-ng to query battery status from
the command line.
2003 May 30 0.11
Implemented multiple battery support, and averaging of the samples
in an attempt to even out the jumpiness of the timer.
2003 May 30 0.10
More major code cleanups: in particular the handling of the power
panel and the message has been cleaned up so that it's actually
sane and clean.
Next step from here is to actually implement handling of multiple
batteries, so that if there's a fully charge second battery
available it reports the correct time remaining (based on the
present rate of power consumption and the sum of the two battery's
remaining capacities).
2003 May 29 0.3
Some major reworking of the internals, to help fix the handling of
multiple batteries and such things.
2003 May 26 0.2a
Code cleanups to fix various problems with corner cases.
2003 May 26 0.2
Added support for multiple batteries: I took the simple route of
displaying only one battery per instance - to do more I'd need to
hack with the display code, and I'm not ready for that yet.
Added a -m option to specify the battery number to monitor.
2003 May 26 0.1
Changed package completely, to support the new ACPI code as of
2.4.21-rc2.
Since this code hasn't been touched in more than a year, I figure
I might as well have a go at hacking on it . . .
-- Simon Fowler, <simon@dreamcraft.com.au>
2002 Feb 17 1.34 2002 Feb 17 1.34
Updated ACPI statistics gathering code for the latest ACPI patch from Updated ACPI statistics gathering code for the latest ACPI patch from
Intel. Now uses/checks for subsystem version 20020214+. Redone the version Intel. Now uses/checks for subsystem version 20020214+. Redone the version

View file

@ -1,8 +1,7 @@
# set options. pick one, acpi or apm. comment out the other one. don't # set options. pick one, acpi or apm. comment out the other one. don't
# uncomment both, bad things will happen :) # uncomment both, bad things will happen :)
OPT = -O3 -DACPI OPT := -O2
#OPT = -O3 -DAPM
# uncomment this to make wmacpi use less system colors (looks uglier too) # uncomment this to make wmacpi use less system colors (looks uglier too)
#OPT += -DLOW_COLOR #OPT += -DLOW_COLOR
@ -10,16 +9,41 @@ OPT = -O3 -DACPI
# debugging options (don't bother with these) # debugging options (don't bother with these)
#OPT = -pg -g -DPRO -DACPI #OPT = -pg -g -DPRO -DACPI
CC = gcc CC := gcc
CFLAGS = $(OPT) -Wall -ansi -I/usr/X11R6/include 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
SRCS = wmacpi.c libapm.c libacpi.c WMSRC := wmacpi-ng.c libacpi.c
OBJS = wmacpi.o libapm.o libacpi.o CLSRC := acpi-ng.c libacpi.c
HEADERS := libacpi.h wmacpi-ng.h
targets := wmacpi-ng acpi-ng
all: wmacpi all: $(targets)
wmacpi: $(OBJS) # build the list of object files
WMOBJ := $(patsubst %.c,%.o,$(filter %.c,$(WMSRC)))
CLOBJ := $(patsubst %.c,%.o,$(filter %.c,$(CLSRC)))
# include per-file dependencies
include $(WMOBJ:.o=.d)
include $(CLOBJ:.o=.d)
wmacpi-ng: $(WMOBJ)
gcc $(LDFLAGS) -o $@ $^
acpi-ng: $(CLOBJ)
gcc $(LDFLAGS) -o $@ $^
# build per-file dependencies - note that -MM may not be supported
# in gcc versions older than 2.95.4, but most likely is.
%.d: %.c
gcc -MM $(CFLAGS) $< > $@
clean: clean:
rm -f *.o *~ wmacpi trace *.out *.bb *.bbg rm -f TAGS *.o *~ trace *.out *.bb *.bbg
clean-all: clean
rm -f *.d $(targets)
tags:
etags $(WMSRC) $(CLSRC) $(HEADERS)

38
wmacpi/TODO Normal file
View file

@ -0,0 +1,38 @@
2003 July 6 0.50
* Fix the non-deb installation - as it stands, it doesn't even try.
* Yet more cleanups.
2003 June 24 0.14
* Still more code cleanups - there's a considerable amount of dumb
stuff in there still . . .
* Display time left for battery charging. But first make sure that
this will actually work with other systems.
* Turn libacpi into a real library?
2003 May 30 0.10
* More code cleanups, particularly in the various display functions.
* Full handling of multiple batteries.
* Add some kind of progressive display of power consumption, roughly
similar to what wmmon displays for cpu usage (possibly as a
completely seperate display mode, or possibly as a replacement for
the (completely useless) button).
* Drop APM support (maybe?).
2003 May 26 0.2a
* Restructure power state handling - split it into a boolean AC
on/off and a battery status flag.
* Expand the APMInfo struct to be more useful.
* Code cleanups . . .
-- Simon Fowler, <simon@dreamcraft.com.au>

125
wmacpi/acpi-ng.c Normal file
View file

@ -0,0 +1,125 @@
/*
* acpi-ng: command line acpi battery status tool.
*
* Written by Simon Fowler <simon@dreamcraft.com.au>, 2003-06-20.
* Copyright 2003-06-20 Dreamcraft Pty Ltd.
*
* This file is distributed under the GNU General Public License,
* version 2. Please see the COPYING file for details.
*/
/*
* 2003-06-20.
* I'm getting sick of not having a convenient way to query battery
* status on the command line, so I'm hacking up this - a quick little
* command line tool to display current battery status, using the same
* libacpi code as wmacpi-ng.
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <unistd.h>
#include "libacpi.h"
#define ACPI_NG_VER "0.50"
APMInfo *apminfo;
void usage(char *name)
{
printf("%s: query battery status on ACPI enabled systems.\n"
"Usage:\n"
"%s [-h] [-a]\n"
" h - display this help information\n"
" a - average remaining time over some number of samples\n"
" much more accurate than using a single sample\n"
" v - increase verbosity\n",
name, name);
}
void print_version(void)
{
printf("acpi-ng version %s\n", ACPI_NG_VER);
printf(" Using libacpi version %s\n", LIBACPI_VER);
}
int main(int argc, char *argv[])
{
int i, j, ch;
int sleep_time = 0;
int samples = 1;
battery *binfo;
while((ch = getopt(argc, argv, "hvVa::")) != EOF) {
switch(ch) {
case 'h':
usage(argv[0]);
return 0;
case 'v':
verbosity++;
break;
case 'V':
print_version();
return 0;
case 'a':
printf("case a\n");
if(optarg == NULL) {
printf("empty optarg\n");
} else {
printf("optarg: %s\n", optarg);
samples = atoi(optarg);
}
if(samples > 1000 || samples <= 0) {
printf("Please specify a reasonable number of samples\n");
exit(1);
}
printf("samples: %d\n", samples);
sleep_time = 1000000/samples;
break;
default:
usage(argv[0]);
return 1;
}
}
apminfo = (APMInfo *) malloc(sizeof(APMInfo));
power_init();
/* we want to acquire samples over some period of time, so . . . */
for(i = 0; i < samples + 2; i++) {
for(j = 0; j < batt_count; j++)
acquire_batt_info(j);
acquire_global_info();
usleep(sleep_time);
}
if(apminfo->power == AC) {
printf("On AC Power");
for(i = 0; i < batt_count; i++) {
binfo = &batteries[i];
if(binfo->present && binfo->charging) {
printf("; Battery %s charging", binfo->name);
printf(", %2d:%02d remaining", binfo->charge_time/60,
binfo->charge_time%60);
}
}
printf("\n");
} else if(apminfo->power == BATT) {
printf("On Battery");
for(i = 0; i < batt_count; i++) {
binfo = &batteries[i];
if(binfo->present)
printf(", Battery %s at %d%%", binfo->name,
binfo->percentage);
}
printf("; %d:%02d remaining\n", apminfo->rtime/60,
apminfo->rtime%60);
}
return 0;
}

105
wmacpi/debian/changelog Normal file
View file

@ -0,0 +1,105 @@
wmacpi-ng (0.50-1) unstable; urgency=low
* New upstream version.
-- Simon Fowler <simon@hollie.himi.private> Sun, 6 Jul 2003 16:50:59 +1000
wmacpi-ng (0.19-1) unstable; urgency=low
* New upstream version.
-- Simon Fowler <simon@hollie.himi.private> Wed, 2 Jul 2003 00:55:36 +1000
wmacpi-ng (0.15-1) unstable; urgency=low
* New upstream version.
-- Simon Fowler <simon@hollie.himi.private> Tue, 24 Jun 2003 00:38:26 +1000
wmacpi-ng (0.14-1) unstable; urgency=low
* New upstream version.
-- Simon Fowler <simon@hollie.himi.private> Tue, 24 Jun 2003 00:00:26 +1000
wmacpi-ng (0.13-1) unstable; urgency=low
* New upstream version.
-- Simon Fowler <simon@hollie.himi.private> Mon, 23 Jun 2003 23:49:05 +1000
wmacpi-ng (0.12-1) unstable; urgency=low
* New upstream version.
-- Simon Fowler <simon@hollie.himi.private> Sat, 21 Jun 2003 12:24:43 +1000
wmacpi-ng (0.11-1) unstable; urgency=low
* New upstream version.
-- Simon Fowler <simon@hollie.himi.private> Fri, 30 May 2003 23:42:12 +1000
wmacpi-ng (0.10-1) unstable; urgency=low
* New upstream version.
-- Simon Fowler <simon@dreamcraft.com.au> Fri, 30 May 2003 13:35:50 +1000
wmacpi-ng (0.2a-1) unstable; urgency=low
* New upstream version.
-- Simon Fowler <simon@dreamcraft.com.au> Mon, 26 May 2003 22:08:45 +1000
wmacpi-ng (0.2-1) unstable; urgency=low
* New version.
-- Simon Fowler <simon@dreamcraft.com.au> Mon, 26 May 2003 18:59:16 +1000
wmacpi-ng (0.1-1) unstable; urgency=low
* New package, since the current version doesn't work with kernel
2.4.21-rc2.
-- Simon Fowler <simon@dreamcraft.com.au> Mon, 26 May 2003 14:01:40 +1000
wmacpi (1.34-1) unstable; urgency=low
* New maintainer.
* New upstream release (closes: #143387).
* debian/control:
- Updated description.
- Bumped Standards-Version to 3.5.9.
- Updated build-dependency on debhelper to >= 4.
- Changed priority to "optional".
- Added a recommendation on "wmaker".
* debian/compat:
- Introduced this file and set its contents to "4".
* debian/copyright:
- Updated maintainer and homepage infos.
* debian/rules:
- Made some minor modifications to comply with policy.
* debian/watch:
- Introduced this file, which seems to be currently useless, though. the
web server does not allow browsing in the necessary directories.
* debian/docs:
- Included AUTHORS.
* debian/wmacpi.1:
- Updated man page to reflect current parameters of wmacpi.
-- Sebastian Henschel <shensche@kodeaffe.de> Sat, 19 Apr 2003 17:09:11 +0200
wmacpi (1.33-1) unstable; urgency=low
* New upstream release
-- Simon Richter <sjr@debian.org> Mon, 28 May 2001 01:49:55 +0200
wmacpi (1.31-1) unstable; urgency=low
* Initial Release (Closes: #90347).
-- Simon Richter <Simon.Richter@phobos.fs.tum.de> Mon, 19 Mar 2001 23:26:49 +0100

1
wmacpi/debian/compat Normal file
View file

@ -0,0 +1 @@
4

21
wmacpi/debian/control Normal file
View file

@ -0,0 +1,21 @@
Source: wmacpi-ng
Section: x11
Priority: optional
Maintainer: Simon Fowler <simon@dreamcraft.com.au>
Build-Depends: debhelper (>= 4), xlibs-dev
Standards-Version: 3.5.9
Package: wmacpi-ng
Architecture: i386
Depends: ${shlibs:Depends}
Recommends: wmaker
Description: An ACPI battery monitor for WindowMaker
This is a battery monitor that uses ACPI to query the battery status. As
the interface to ACPI changes rather often, this program usually only works
with a very specific kernel version.
.
This is a reworked version to handle kernel version 2.4.21-rc2, done
by Simon Fowler <simon@dreamcraft.com.au>
.
Author: Tim Copperfield <timecop@japan.co.jp>
Homepage: http://www.ne.jp/asahi/linux/timecop/

27
wmacpi/debian/copyright Normal file
View file

@ -0,0 +1,27 @@
This package was debianized by Simon Richter <Simon.Richter@phobos.fs.tum.de> on
Mon, 19 Mar 2001 23:26:49 +0100.
It was taken over by Sebastian Henschel <shensche@kodeaffe.de> on Sat, 19 Apr 2003 15:31:00 +0200.
It was downloaded from http://www.ne.jp/asahi/linux/timecop/
Upstream Author: Timecop <timecop@japan.co.jp>
Copyright:
This package 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; version 2 dated June, 1991.
This package 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 package; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
On Debian GNU/Linux systems, the complete text of the GNU General
Public License can be found in `/usr/share/common-licenses/GPL'.

1
wmacpi/debian/dirs Normal file
View file

@ -0,0 +1 @@
usr/bin

3
wmacpi/debian/docs Normal file
View file

@ -0,0 +1,3 @@
README
AUTHORS
TODO

2
wmacpi/debian/menu Normal file
View file

@ -0,0 +1,2 @@
?package(wmacpi-ng):needs=X11 section=Apps/System\
title="wmacpi-ng" command="/usr/bin/wmacpi-ng"

90
wmacpi/debian/rules Executable file
View file

@ -0,0 +1,90 @@
#!/usr/bin/make -f
# Sample debian/rules that uses debhelper.
# GNU copyright 1997 to 1999 by Joey Hess.
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
INSTALLDIR=$(CURDIR)/debian/wmacpi-ng
# These are used for cross-compiling and for saving the configure script
# # from having to guess our platform (since we know it already)
DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS = "-Wall -g -O0"
else
CFLAGS = "-Wall -g -O2"
endif
configure: configure-stamp
configure-stamp:
dh_testdir
touch configure-stamp
build: configure-stamp build-stamp
build-stamp:
dh_testdir
# Add here commands to compile the package.
$(MAKE)
touch build-stamp
clean:
dh_testdir
dh_testroot
rm -f build-stamp configure-stamp
# Add here commands to clean up after the build process.
-$(MAKE) clean-all
dh_clean
install: build
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
# Add here commands to install the package into debian/wmacpi.
install -o root -g root -m 755 wmacpi-ng $(INSTALLDIR)/usr/bin/
install -o root -g root -m 755 acpi-ng $(INSTALLDIR)/usr/bin/
# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.
# Build architecture-dependent files here.
binary-arch: build install
dh_testdir
dh_testroot
# dh_installdebconf
dh_installdocs
# dh_installexamples
dh_installmenu
# dh_installemacsen
# dh_installpam
# dh_installinit
# dh_installcron
dh_installman debian/wmacpi-ng.1
# dh_installinfo
# dh_undocumented
dh_installchangelogs ChangeLog
dh_link
dh_strip
dh_compress
dh_fixperms
# dh_makeshlibs
dh_installdeb
# dh_perl
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure

2
wmacpi/debian/watch Normal file
View file

@ -0,0 +1,2 @@
version=2
http://www.ne.jp/asahi/linux/timecop/software/wmacpi-(.*)\.tar\.gz debian uupdate

125
wmacpi/debian/wmacpi-ng.1 Normal file
View file

@ -0,0 +1,125 @@
.TH WMACPI-NG 1 "May 30, 2003"
.SH NAME
wmacpi-ng \- Battery status monitor for systems supporting ACPI
.SH NAME
acpi-ng \- Query battery status for systems supporting ACPI
.SH SYNOPSIS
.B wmacpi-ng
[
.RI -b
]
[
.RI -c
value ]
[
.RI -d
display ]
[
.RI -m
battery no ]
[
.RI -v
]
[
.RI -V
]
[
.RI -h
]
.PP
.B acpi-ng
[
.RI -a
samples ]
[
.RI -v
]
[
.RI -V
]
[
.RI -h
]
.SH DESCRIPTION
This manual page documents briefly the
.B wmacpi-ng
command.
.PP
.B wmacpi-ng
is a program that displays the current battery status in a WindowMaker
dock app, on systems that support Intel's Advanced Configuration and
Power Interface specification (ACPI).
.PP
The program monitors a battery, displaying its current percentage
charge via a bar and a numeric value. It also displays the current
power status for the system, the time remaining (calculated based on
the remaining battery capacity and the current rate of power usage),
and a scrolling message with some hopefully useful information.
.PP
Clicking on the window cycles through the batteries that the ACPI
system knows about.
.PP
.B acpi-ng
queries the battery status from the command line. It prints the power
status, the percentage remaining for each battery found, and the time
remaining if the system is on battery, or the time remaining for each
battery to reach full charge if the batteries are charging.
.SH OPTIONS
.B wmacpi-ng
.TP
.B \-b
Make noise when battery is critical low (beep).
.TP
.B \-c value
Set critical low alarm at <value>% (default: 10%).
.TP
.B \-d
Set the X display to open the window on.
.TP
.B \-m
Set the battery to monitor initially.
.TP
.B \-v
Increase the verbosity of the program. Can be used more than once -
each successive use increases the verbosity.
.TP
.B \-V
Print the version information.
.TP
.B \-h
Display help.
.TP
.B acpi-ng
.TP
.B \-a num
Average the time remaining over num samples. This greatly improves the
accuracy of the reported time remaining.
.TP
.B \-v
Increase the verbosity of the program, as for
.B wmacpi-ng
.TP
.B \-V
Print the version information.
.TP
.B \-h
Display help.
.TP
.SH SEE ALSO
.BR wmapm (1)
.br
.SH AUTHOR
.B wmacpi
as written by Tim Copperfield <timecop@japan.co.jp>.
.B wmacpi-ng
is a reworking of
.B wmacpi 1.34
to support recent kernel versions, performed by Simon Fowler
<simon@dreamcraft.com.au>.
.PP
This manual page was originally written by Simon Richter
<sjr@debian.org> for the Debian GNU/Linux system, and then updated for
.B wmacpi-ng
by Simon Fowler.
.br
Last modification by Simon Fowler <simon@dreamcraft.com.au>, 2003-05-30.

View file

@ -1,21 +1,16 @@
#define _GNU_SOURCE
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <ctype.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <dirent.h> #include <dirent.h>
#include "wmacpi.h" #include "libacpi.h"
#define MAXBATT 8
#ifdef ACPI
#ifdef PRO
extern char *state[]; extern char *state[];
#endif
extern APMInfo *apminfo; extern APMInfo *apminfo;
static char batteries[MAXBATT][128];
static char battinfo[MAXBATT][128];
int batt_count;
/* temp buffer */ /* temp buffer */
char buf[512]; char buf[512];
@ -29,7 +24,9 @@ int power_init(void)
char buf[4096]; char buf[4096];
DIR *battdir; DIR *battdir;
struct dirent *batt; struct dirent *batt;
char *name; char *name, *tmp1, *tmp2;
char *names[MAXBATT];
int i, j;
int acpi_ver = 0; int acpi_ver = 0;
if (!(acpi = fopen("/proc/acpi/info", "r"))) { if (!(acpi = fopen("/proc/acpi/info", "r"))) {
@ -40,7 +37,7 @@ int power_init(void)
/* okay, now see if we got the right version */ /* okay, now see if we got the right version */
fread(buf, 4096, 1, acpi); fread(buf, 4096, 1, acpi);
acpi_ver = strtol(buf + 25, NULL, 10); acpi_ver = strtol(buf + 25, NULL, 10);
eprint(1, "ACPI version detected: %d\n", acpi_ver); eprint(0, "ACPI version detected: %d\n", acpi_ver);
if (acpi_ver < 20020214) { if (acpi_ver < 20020214) {
fprintf(stderr, "This version requires ACPI subsystem version 20020214\n"); fprintf(stderr, "This version requires ACPI subsystem version 20020214\n");
fclose(acpi); fclose(acpi);
@ -58,149 +55,373 @@ int power_init(void)
return 1; return 1;
} }
while ((batt = readdir(battdir))) { while ((batt = readdir(battdir))) {
/* there's a serious problem with this code when there's
* more than one battery: the readdir won't return the
* entries in sorted order, so battery one won't
* necessarily be the first one returned. So, we need
* to sort them ourselves before adding them to the
* batteries array. */
name = batt->d_name; name = batt->d_name;
/* skip . and .. */ /* skip . and .. */
if (!strncmp(".", name, 1) || !strncmp("..", name, 2)) if (!strncmp(".", name, 1) || !strncmp("..", name, 2))
continue; continue;
sprintf(batteries[batt_count], "/proc/acpi/battery/%s/state", name); names[batt_count] = strdup(name);
sprintf(battinfo[batt_count], "/proc/acpi/battery/%s/info", name);
eprint(1, "battery detected at %s\n", batteries[batt_count]);
batt_count++; batt_count++;
} }
closedir(battdir); closedir(battdir);
/* A nice quick insertion sort, ala CLR. */
for (i = 1; i < batt_count; i++) {
tmp1 = names[i];
j = i - 1;
while ((j >= 0) && ((strcmp(tmp1, names[j])) < 0)) {
tmp2 = names[j+1];
names[j+1] = names[j];
names[j] = tmp2;
}
}
for (i = 0; i < batt_count; i++) {
snprintf(batteries[i].name, MAX_NAME, "%s", names[i]);
snprintf(batteries[i].info_file, MAX_NAME,
"/proc/acpi/battery/%s/info", names[i]);
snprintf(batteries[i].state_file, MAX_NAME,
"/proc/acpi/battery/%s/state", names[i]);
eprint(0, "battery detected at %s\n", batteries[i].info_file);
fprintf(stderr, "found battery %s\n", names[i]);
}
/* tell user some info */ /* tell user some info */
eprint(1, "%d batteries detected\n", batt_count); eprint(0, "%d batteries detected\n", batt_count);
fprintf(stderr, "wmacpi: found %d batter%s\n", batt_count, fprintf(stderr, "wmacpi: found %d batter%s\n", batt_count,
(batt_count == 1) ? "y" : "ies"); (batt_count == 1) ? "y" : "ies");
return 0; return 0;
} }
int acpi_get_design_cap(int battery) char *get_value(char *string)
{ {
FILE *acpi; char *retval;
char *ptr; int i;
int design_cap;
if (battery > MAXBATT) if (string == NULL)
return -1; return NULL;
if (!(acpi = fopen(battinfo[battery], "r"))) i = 0;
return -1; while (string[i] != ':') i++;
while (!isalnum(string[i])) i++;
retval = (string + i);
fread(buf, 512, 1, acpi); return retval;
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) power_state_t get_power_status(void)
{ {
FILE *acpi; FILE *file;
char *ptr; char buf[1024];
char stat; char *val;
static int dcap = 0xdeadbeef; if ((file = fopen("/proc/acpi/ac_adapter/AC/state", "r")) == NULL) {
perror("Could not open /proc/acpi/ac_adapter/AC/state\n");
int percent = 100; /* battery percentage */ return PS_ERR;
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"))) fgets(buf, 1024, file);
fclose(file);
val = get_value(buf);
if ((strncmp(val, "on-line", 7)) == 0)
return AC;
else
return BATT;
}
int get_battery_info(int batt_no)
{
FILE *file;
battery *info = &batteries[batt_no];
char buf[1024];
char *entry;
int buflen;
char *val;
if ((file = fopen(info->info_file, "r")) == NULL) {
/* this is cheating, but string concatenation should work . . . */
fprintf(stderr, "Could not open %s:", info->info_file );
perror(NULL);
return 0;
}
/* grab the contents of the file */
buflen = fread(buf, sizeof(buf), 1, file);
fclose(file);
/* check to see if battery is present */
entry = strstr(buf, "present:");
val = get_value(entry);
if ((strncmp(val, "yes", 3)) == 0) {
info->present = 1;
} else {
eprint(0, "Battery %s not present\n", info->name);
info->present = 0;
return 0;
}
/* get design capacity
* note that all these integer values can also contain the
* string 'unknown', so we need to check for this. */
entry = strstr(buf, "design capacity:");
val = get_value(entry);
if (val[0] == 'u')
info->design_cap = -1;
else
info->design_cap = strtoul(val, NULL, 10);
/* get last full capacity */
entry = strstr(buf, "last full capacity:");
val = get_value(entry);
if (val[0] == 'u')
info->last_full_cap = -1;
else
info->last_full_cap = strtoul(val, NULL, 10);
/* get design voltage */
entry = strstr(buf, "design voltage:");
val = get_value(entry);
if (val[0] == 'u')
info->design_voltage = -1;
else
info->design_voltage = strtoul(val, NULL, 10);
if ((file = fopen(info->state_file, "r")) == NULL) {
fprintf(stderr, "Could not open %s:", info->state_file );
perror(NULL);
return 0;
}
/* grab the file contents */
buflen = fread(buf, sizeof(buf), 1, file);
fclose(file);
/* check to see if battery is present */
entry = strstr(buf, "present:");
val = get_value(entry);
if ((strncmp(val, "yes", 3)) == 0) {
info->present = 1;
} else {
info->present = 0;
eprint(1, "Battery %s no longer present\n", info->name);
return 0;
}
/* get capacity state
* note that this has only two values (at least, in the 2.4.21-rc2
* source code) - ok and critical. */
entry = strstr(buf, "capacity state:");
val = get_value(entry);
if ((strncmp(val, "ok", 2)) == 0)
info->capacity_state = OK;
else
info->capacity_state = CRITICAL;
/* get charging state */
entry = strstr(buf, "charging state:");
val = get_value(entry);
if ((strncmp(val, "discharging", 10)) == 0)
info->charging = 0;
else
info->charging = 1;
/* get current rate of burn
* note that if it's on AC, this will report 0 */
entry = strstr(buf, "present rate:");
val = get_value(entry);
if (val[0] == 'u') {
info->present_rate = -1;
} else {
int rate;
rate = strtoul(val, NULL, 10);
if (rate != 0)
info->present_rate = rate;
}
/* get remaining capacity */
entry = strstr(buf, "remaining capacity:");
val = get_value(entry);
if (val[0] == 'u')
info->remaining_cap = -1;
else
info->remaining_cap = strtoul(val, NULL, 10);
/* get current voltage */
entry = strstr(buf, "present voltage:");
val = get_value(entry);
if (val[0] == 'u')
info->present_voltage = -1;
else
info->present_voltage = strtoul(val, NULL, 10);
return 1;
}
/*
* 2003-7-1.
* In order to make this code more convenient for things other than
* just plain old wmacpi-ng I'm breaking the basic functionality
* up into several chunks: collecting and collating info for a
* single battery, calculating the global info (such as rtime), and
* some stuff to provide a similar interface to now.
*/
void acquire_batt_info(int batt)
{
float rcap, lfcap;
battery *binfo;
get_battery_info(batt);
binfo = &batteries[batt];
if (!binfo->present) {
binfo->percentage = 0;
binfo->valid = 0;
binfo->charge_time = 0;
apminfo->rtime = 0;
return; 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" /* calculate the percentage remaining, using the values of
* using battery remaining capacity, and battery "rate" (3.9.3) */ * remaining capacity and last full capacity, as outlined in
if ((ptr = strstr(buf, "present rate"))) { * the ACPI spec v2.0a, section 3.9.3. */
ptr += 25; {
sscanf(ptr, "%d", &rate); rcap = (float)binfo->remaining_cap;
eprint(1, "rate: %d\n", rate); lfcap = (float)binfo->last_full_cap;
if (rate <= 0) if (rcap <= 0)
rate = 0; rcap = 0;
/* time remaining in minutes */ if (lfcap <= 0)
rtime = ((float)((float)ptemp / (float)rate)) * 60; lfcap = 1;
if (rtime <= 0) binfo->percentage = (int)((rcap/lfcap) * 100.0);
rtime = 0; eprint(0, "percent: %d\n", binfo->percentage);
eprint(1, "time rem: %d\n", rtime);
} }
apminfo->rtime = rtime;
if ((ptr = strstr(buf, "charging state"))) { /* set the battery's capacity state, based (at present) on some
/* found battery discharging. This is used to determine if * guesstimated values: more than 75% == HIGH, 25% to 75% MED, and
* we are on AC power or not. Notice check for "ch" later on */ * less than 25% is LOW. Less than apminfo->crit_level is CRIT. */
stat = *(ptr + 25); if (binfo->percentage > 75)
if (stat == 'o' || stat == 'u') /* "ok" | "unknown" : charged, on ac power */ binfo->state = HIGH;
apminfo->power = POWER; else if (binfo->percentage > 25)
else binfo->state = MED;
/* we set this, and later on use percentage else
* value to determine high/med/low */ /* we only go to critical state if the battery is reporting
apminfo->power = HIGH; * critical itself . . . */
binfo->state = LOW;
/* but if we are on power, we might be charging too. Check. */ /* we need to /know/ that we've got a valid state for the
if ((ptr = strstr(buf, "charging state"))) { * apminfo->power value . . . .*/
/* found battery charging line. We will change power state apminfo->power = get_power_status();
* if we are on power, and charging. */
stat = *(ptr + 25); if ((apminfo->power != AC) && !binfo->charging) {
/* this is seriously stupid - but we catch "critical" */ /* we're not on power, and not charging. So we might as well
if (stat == 'c' && (*(ptr + 26) == 'h')) * check if we're at a critical battery level, and calculate
apminfo->power = CHARGING; * other interesting stuff . . . */
if (binfo->capacity_state == CRITICAL) {
eprint(1, "Received critical battery status");
apminfo->power = CRIT;
} }
} }
/* we are not on power, and not charging. So, it would make sense if (binfo->charging) {
* to check if battery is "critical low", and calculate interesting /* calculate remaining time until the battery is charged.
* things like battery HIGH/LOW, and maybe battery usage LOAD * when charging, the battery state file reports the
* This will be replaced with some code to allow setting user-specified * current being used to charge the battery. We can use
* low / critical alarms */ * this and the remaining capacity to work out how long
if ((apminfo->power != POWER) && (apminfo->power != CHARGING)) { * until it reaches the last full capacity of the battery.
eprint(1, "entering battery status check"); * XXX: make sure this is actually portable . . . */
if ((ptr = strstr(buf, "capacity state"))) { lfcap = (float)binfo->last_full_cap;
stat = *(ptr + 25); rcap = (float)binfo->remaining_cap;
/* only check "c" here because we already caught "CHarging" earlier
* and also look into crit_level */ binfo->charge_time = (int)(((lfcap - rcap)/binfo->present_rate) * 60.0);
if (stat == 'c' || (apminfo->percentage <= apminfo->crit_level)) { } else
/* nothing else to do here - critical battery. get out */ if (binfo->charge_time)
eprint(1, "Received critical battery status"); binfo->charge_time = 0;
apminfo->power = CRIT;
/* and finally, we tell anyone who wants to use this information
* that it's now valid . . .*/
binfo->valid = 1;
}
void acquire_all_batt_info(void)
{
int i;
for(i = 0; i < batt_count; i++)
acquire_batt_info(i);
}
void acquire_global_info(void)
{
int i;
int rtime;
float rcap = 0;
float rate = 0;
static float rate_samples[SAMPLES];
static int j = 0;
static int sample_count = 0;
static int n = 0;
/* calculate the time remaining, using the battery's remaining
* capacity and the reported burn rate (3.9.3).
* For added accuracy, we average the value over the last
* SAMPLES number of calls, or for anything less than this we
* simply report the raw number. */
{
for (i = 0; i < batt_count; i++) {
if (batteries[i].present && batteries[i].valid) {
rcap += (float)batteries[i].remaining_cap;
rate += (float)batteries[i].present_rate;
} }
} }
} rate_samples[j] = rate;
process_plugin_timer(); j++, sample_count++;
j = j % SAMPLES;
eprint(1, "current state: %s (%d)", state[apminfo->power], apminfo->power); /* for the first SAMPLES number of calls we calculate the
* average based on sample_count, then we use SAMPLES to
* calculate the rolling average. */
/* when this fails, n should be equal to SAMPLES. */
if (sample_count < SAMPLES)
n++;
for (i = 0, rate = 0; i < n; i++)
rate += rate_samples[i];
rate = rate/n;
if ((rcap < 1) || (rate < 1)) {
rtime = 0;
goto out;
}
if (rate <= 0)
rate = 1;
/* time remaining in minutes */
rtime = (int)((rcap/rate) * 60.0);
if(rtime <= 0)
rtime = 0;
out:
eprint(0, "time rem: %d\n", rtime);
apminfo->rtime = rtime;
}
/* get the power status.
* note that this is actually reported seperately from the
* battery info, under /proc/acpi/ac_adapter/AC/state */
apminfo->power = get_power_status();
}
void acquire_all_info(void)
{
acquire_all_batt_info();
acquire_global_info();
} }
#endif /* ACPI */

118
wmacpi/libacpi.h Normal file
View file

@ -0,0 +1,118 @@
#ifndef _LIBACPI_H_
#define _LIBACPI_H_
#define LIBACPI_VER "0.50"
/* Here because we need it for definitions in this file . . . */
#define MAX_NAME 128
#define MAXBATT 8
#define SAMPLES 50
typedef enum {
REMAIN,
TIMER
} DspMode;
typedef enum {
BLINK,
OFF
} Mode;
typedef enum {
AC,
BATT,
PS_ERR,
} power_state_t;
typedef enum {
HIGH,
MED,
LOW,
CRIT,
} batt_state_t;
typedef enum {
OK,
CRITICAL,
} cap_state_t;
typedef struct {
/* general info */
char name[MAX_NAME];
/* these two are conveniences */
char info_file[MAX_NAME];
char state_file[MAX_NAME];
int present;
int design_cap; /* assuming mAh */
int last_full_cap;
int design_voltage; /* in mV */
/* state info */
cap_state_t capacity_state;
int charging;
int present_rate; /* in mAh */
int remaining_cap; /* in mAh */
int present_voltage; /* in mV */
/* calculated states */
batt_state_t state;
int percentage; /* stored here because this is a per battery thing */
int charge_time; /* time left to charge this battery */
/* and a flag to indicate that this is valid . . . */
int valid;
} battery;
typedef struct {
power_state_t power; /* On AC or not? */
int rtime; /* remaining time */
int timer; /* how long been on battery? */
int crit_level; /* anything below this is critical low */
battery *binfo; /* pointer to the battery being monitored */
} APMInfo;
/*
* 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 . . .
*/
/*
* To provide a convenient debugging function . . .
*/
static int verbosity = 0;
#define eprint(level, fmt, arg...) \
do { \
if (level > verbosity) { \
switch (level) { \
case 0: \
break; \
case 1: \
fprintf(stderr, fmt, ##arg); \
break; \
default: \
fprintf(stderr, "%s: " fmt, __FUNCTION__, ##arg); \
fprintf(stderr, "\n"); \
break; \
} \
} \
} while (0)
/* since these /are/ needed here . . . */
battery batteries[MAXBATT];
int batt_count;
/* check if apm/acpi is enabled, etc */
int power_init(void);
/* fill APMInfo with data */
void acquire_batt_info(int);
void acquire_all_batt_info(void);
void acquire_global_info(void);
void acquire_all_info(void);
#endif /* _WMACPI_H_ */

View file

@ -1,91 +0,0 @@
#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 */

View file

@ -1,6 +1,6 @@
/* XPM */ /* XPM */
static char * master_xpm[] = { static char * master_xpm[] = {
"157 88 116 2", "157 88 100 2",
" c None", " c None",
". c #000000", ". c #000000",
"+ c #FF0000", "+ c #FF0000",
@ -97,26 +97,10 @@ static char * master_xpm[] = {
".. c #20B2AE", ".. c #20B2AE",
"+. c #004941", "+. c #004941",
"@. c #188A86", "@. c #188A86",
"#. c #DAF5B2", "#. c #22B2AE",
"$. c #355600", "$. c #107D79",
"%. c #FEFFFF", "%. c #027E72",
"&. c #AAAFA9", "&. c #034A40",
"*. 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 ", " . + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 1 2 % 3 4 5 6 % 7 8 9 0 % a b c d % e f g h ",
@ -147,61 +131,61 @@ static char * master_xpm[] = {
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
" . % % ......% % % +.+.+.@.% @.......@.% @.......@.% @.+.+.+.@.% @.......@.% @.......@.% @.......@.% @.......@.% @.......@.% % ..% % % % % % % ", " . % % ......% % % +.+.+.@.% @.......@.% @.......@.% @.+.+.+.@.% @.......@.% @.......@.% @.......@.% @.......@.% @.......@.% % ..% % % % % % % ",
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % ..% ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % ..% ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . #.$.$.. %.%.%.%.%.%.%.%.%.&.% ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% % ..% ..% % % @.% ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% % ..% ..% % % @.% ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` . % @.+.+.+.@.% % +.+.+.@.% @.......@.% % ......@.% @.......@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % ..% % % % % % ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % @.+.+.+.@.% % +.+.+.@.% @.......@.% % ......@.% @.......@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % ..% % % % % % ",
" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% % ..% ..% % % % % ", " . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` % % % % % % % % % +.+.+.+.% % % ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% % ..% ..% % % % % ",
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . . . . . %.=.=.=.=.=.=.=.=.&.% ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% ..% ..% % ..% -.;.;. ", " . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % % % % % % % % +.% % % % +.% % ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% ..% ..% % ..% ",
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . %.%.%.%.%.=.=.=.=.=.=.=.=.&.% ` . % % ......% % % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % % ..% % % @.% ;.;.;. ", " . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % #.#.#.#.% % % +.% % % % +.% % ` . % % ......% % % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % % ..% % % @.% ",
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ;.;.>. ", " . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . ", " . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . ",
" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . . . . . . . . . . . . . . . . ` . . . . . . . . . . . . . . . . ` ", " . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` % #.% % % #.% % % +.+.+.+.% % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . . . . . . . . . . . . . . . . ` . . . . . . . . . . . . . . . . ` ",
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % % ..........% % % % ....................% % % @.% % ......% % % ......% % % ..% % % % . ,.'.'.. ).).).).).).).).).!.% ` . #.$.$.. %.%.%.%.%.%.%.%.%.&.% ` ", " . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.#.#.#.% % % +.% % % % +.% % ` . % % % % % % ..........% % % % ....................% % % @.% % ......% % % ......% % % ..% % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % ..% % % % ......% % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% . '.~.{.. ).].].].].].].].].!.% ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` ", " . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % % % ..% % % % ......% % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % ..% % % % ..% % % % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % . '.{.{.. ).].].].].].].].].!.% ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` ", " . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % % % ..% % % % ..% % % % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % % % % % % % % % % +.+.+.+.$.% % ` % % % % % % % % $.........@.% % ` ",
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % ......% % % % ..% % % % ..% % % % % % % % ....% % @.% @.+.+.+.@.% @.+.+.+.@.% % % ..% % % . . . . . ).].].].].].].].].!.% ` . . . . . %.=.=.=.=.=.=.=.=.&.% ` ", " . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % ......% % % % ..% % % % ..% % % % % % % % ....% % @.% @.+.+.+.@.% @.+.+.+.@.% % % ..% % % % % % % % % % % +.% % % % ..% % ` % % % % % % % % +.% % % % ..% % ` ",
" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % ..% % ..% % % % ......% % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % . ).).).).).].].].].].].].].!.% ` . %.%.%.%.%.=.=.=.=.=.=.=.=.&.% ` ", " . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` % #.#.#.#.% % % % +.+.+.+.% % % ` . % % ..% % ..% % % % ......% % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % % #.#.#.#.% % % +.% % % % ..% % ` % #.#.#.#.% % % +.% % % % ..% % ` ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . %.&.&.&.&.&.&.&.&.&.&.&.&.&.% ` . % ..% % % % ..........% % % % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % % ..........% % % % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % +.% % % % ..% % ` ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . . . . . . . . . . . . . . . % ` . % ..% % % % % % % % % % % % % ....................% % % @.% % ......% % % ......% % % % % ..% % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % % % % % % % % % % % ....................% % % @.% % ......% % % ......% % % % % ..% % % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % +.% % % % ..% % ` ",
" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % #.% % % #.% % % +.+.+.+.$.% % ` % #.% % % #.% % $.........$.% % ` ",
" . . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", " . % #.#.#.#.% % % +.% % % % ..% % ` % #.#.#.#.% % % ..% % % % +.% % ` ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % ..% % % % +.% % ` ",
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % % % % % +.+.+.+.+.% % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % +.% % % % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % % % % % +.+.+.+.+.% % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % +.% % % % % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % ..% % % % +.% % ` ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.+.+.% % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.+.+.% % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % ..% % % % +.% % ` ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.% % % % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.% % % % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % % #.#.#.#.% % % % +.+.+.+.$.% % ` % #.#.#.#.% % % $.........$.% % ` ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % +.+.+.% % % % +.% % % % +.% % % % % % % % +.+.% % % % % +.+.+.% % % +.+.+.% % % % +.% % % . ).!.!.!.!.!.!.!.!.!.!.!.!.!.% ` . %.&.&.&.&.&.&.&.&.&.&.&.&.&.% ` ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % +.+.+.% % % % +.% % % % +.% % % % % % % % +.+.% % % % % +.+.+.% % % +.+.+.% % % % +.% % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % +.% % +.% % % % +.+.+.% % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % . . . . . . . . . . . . . . . % ` . . . . . . . . . . . . . . . % ` ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % +.% % +.% % % % +.+.+.% % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % +.% % % % +.+.+.+.+.% % % % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % +.% % % % +.+.+.+.+.% % % % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % +.% % % % % % % % % % % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % % % +.% % ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % +.% % % % % % % % % % % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % % % +.% % ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % ^.^.^.% % % % % % /.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % % % % % % % % ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % #.#.#.% % % % % % %.% %.#.#.#.%.% %.#.#.#.%.% %.% % % %.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% % % % % % % % % % % % % % % % % % % ",
" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % ^.% % % ^.% % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % % % % % % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % % % % % % % % % % % % % % % ", " ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % #.% % % #.% % % % % #.% % % % % #.% % % % % #.% #.% % % #.% #.% % % % % #.% % % % % % % % % #.% #.% % % #.% #.% % % #.% % % % % % % % % % % % % % % % % % % ",
" . % ^.% % % ^.% % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % % % % % % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % % % % % % % % % % % % % % % ", " . % #.% % % #.% % % % % #.% % % % % #.% % % % % #.% #.% % % #.% #.% % % % % #.% % % % % % % % % #.% #.% % % #.% #.% % % #.% % % % % % % % % % % % % % % % % % % ",
" . % /.% % % /.% % % % % /.% /.^.^.^./.% % ^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% % % % % /.% (.^.^.^.(.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % % ", " . % %.% % % %.% % % % % %.% %.#.#.#.%.% % #.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% % % % % %.% &.#.#.#.&.% %.#.#.#.%.% %.#.#.#.%.% % % % % % % % % % % % % ",
" . % ^.% % % ^.% % % % % ^.% ^.% % % % % % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% % % % % % % % % % % % % % % % % % % ", " . % #.% % % #.% % % % % #.% #.% % % % % % % % % #.% % % % % #.% % % % % #.% #.% % % #.% % % % % #.% #.% % % #.% % % % % #.% % % % % % % % % % % % % % % % % % % ",
" . % ^.% % % ^.% % % % % ^.% ^.% % % % % % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% % % % % % % % % % % % % % % % % % % ", " . % #.% % % #.% % % % % #.% #.% % % % % % % % % #.% % % % % #.% % % % % #.% #.% % % #.% % % % % #.% #.% % % #.% % % % % #.% % % % % % % % % % % % % % % % % % % ",
". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % ^.^.^.% % % % % % ^.% /.^.^.^./.% /.^.^.^./.% % % % % /.% /.^.^.^./.% /.^.^.^./.% % % % % /.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % % % % % % ^.% ", ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % #.#.#.% % % % % % #.% %.#.#.#.%.% %.#.#.#.%.% % % % % %.% %.#.#.#.%.% %.#.#.#.%.% % % % % %.% %.#.#.#.%.% %.#.#.#.%.% % % % % % % % % % % % % % % % % #.% ",
" % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", " % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", "% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
"% (.^.^.^.(.% /.^.^.^.% % /.^.^.^./.% /.^.^.^.% % /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% % % /.% % % % % % % /.% /.% % % /.% /.% % % % % ^.% % % ^.% /.^.^.^.% % /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% /.% % % /.% /.% % % /.% /.% % % /.% /.% % % /.% /.^.^.^./.% ", "% &.#.#.#.&.% %.#.#.#.% % %.#.#.#.%.% %.#.#.#.% % %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.% % % %.% % % %.% % % % % % % %.% %.% % % %.% %.% % % % % #.% % % #.% %.#.#.#.% % %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.% % % %.% %.% % % %.% %.% % % %.% %.% % % %.% %.% % % %.% %.#.#.#.%.% ",
"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % % % ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % % ^.% ^.% % % % % ^.^.% ^.^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % ^.% ", "% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % % % #.% % % #.% % % #.% % % % % % % #.% #.% % % #.% #.% % % % % #.#.% #.#.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % % % #.% % % #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% % % % % #.% ",
"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % % % ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % ^.(.% ^.% % % % % ^.% ^.% ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% (.^.% ^.(.% ^.% % % ^.% % % % ^.(.% ", "% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % % % #.% % % #.% % % #.% % % % % % % #.% #.% % #.&.% #.% % % % % #.% #.% #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % % % #.% % % #.% % % #.% #.% % % #.% #.% % % #.% &.#.% #.&.% #.% % % #.% % % % #.&.% ",
"% /.^.^.^./.% /.^.^.^.% % /.% % % % % /.% % % /.% /.^.^.^.% % /.^.^.^.% % /.(.^.^./.% /.^.^.^./.% % % /.% % % % % % % /.% /.^.^.(.% % /.% % % % % /.% % % /.% /.% % % /.% /.% % % /.% /.^.^.^./.% /.^.% % /.% /.^.^.^.% % /.^.^.^./.% % % /.% % % /.% % % /.% /.% % % /.% /.% % % /.% % (.^.(.% % /.^.^.^./.% % (.^.(.% % ", "% %.#.#.#.%.% %.#.#.#.% % %.% % % % % %.% % % %.% %.#.#.#.% % %.#.#.#.% % %.&.#.#.%.% %.#.#.#.%.% % % %.% % % % % % % %.% %.#.#.&.% % %.% % % % % %.% % % %.% %.% % % %.% %.% % % %.% %.#.#.#.%.% %.#.% % %.% %.#.#.#.% % %.#.#.#.%.% % % %.% % % %.% % % %.% %.% % % %.% %.% % % %.% % &.#.&.% % %.#.#.#.%.% % &.#.&.% % ",
"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % ^.% ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % ^.(.% ^.% % % % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% ^.% ^.% ^.% % % ^.% % % % % ^.% % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% ^.% ^.% (.^.% ^.(.% % % % % ^.% (.^.% % % % ", "% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % #.% #.% % % #.% % % #.% % % % % % % #.% #.% % #.&.% #.% % % % % #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % #.% #.% #.% #.% % % #.% % % % % #.% % % #.% % % #.% % % #.% #.% % % #.% #.% #.% #.% &.#.% #.&.% % % % % #.% &.#.% % % % ",
"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % ^.% ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % ^.^.% ^.% % % ^.% % % % % ^.% % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.^.% ^.^.% ^.% % % ^.% % % % % ^.% ^.% % % % % ", "% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % #.% #.% % % #.% % % #.% % % % % % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % #.% % #.#.% #.% % % #.% % % % % #.% % % #.% % % #.% % % #.% #.% % % #.% #.#.% #.#.% #.% % % #.% % % % % #.% #.% % % % % ",
"% /.% % % /.% /.^.^.^.% % /.^.^.^./.% ^.^.^.^.% % /.^.^.^./.% ^.% % % % % /.^.^.^./.% /.% % % /.% % % ^.% % % /.^.^.^./.% /.% % % /.% /.^.^.^.(.% /.% % % /.% ^.% % % ^.% /.^.^.^./.% /.% % % % % /.^.^.^./.% /.% % % /.% /.^.^.^./.% % % /.% % % (.^.^.^.^.% % ^.^.^.% % ^.% % % ^.% /.% % % ^.% /.^.^.^./.% /.^.^.^./.% ", "% %.% % % %.% %.#.#.#.% % %.#.#.#.%.% #.#.#.#.% % %.#.#.#.%.% #.% % % % % %.#.#.#.%.% %.% % % %.% % % #.% % % %.#.#.#.%.% %.% % % %.% %.#.#.#.&.% %.% % % %.% #.% % % #.% %.#.#.#.%.% %.% % % % % %.#.#.#.%.% %.% % % %.% %.#.#.#.%.% % % %.% % % &.#.#.#.#.% % #.#.#.% % #.% % % #.% %.% % % #.% %.#.#.#.%.% %.#.#.#.%.% ",
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", "% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", "% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
"% % ........% % % +.+.+.+._.% _.........@.% _........._.% _.+.+.+.+._.% _........._.% _.........@.% _........._.% _.........@.% _.........@.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % % ^.+.+.+.^.% ", "% % ........% % % +.+.+.+.$.% $.........@.% $.........$.% $.+.+.+.+.$.% $.........$.% $.........@.% $.........$.% $.........@.% $.........@.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % % #.+.+.+.#.% ",
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ^.% ^.% ^.+.% ", "% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % #.% #.% #.+.% ",
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % +.^.% ^.% +.% ", "% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % +.#.% #.% +.% ",
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% ^.% ^.+.% ", "% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% #.% #.+.% ",
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.^.% ^.% ^.% ", "% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.#.% #.% #.% ",
"% _.+.+.+.+._.% % +.+.+.+._.% _........._.% _........._.% _........._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % % % % % _.+.+.+.+._.% _.+.+.+.+._.% % % % % _.+.+.+.+._.% _.+.+.+.+._.% % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ^.+.+.+.^.% % ", "% $.+.+.+.+.$.% % +.+.+.+.$.% $.........$.% $.........$.% $.........$.% $.........$.% $.........$.% % +.+.+.+.$.% $.........$.% $.........$.% % % % % % $.+.+.+.+.$.% $.+.+.+.+.$.% % % % % $.+.+.+.+.$.% $.+.+.+.+.$.% % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % #.+.+.+.#.% % ",
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% % % % +.% ", "% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% % % % +.% ",
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ^.^.^.^.^.+.% ", "% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % #.#.#.#.#.+.% ",
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ^.% % % ^.^.% ", "% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % #.% % % #.#.% ",
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ^.% % % ^.^.% ", "% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % #.% % % #.#.% ",
"% % ........% % % +.+.+.+._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ^.^.^.^.^.% % ", "% % ........% % % +.+.+.+.$.% $.........$.% $.........$.% % +.+.+.+.$.% $.........$.% $.........$.% % +.+.+.+.$.% $.........$.% $.........$.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % #.#.#.#.#.% % ",
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % "}; "% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % "};

View file

@ -1,6 +1,6 @@
/* XPM */ /* XPM */
static char * master_xpm[] = { static char * master_low_xpm[] = {
"157 88 20 1", "157 88 18 1",
" c None", " c None",
". c #000000", ". c #000000",
"+ c #FF0000", "+ c #FF0000",
@ -14,13 +14,11 @@ static char * master_xpm[] = {
"- c #20B2AE", "- c #20B2AE",
"; c #004941", "; c #004941",
"> c #188A86", "> c #188A86",
", c #D0D2D1", ", c #22B2AE",
"' c #FEFFFF", "' c #C7C7C7",
") c #4F5354", ") c #107D79",
"! c #22B2AE", "! c #027E72",
"~ c #027E72", "~ c #034A40",
"{ c #034A40",
"] c #107D79",
" . ++++@++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ", " . ++++@++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ",
" . ++++@++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ", " . ++++@++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ",
" . ++++@++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ", " . ++++@++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ",
@ -51,61 +49,61 @@ static char * master_xpm[] = {
" . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ", " . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
" . @@---@@@;;;>@>--->@>--->@>;;;>@>--->@>--->@>--->@>--->@>--->@@-@@@@@@@ ", " . @@---@@@;;;>@>--->@>--->@>;;;>@>--->@>--->@>--->@>--->@>--->@@-@@@@@@@ ",
" ..................................... ................= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@-@-@-@@-@ ", " ..................................... ................= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@-@-@-@@-@ ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= .,**.'''''''''=@= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@@-@-@@@>@ ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@@-@-@@@>@ ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= .***.',,,,,,,,=@= . @>;;;>@@;;;>@>--->@@--->@>--->@>--->@>--->@@;;;>@>--->@>--->@@@-@@@@@@ ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @>;;;>@@;;;>@>--->@@--->@>--->@>--->@>--->@@;;;>@>--->@>--->@@@-@@@@@@ ",
" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= .***.',,,,,,,,=@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@@-@-@@@@@ ", " .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= @@@@@@@@@;;;;@@@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@@-@-@@@@@ ",
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .....',,,,,,,,=@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@-@-@-@@-@ ,++ ", " .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @@@@@@@@;@@@@;@@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@-@-@-@@-@ ",
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .''''',,,,,,,,=@= . @@---@@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@@@-@@@>@ +++ ", " .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @,,,,@@@;@@@@;@@= . @@---@@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@@@-@@@>@ ",
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +++ ", " .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . ", " .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . ",
" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= .',,,,,,,,,,,,=@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ................= ................= ", " .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= @,@@@,@@@;;;;@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ................' ................' ",
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@@-----@@@ @----------@@ @>@@---@@@---@@@-@@@@ .,$$.))))))))))@= .,**.'''''''''=@= ", " .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,,,,@@@;@@@@;@@= . @@@@@@-----@@@ @----------@@ @>@@---@@@---@@@-@@@@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ",
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@-@@@@---@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ .$$$.),,,,,,,,=@= .***.',,,,,,,,=@= ", " .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@@@-@@@@---@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ",
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@-@@@@-@@@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ .$$$.),,,,,,,,=@= .***.',,,,,,,,=@= ", " .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@@@-@@@@-@@@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ @@@@@@@@@;;;;)@@' @@@@@@@@)---->@@' ",
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@---@@@@-@@@ @-@@@@@@@@--@ @>@>;;;>@>;;;>@@@-@@@ .....),,,,,,,,=@= .....',,,,,,,,=@= ", " .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@---@@@@-@@@ @-@@@@@@@@--@ @>@>;;;>@>;;;>@@@-@@@ @@@@@@@@;@@@@-@@' @@@@@@@@;@@@@-@@' ",
" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= .',,,,,,,,,,,,=@= . @@-@@-@@@@---@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ .))))),,,,,,,,=@= .''''',,,,,,,,=@= ", " .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= @,,,,@@@@;;;;@@@= . @@-@@-@@@@---@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ @,,,,@@@;@@@@-@@' @,,,,@@@;@@@@-@@' ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= .'=============@= . @-@@@@-----@@@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @-@@@@-----@@@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ @,@@@,@@;@@@@-@@' @,@@@,@@;@@@@-@@' ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= ...............@= . @-@@@@@@@@@@@@ @----------@@ @>@@---@@@---@@@@@-@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @-@@@@@@@@@@@@ @----------@@ @>@@---@@@---@@@@@-@@ @,@@@,@@;@@@@-@@' @,@@@,@@;@@@@-@@' ",
" ===================================== ================= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", " ===================================== ================= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @,@@@,@@@;;;;)@@' @,@@@,@@)----)@@' ",
" . .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", " . @,,,,@@@;@@@@-@@' @,,,,@@@-@@@@;@@' ",
" . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", " . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @,@@@,@@;@@@@-@@' @,@@@,@@-@@@@;@@' ",
" ........................................................ . @@@@@@;;;;;@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@;@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", " ........................................................ . @@@@@@;;;;;@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@;@@@@ @,@@@,@@;@@@@-@@' @,@@@,@@-@@@@;@@' ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;;;@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;;;@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ @,@@@,@@;@@@@-@@' @,@@@,@@-@@@@;@@' ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;@@@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;@@@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ @,,,,@@@@;;;;)@@' @,,,,@@@)----)@@' ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@;;;@@@@;@@@ @;@@@@@@@@;;@ @@@@;;;@@@;;;@@@@;@@@ .)=============@= .'=============@= ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@;;;@@@@;@@@ @;@@@@@@@@;;@ @@@@;;;@@@;;;@@@@;@@@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@;@@;@@@@;;;@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ ...............@= ...............@= ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@;@@;@@@@;;;@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@;;;;;@@@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ ================= ================= ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@;;;;;@@@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ ''''''''''''''''' ''''''''''''''''' ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@@@@@@@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@@@;@@ ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@@@@@@@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@@@;@@ ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@ ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@ ",
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@!!!@@@@@@~@~!!!~@~!!!~@~@@@~@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@@@@@@@@@@@@@ @@@@@@ ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@,,,@@@@@@!@!,,,!@!,,,!@!@@@!@!,,,!@!,,,!@!,,,!@!,,,!@!,,,!@@@@@@@@@@@@@ @@@@@@ ",
" ======================================================== . @!@@@!@@@@@!@@@@@!@@@@@!@!@@@!@!@@@@@!@@@@@@@@@!@!@@@!@!@@@!@@@@@@@@@@@@@ @@@@@@ ", " ======================================================== . @,@@@,@@@@@,@@@@@,@@@@@,@,@@@,@,@@@@@,@@@@@@@@@,@,@@@,@,@@@,@@@@@@@@@@@@@ @@@@@@ ",
" . @!@@@!@@@@@!@@@@@!@@@@@!@!@@@!@!@@@@@!@@@@@@@@@!@!@@@!@!@@@!@@@@@@@@@@@@@ @@@@@@ ", " . @,@@@,@@@@@,@@@@@,@@@@@,@,@@@,@,@@@@@,@@@@@@@@@,@,@@@,@,@@@,@@@@@@@@@@@@@ @@@@@@ ",
" . @~@@@~@@@@@~@~!!!~@@!!!~@~!!!~@~!!!~@~!!!~@@@@@~@{!!!{@~!!!~@~!!!~@@@@@@@ @@@@@@ ", " . @!@@@!@@@@@!@!,,,!@@,,,!@!,,,!@!,,,!@!,,,!@@@@@!@~,,,~@!,,,!@!,,,!@@@@@@@ @@@@@@ ",
" . @!@@@!@@@@@!@!@@@@@@@@@!@@@@@!@@@@@!@!@@@!@@@@@!@!@@@!@@@@@!@@@@@@@@@@@@@ @@@@@@ ", " . @,@@@,@@@@@,@,@@@@@@@@@,@@@@@,@@@@@,@,@@@,@@@@@,@,@@@,@@@@@,@@@@@@@@@@@@@ @@@@@@ ",
" . @!@@@!@@@@@!@!@@@@@@@@@!@@@@@!@@@@@!@!@@@!@@@@@!@!@@@!@@@@@!@@@@@@@@@@@@@ @@@@@@ ", " . @,@@@,@@@@@,@,@@@@@@@@@,@@@@@,@@@@@,@,@@@,@@@@@,@,@@@,@@@@@,@@@@@@@@@@@@@ @@@@@@ ",
"................................................................. @@!!!@@@@@@!@~!!!~@~!!!~@@@@@~@~!!!~@~!!!~@@@@@~@~!!!~@~!!!~@@@@@@@@@@@@@ @@@@!@ ", "................................................................. @@,,,@@@@@@,@!,,,!@!,,,!@@@@@!@!,,,!@!,,,!@@@@@!@!,,,!@!,,,!@@@@@@@@@@@@@ @@@@,@ ",
" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ", " @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
"@{!!!{@~!!!@@~!!!~@~!!!@@~!!!~@~!!!~@~!!!~@~@@@~@@@~@@@@@@@~@~@@@~@~@@@@@!@@@!@~!!!@@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@~@@@~@~@@@~@~@@@~@~@@@~@~@@@~@~!!!~@", "@~,,,~@!,,,@@!,,,!@!,,,@@!,,,!@!,,,!@!,,,!@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@,@@@,@!,,,@@!,,,!@!,,,!@!,,,!@!,,,!@!,,,!@!,,,!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!,,,!@",
"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@@@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@!!@!!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@@@@@!@@@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@@@@@!@", "@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@@@,@@@,@@@,@@@@@@@,@,@@@,@,@@@@@,,@,,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@@@@@,@@@,@@@,@,@@@,@,@@@,@,@@@,@,@@@,@@@@@,@",
"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@@@!@@@!@@@!@@@@@@@!@!@@!{@!@@@@@!@!@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@@@@@!@@@!@@@!@!@@@!@!@@@!@{!@!{@!@@@!@@@@!{@", "@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@@@,@@@,@@@,@@@@@@@,@,@@,~@,@@@@@,@,@,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@@@@@,@@@,@@@,@,@@@,@,@@@,@~,@,~@,@@@,@@@@,~@",
"@~!!!~@~!!!@@~@@@@@~@@@~@~!!!@@~!!!@@~{!!~@~!!!~@@@~@@@@@@@~@~!!{@@~@@@@@~@@@~@~@@@~@~@@@~@~!!!~@~!@@~@~!!!@@~!!!~@@@~@@@~@@@~@~@@@~@~@@@~@@{!{@@~!!!~@@{!{@@", "@!,,,!@!,,,@@!@@@@@!@@@!@!,,,@@!,,,@@!~,,!@!,,,!@@@!@@@@@@@!@!,,~@@!@@@@@!@@@!@!@@@!@!@@@!@!,,,!@!,@@!@!,,,@@!,,,!@@@!@@@!@@@!@!@@@!@!@@@!@@~,~@@!,,,!@@~,~@@",
"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@!@!@@@!@@@!@@@@@@@!@!@@!{@!@@@@@!@@@!@!@@@!@!@@@!@!@@@@@!@!@!@!@@@!@@@@@!@@@!@@@!@@@!@!@@@!@!@!@!@{!@!{@@@@@!@{!@@@@", "@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@,@,@@@,@@@,@@@@@@@,@,@@,~@,@@@@@,@@@,@,@@@,@,@@@,@,@@@@@,@,@,@,@@@,@@@@@,@@@,@@@,@@@,@,@@@,@,@,@,@~,@,~@@@@@,@~,@@@@",
"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@!@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@!@@@!@!@@@!@!@@@!@!@@@@@!@@!!@!@@@!@@@@@!@@@!@@@!@@@!@!@@@!@!!@!!@!@@@!@@@@@!@!@@@@@", "@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@,@,@@@,@@@,@@@@@@@,@,@@@,@,@@@@@,@@@,@,@@@,@,@@@,@,@@@@@,@@,,@,@@@,@@@@@,@@@,@@@,@@@,@,@@@,@,,@,,@,@@@,@@@@@,@,@@@@@",
"@~@@@~@~!!!@@~!!!~@!!!!@@~!!!~@!@@@@@~!!!~@~@@@~@@@!@@@~!!!~@~@@@~@~!!!{@~@@@~@!@@@!@~!!!~@~@@@@@~!!!~@~@@@~@~!!!~@@@~@@@{!!!!@@!!!@@!@@@!@~@@@!@~!!!~@~!!!~@", "@!@@@!@!,,,@@!,,,!@,,,,@@!,,,!@,@@@@@!,,,!@!@@@!@@@,@@@!,,,!@!@@@!@!,,,~@!@@@!@,@@@,@!,,,!@!@@@@@!,,,!@!@@@!@!,,,!@@@!@@@~,,,,@@,,,@@,@@@,@!@@@,@!,,,!@!,,,!@",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@",
"@@----@@@;;;;]@]---->@]----]@];;;;]@]----]@]---->@]----]@]---->@]---->@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @@!;;;!@", "@@----@@@;;;;)@)---->@)----)@);;;;)@)----)@)---->@)----)@)---->@)---->@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @@,;;;,@",
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@!@!;@", "@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @,@,@,;@",
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @;!@!@;@", "@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @;,@,@;@",
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@!@!;@", "@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@,@,;@",
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;!@!@!@", "@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;,@,@,@",
"@];;;;]@@;;;;]@]----]@]----]@]----]@]----]@]----]@@;;;;]@]----]@]----]@@@@@ @];;;;]@];;;;]@@@@@];;;;]@];;;;]@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @!;;;!@@", "@);;;;)@@;;;;)@)----)@)----)@)----)@)----)@)----)@@;;;;)@)----)@)----)@@@@@ @);;;;)@);;;;)@@@@@);;;;)@);;;;)@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @,;;;,@@",
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@@@@;@", "@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@@@@;@",
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @!!!!!;@", "@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @,,,,,;@",
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@@@!!@", "@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @,@@@,,@",
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@@@!!@", "@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @,@@@,,@",
"@@----@@@;;;;]@]----]@]----]@@;;;;]@]----]@]----]@@;;;;]@]----]@]----]@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @!!!!!@@", "@@----@@@;;;;)@)----)@)----)@@;;;;)@)----)@)----)@@;;;;)@)----)@)----)@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @,,,,,@@",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@"}; "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@"};

View file

@ -13,14 +13,9 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 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 #define _GNU_SOURCE
#include <stdio.h> #include <stdio.h>
@ -37,11 +32,10 @@
#include <X11/extensions/shape.h> #include <X11/extensions/shape.h>
#include <X11/xpm.h> #include <X11/xpm.h>
#include "wmacpi.h" #include "libacpi.h"
#include "wmacpi-ng.h"
#if defined(ACPI) && defined(APM) #define WMACPI_NG_VER "0.50"
# error Cannot compile with ACPI and APM compiled in. Please select only one.
#endif
/* main pixmap */ /* main pixmap */
#ifdef LOW_COLOR #ifdef LOW_COLOR
@ -85,9 +79,7 @@ static void redraw_window(void);
static void render_text(char *string); static void render_text(char *string);
static void scroll_text(int x, int y, int width, int tw, int reset); static void scroll_text(int x, int y, int width, int tw, int reset);
static void display_percentage(int percent); static void display_percentage(int percent);
static void display_state(void);
static void display_time(int minutes); static void display_time(int minutes);
static void blink_button(Mode mode);
#define copy_xpm_area(x, y, w, h, dx, dy) \ #define copy_xpm_area(x, y, w, h, dx, dy) \
{ \ { \
@ -96,10 +88,34 @@ static void blink_button(Mode mode);
dockapp->update = 1; \ dockapp->update = 1; \
} }
/* display AC power symbol */
static void display_power_glyph(void)
{
copy_xpm_area(67, 38, 12, 7, 6, 17);
}
/* get rid of AC power symbol */
static void kill_power_glyph(void)
{
copy_xpm_area(67, 48, 12, 7, 6, 17);
}
/* display battery symbol */
static void display_battery_glyph(void)
{
copy_xpm_area(82, 38, 12, 7, 20, 17);
}
/* get rid of battery symbol */
static void kill_battery_glyph(void)
{
copy_xpm_area(82, 48, 12, 7, 20, 17);
}
static void redraw_window(void) static void redraw_window(void)
{ {
if (dockapp->update) { if (dockapp->update) {
eprint(1, "redrawing window"); eprint(0, "redrawing window");
XCopyArea(dockapp->display, dockapp->pixmap, dockapp->iconwin, XCopyArea(dockapp->display, dockapp->pixmap, dockapp->iconwin,
dockapp->gc, 0, 0, 64, 64, 0, 0); dockapp->gc, 0, 0, 64, 64, 0, 0);
XCopyArea(dockapp->display, dockapp->pixmap, dockapp->win, XCopyArea(dockapp->display, dockapp->pixmap, dockapp->win,
@ -203,7 +219,7 @@ static void render_text(char *string)
if (strlen(string) > 53) if (strlen(string) > 53)
return; return;
eprint(1, "rendering: %s", string); eprint(0, "rendering: %s", string);
/* prepare the text area by clearing it */ /* prepare the text area by clearing it */
for (i = 0; i < 54; i++) { for (i = 0; i < 54; i++) {
@ -277,8 +293,6 @@ static void scroll_text(int x, int y, int width, int tw, int reset)
} }
pos -= 2; pos -= 2;
eprint(0, "scrolling");
if (pos > 0) { if (pos > 0) {
copy_xpm_area(66, 9, pos, 7, x, y); /* clear */ copy_xpm_area(66, 9, pos, 7, x, y); /* clear */
XCopyArea(dockapp->display, dockapp->text, dockapp->pixmap, XCopyArea(dockapp->display, dockapp->text, dockapp->pixmap,
@ -292,10 +306,11 @@ static void scroll_text(int x, int y, int width, int tw, int reset)
static void display_percentage(int percent) static void display_percentage(int percent)
{ {
static int op = -1, obar; static int op = -1;
static unsigned int obar;
unsigned int bar; unsigned int bar;
eprint(1, "received: %d\n", percent); eprint(0, "received: %d\n", percent);
if (op == percent) if (op == percent)
return; return;
@ -365,107 +380,168 @@ static void display_time(int minutes)
omin = min; omin = min;
} }
static void display_state(void) /*
{ * The reworked state handling stuff.
static int dopower; */
static int docharging;
static int dobattery;
static int docritical;
static int counter;
switch (apminfo->power) { /* set the current state of the power panel */
case POWER: enum panel_states {
eprint(0, "selected ac power case"); PS_AC,
if (!dopower) { PS_BATT,
dopower = 1; PS_NULL,
docharging = 0; };
dobattery = 0;
dockapp->blink = OFF; static void set_power_panel(void)
copy_xpm_area(67, 38, 12, 7, 6, 17); {
copy_xpm_area(82, 48, 11, 7, 20, 17); enum panel_states power = PS_NULL;
render_text("On AC power"); static int counter = 0;
battery *binfo = apminfo->binfo;
if (apminfo->power == AC) {
if (power != PS_AC) {
power = PS_AC;
kill_battery_glyph();
display_power_glyph();
} }
break; } else if (apminfo->power == BATT) {
case CHARGING: if (power != PS_BATT) {
eprint(0, "selected charging case"); power = PS_BATT;
counter++; kill_power_glyph();
if (counter == 10) { display_battery_glyph();
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) }
if (binfo->charging) {
if (counter == 10)
display_power_glyph();
else if (counter == 20)
kill_power_glyph();
else if (counter > 30)
counter = 0; counter = 0;
if (!docharging) { counter++;
render_text("Battery is charging"); }
/* get rid of battery symbol */
copy_xpm_area(82, 48, 12, 7, 20, 17); if (binfo->capacity_state == CRITICAL) {
/* housekeeping */ if (counter == 10)
dockapp->blink = OFF; display_battery_glyph();
docharging = 1; else if (counter == 20)
dopower = 0; kill_battery_glyph();
dobattery = 0; else if (counter > 30)
counter = 0;
counter++;
}
}
/*
* The message that needs to be displayed needs to be decided
* according to a heirarchy: a message like not present needs to take
* precedence over a global thing like the current power status, and
* something like a low battery warning should take precedence over
* the "on battery" message. Likewise, a battery charging message
* needs to take precedence over the on ac power message. The other
* question is how much of a precedence local messages should take
* over global ones . . .
*
* So, there are three possible sets of messages: not present, on-line
* and off-line messages. We need to decide which of those sets is
* appropriate right now, and then decide within them.
*/
enum messages {
M_NP, /* not present */
M_AC, /* on ac power */
M_CH, /* battery charging */
M_BATT, /* on battery */
M_LB, /* low battery */
M_CB, /* critical low battery */
M_NULL, /* empty starting state */
};
static void set_message(void)
{
static enum messages state = M_NULL;
battery *binfo = apminfo->binfo;
/* battery not present case */
if (!binfo->present) {
if (state != M_NP) {
state = M_NP;
render_text("not present");
} }
break; } else if (apminfo->power == AC) {
case HIGH: if (binfo->charging) {
case LOW: if (state != M_CH) {
case CRIT: state = M_CH;
eprint(0, "selected battery case"); render_text("battery charging");
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 { } else {
if (docritical) { if (state != M_AC) {
render_text("On Battery"); state = M_AC;
docritical = 0; render_text("on ac power");
} }
dockapp->blink = OFF;
} }
} else {
if (binfo->state == CRIT) {
if (state != M_CB) {
state = M_CB;
render_text("critical low battery");
}
} else if (binfo->state == LOW) {
if (state != M_LB) {
state = M_LB;
render_text("low battery");
}
} else {
if (state != M_BATT) {
state = M_BATT;
render_text("on battery");
}
}
}
}
/*
* 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; break;
} }
} }
static void blink_button(Mode mode) void usage(char *name)
{ {
static int counter; printf("%s - help\t\t[timecop@japan.co.jp]\n\n"
static int clear; "-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"
"-m <battery number>\tbattery number to monitor\n"
"-v\t\t\tincrease verbosity.\n"
"-h\t\t\tdisplay this help\n",
name);
}
if ((mode == OFF) && !clear) { void print_version(void)
eprint(0, "we are off"); {
copy_xpm_area(136, 38, 3, 3, 44, 30); printf("wmacpi-ng version %s\n", WMACPI_NG_VER);
clear = 1; printf(" Using libacpi version %s\n", LIBACPI_VER);
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) int main(int argc, char **argv)
@ -473,21 +549,22 @@ int main(int argc, char **argv)
char *display = NULL; char *display = NULL;
char ch; char ch;
int update = 0; int update = 0;
battery *binfo;
dockapp = calloc(1, sizeof(Dockapp)); dockapp = calloc(1, sizeof(Dockapp));
apminfo = calloc(1, sizeof(APMInfo)); apminfo = calloc(1, sizeof(APMInfo));
dockapp->blink = OFF; dockapp->blink = OFF;
apminfo->crit_level = 10; apminfo->crit_level = 10;
battery_no = 1;
/* see if whatever we want to use is supported */ /* see if whatever we want to use is supported */
if (power_init()) { if (power_init())
/* power_init functions handle printing error messages */ /* power_init functions handle printing error messages */
exit(1); exit(1);
}
/* parse command-line options */ /* parse command-line options */
while ((ch = getopt(argc, argv, "bd:c:h")) != EOF) { while ((ch = getopt(argc, argv, "bd:c:m:hvV")) != EOF) {
switch (ch) { switch (ch) {
case 'b': case 'b':
noisy_critical = 1; noisy_critical = 1;
@ -506,18 +583,38 @@ int main(int argc, char **argv)
if (optarg) if (optarg)
display = strdup(optarg); display = strdup(optarg);
break; break;
case 'h': case 'm':
printf("wmacpi - help\t\t[timecop@japan.co.jp]\n\n" if (optarg) {
"-d display\t\tdisplay on remote display <display>\n" battery_no = atoi(optarg);
"-b\t\t\tmake noise when battery is critical low (beep)\n" if (battery_no >= MAXBATT) {
"-c value\t\tset critical low alarm at <value> percent\n" fprintf(stderr, "Please specify a battery number below %d\n",
"\t\t\t(default: 10 percent)\n" MAXBATT);
"-h\t\t\tdisplay this help\n"); return 1;
return 0; }
if (battery_no > batt_count) {
fprintf(stderr, "Battery %d does not appear to be installed\n",
battery_no);
return 1;
}
fprintf(stderr, "Monitoring battery %d\n", battery_no);
}
break; break;
case 'h':
usage(argv[0]);
return 0;
case 'v':
verbosity++;
break;
case 'V':
print_version();
return 0;
default:
usage(argv[0]);
return 1;
} }
} }
battery_no--;
/* open local or command-line specified display */ /* open local or command-line specified display */
if (open_display(display)) if (open_display(display))
@ -527,8 +624,11 @@ int main(int argc, char **argv)
new_window("apm"); new_window("apm");
/* get initial statistics */ /* get initial statistics */
acquire_info(); acquire_all_info();
binfo = &batteries[battery_no];
apminfo->binfo = binfo;
fprintf(stderr, "monitoring battery %s\n", binfo->name);
set_batt_id_area(battery_no);
dockapp->dspmode = REMAIN; dockapp->dspmode = REMAIN;
/* main loop */ /* main loop */
@ -549,40 +649,22 @@ int main(int argc, char **argv)
exit(0); exit(0);
break; break;
case ButtonPress: 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; break;
case ButtonRelease: case ButtonRelease:
/* release event */ /* cycle through the known batteries. */
if (event.xbutton.x >= 44 && event.xbutton.x <= 57 && battery_no++;
event.xbutton.y >= 30 && event.xbutton.y <= 43 && battery_no = battery_no % batt_count;
dockapp->pressed) { apminfo->binfo = &batteries[battery_no];
/* handle button press */ binfo = apminfo->binfo;
eprint(0, "release still inside button!"); fprintf(stderr, "changing to monitor battery %d\n", battery_no + 1);
dockapp->pressed = 0; set_batt_id_area(battery_no);
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; break;
} }
} }
if (update++ == 30) { if (update++ == 30) {
eprint(1, "polling apm"); eprint(0, "polling apm");
acquire_info(); acquire_all_info();
update = 0; update = 0;
} }
@ -591,18 +673,24 @@ int main(int argc, char **argv)
count = 0; count = 0;
} }
/* it's okay to test here because display_time will not draw anything /* the old code had some kind of weird crap with timers and the like.
* unless there is a change. Also if we switched power states from * As far as I can tell, it's meaningless - the time we want to display
* battery to charging/etc, we need to exit from "timer" mode */ * is the time calculated from the remaining capacity, as per the
if (dockapp->dspmode == REMAIN || apminfo->power == POWER || apminfo->power == CHARGING) { * ACPI spec. The only thing I'd change is the handling of a charging
* state: my best guess, based on the behaviour I'm seeing with my
* Lifebook, is that the present rate value when charging is the rate
* at which the batteries are being charged, which would mean I'd just
* need to reverse the rtime calculation to be able to work out how
* 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. */
if (binfo->charging)
display_time(binfo->charge_time);
else
display_time(apminfo->rtime); display_time(apminfo->rtime);
} else { set_power_panel();
display_time((time(NULL) - apminfo->timer) / 60); set_message();
} display_percentage(binfo->percentage);
display_state();
blink_button(dockapp->blink);
display_percentage(apminfo->percentage);
scroll_text(6, 50, 52, dockapp->tw, 0); scroll_text(6, 50, 52, dockapp->tw, 0);
/* redraw_window, if anything changed - determined inside /* redraw_window, if anything changed - determined inside
@ -612,23 +700,3 @@ int main(int argc, char **argv)
} }
return 0; 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;
}
}

9
wmacpi/wmacpi-ng.h Normal file
View file

@ -0,0 +1,9 @@
#ifndef _WMACPI_H_
#define _WMACPI_H_
#include "libacpi.h"
/* we need to make these available generally. */
int battery_no;
#endif /* _WMACPI_H_ */

View file

@ -1,52 +0,0 @@
#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_ */