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:
parent
9fcd703e60
commit
a68f78f034
BIN
wmacpi/.xvpics/master-new.xpm
Normal file
BIN
wmacpi/.xvpics/master-new.xpm
Normal file
Binary file not shown.
BIN
wmacpi/.xvpics/master.xpm
Normal file
BIN
wmacpi/.xvpics/master.xpm
Normal file
Binary file not shown.
BIN
wmacpi/.xvpics/master_low.xpm
Normal file
BIN
wmacpi/.xvpics/master_low.xpm
Normal file
Binary file not shown.
341
wmacpi/COPYING
341
wmacpi/COPYING
|
@ -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.
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
38
wmacpi/TODO
Normal 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
125
wmacpi/acpi-ng.c
Normal 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
105
wmacpi/debian/changelog
Normal 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
1
wmacpi/debian/compat
Normal file
|
@ -0,0 +1 @@
|
||||||
|
4
|
21
wmacpi/debian/control
Normal file
21
wmacpi/debian/control
Normal 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
27
wmacpi/debian/copyright
Normal 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
1
wmacpi/debian/dirs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
usr/bin
|
3
wmacpi/debian/docs
Normal file
3
wmacpi/debian/docs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
README
|
||||||
|
AUTHORS
|
||||||
|
TODO
|
2
wmacpi/debian/menu
Normal file
2
wmacpi/debian/menu
Normal 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
90
wmacpi/debian/rules
Executable 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
2
wmacpi/debian/watch
Normal 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
125
wmacpi/debian/wmacpi-ng.1
Normal 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.
|
457
wmacpi/libacpi.c
457
wmacpi/libacpi.c
|
@ -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++;
|
||||||
fread(buf, 512, 1, acpi);
|
retval = (string + i);
|
||||||
fclose(acpi);
|
|
||||||
|
|
||||||
if ((ptr = strstr(buf, "last full capacity"))) {
|
return retval;
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (binfo->charging) {
|
||||||
|
/* calculate remaining time until the battery is charged.
|
||||||
|
* when charging, the battery state file reports the
|
||||||
|
* current being used to charge the battery. We can use
|
||||||
|
* this and the remaining capacity to work out how long
|
||||||
|
* until it reaches the last full capacity of the battery.
|
||||||
|
* XXX: make sure this is actually portable . . . */
|
||||||
|
lfcap = (float)binfo->last_full_cap;
|
||||||
|
rcap = (float)binfo->remaining_cap;
|
||||||
|
|
||||||
|
binfo->charge_time = (int)(((lfcap - rcap)/binfo->present_rate) * 60.0);
|
||||||
|
} else
|
||||||
|
if (binfo->charge_time)
|
||||||
|
binfo->charge_time = 0;
|
||||||
|
|
||||||
/* we are not on power, and not charging. So, it would make sense
|
/* and finally, we tell anyone who wants to use this information
|
||||||
* to check if battery is "critical low", and calculate interesting
|
* that it's now valid . . .*/
|
||||||
* things like battery HIGH/LOW, and maybe battery usage LOAD
|
binfo->valid = 1;
|
||||||
* This will be replaced with some code to allow setting user-specified
|
}
|
||||||
* low / critical alarms */
|
|
||||||
if ((apminfo->power != POWER) && (apminfo->power != CHARGING)) {
|
void acquire_all_batt_info(void)
|
||||||
eprint(1, "entering battery status check");
|
{
|
||||||
if ((ptr = strstr(buf, "capacity state"))) {
|
int i;
|
||||||
stat = *(ptr + 25);
|
|
||||||
/* only check "c" here because we already caught "CHarging" earlier
|
for(i = 0; i < batt_count; i++)
|
||||||
* and also look into crit_level */
|
acquire_batt_info(i);
|
||||||
if (stat == 'c' || (apminfo->percentage <= apminfo->crit_level)) {
|
}
|
||||||
/* nothing else to do here - critical battery. get out */
|
|
||||||
eprint(1, "Received critical battery status");
|
void acquire_global_info(void)
|
||||||
apminfo->power = CRIT;
|
{
|
||||||
|
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;
|
||||||
|
|
||||||
|
/* for the first SAMPLES number of calls we calculate the
|
||||||
|
* average based on sample_count, then we use SAMPLES to
|
||||||
|
* calculate the rolling average. */
|
||||||
|
|
||||||
eprint(1, "current state: %s (%d)", state[apminfo->power], apminfo->power);
|
/* 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
118
wmacpi/libacpi.h
Normal 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_ */
|
|
@ -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 */
|
|
|
@ -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[] = {
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
||||||
" . % % ......% % % +.+.+.@.% @.......@.% @.......@.% @.+.+.+.@.% @.......@.% @.......@.% @.......@.% @.......@.% @.......@.% % ..% % % % % % % ",
|
" . % % ......% % % +.+.+.@.% @.......@.% @.......@.% @.+.+.+.@.% @.......@.% @.......@.% @.......@.% @.......@.% @.......@.% % ..% % % % % % % ",
|
||||||
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % ..% ",
|
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % ..% ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . #.$.$.. %.%.%.%.%.%.%.%.%.&.% ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% % ..% ..% % % @.% ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% % ..% ..% % % @.% ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` . % @.+.+.+.@.% % +.+.+.@.% @.......@.% % ......@.% @.......@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % ..% % % % % % ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % @.+.+.+.@.% % +.+.+.@.% @.......@.% % ......@.% @.......@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % ..% % % % % % ",
|
||||||
" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% % ..% ..% % % % % ",
|
" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` % % % % % % % % % +.+.+.+.% % % ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% % ..% ..% % % % % ",
|
||||||
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . . . . . %.=.=.=.=.=.=.=.=.&.% ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% ..% ..% % ..% -.;.;. ",
|
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % % % % % % % % +.% % % % +.% % ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% ..% ..% % ..% ",
|
||||||
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . %.%.%.%.%.=.=.=.=.=.=.=.=.&.% ` . % % ......% % % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % % ..% % % @.% ;.;.;. ",
|
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % #.#.#.#.% % % +.% % % % +.% % ` . % % ......% % % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % % ..% % % @.% ",
|
||||||
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ;.;.>. ",
|
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
||||||
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . ",
|
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . ",
|
||||||
" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . . . . . . . . . . . . . . . . ` . . . . . . . . . . . . . . . . ` ",
|
" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` % #.% % % #.% % % +.+.+.+.% % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . . . . . . . . . . . . . . . . ` . . . . . . . . . . . . . . . . ` ",
|
||||||
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % % ..........% % % % ....................% % % @.% % ......% % % ......% % % ..% % % % . ,.'.'.. ).).).).).).).).).!.% ` . #.$.$.. %.%.%.%.%.%.%.%.%.&.% ` ",
|
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.#.#.#.% % % +.% % % % +.% % ` . % % % % % % ..........% % % % ....................% % % @.% % ......% % % ......% % % ..% % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
|
||||||
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % ..% % % % ......% % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% . '.~.{.. ).].].].].].].].].!.% ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` ",
|
" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % % % ..% % % % ......% % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
|
||||||
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % ..% % % % ..% % % % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % . '.{.{.. ).].].].].].].].].!.% ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` ",
|
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % % % ..% % % % ..% % % % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % % % % % % % % % % +.+.+.+.$.% % ` % % % % % % % % $.........@.% % ` ",
|
||||||
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % ......% % % % ..% % % % ..% % % % % % % % ....% % @.% @.+.+.+.@.% @.+.+.+.@.% % % ..% % % . . . . . ).].].].].].].].].!.% ` . . . . . %.=.=.=.=.=.=.=.=.&.% ` ",
|
" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % ......% % % % ..% % % % ..% % % % % % % % ....% % @.% @.+.+.+.@.% @.+.+.+.@.% % % ..% % % % % % % % % % % +.% % % % ..% % ` % % % % % % % % +.% % % % ..% % ` ",
|
||||||
" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % ..% % ..% % % % ......% % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % . ).).).).).].].].].].].].].!.% ` . %.%.%.%.%.=.=.=.=.=.=.=.=.&.% ` ",
|
" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` % #.#.#.#.% % % % +.+.+.+.% % % ` . % % ..% % ..% % % % ......% % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % % #.#.#.#.% % % +.% % % % ..% % ` % #.#.#.#.% % % +.% % % % ..% % ` ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . %.&.&.&.&.&.&.&.&.&.&.&.&.&.% ` . % ..% % % % ..........% % % % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % % ..........% % % % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % +.% % % % ..% % ` ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . . . . . . . . . . . . . . . % ` . % ..% % % % % % % % % % % % % ....................% % % @.% % ......% % % ......% % % % % ..% % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % % % % % % % % % % % ....................% % % @.% % ......% % % ......% % % % % ..% % % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % +.% % % % ..% % ` ",
|
||||||
" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ",
|
" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % #.% % % #.% % % +.+.+.+.$.% % ` % #.% % % #.% % $.........$.% % ` ",
|
||||||
" . . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ",
|
" . % #.#.#.#.% % % +.% % % % ..% % ` % #.#.#.#.% % % ..% % % % +.% % ` ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % ..% % % % +.% % ` ",
|
||||||
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % % % % % +.+.+.+.+.% % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % +.% % % % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ",
|
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % % % % % +.+.+.+.+.% % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % +.% % % % % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % ..% % % % +.% % ` ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.+.+.% % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.+.+.% % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % ..% % % % +.% % ` ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.% % % % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.% % % % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % % #.#.#.#.% % % % +.+.+.+.$.% % ` % #.#.#.#.% % % $.........$.% % ` ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % +.+.+.% % % % +.% % % % +.% % % % % % % % +.+.% % % % % +.+.+.% % % +.+.+.% % % % +.% % % . ).!.!.!.!.!.!.!.!.!.!.!.!.!.% ` . %.&.&.&.&.&.&.&.&.&.&.&.&.&.% ` ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % +.+.+.% % % % +.% % % % +.% % % % % % % % +.+.% % % % % +.+.+.% % % +.+.+.% % % % +.% % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % +.% % +.% % % % +.+.+.% % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % . . . . . . . . . . . . . . . % ` . . . . . . . . . . . . . . . % ` ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % +.% % +.% % % % +.+.+.% % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % +.% % % % +.+.+.+.+.% % % % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % +.% % % % +.+.+.+.+.% % % % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % +.% % % % % % % % % % % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % % % +.% % ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % +.% % % % % % % % % % % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % % % +.% % ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
||||||
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % ^.^.^.% % % % % % /.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % % % % % % % % ",
|
" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % #.#.#.% % % % % % %.% %.#.#.#.%.% %.#.#.#.%.% %.% % % %.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% % % % % % % % % % % % % % % % % % % ",
|
||||||
" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % ^.% % % ^.% % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % % % % % % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % % % % % % % % % % % % % % % ",
|
" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % #.% % % #.% % % % % #.% % % % % #.% % % % % #.% #.% % % #.% #.% % % % % #.% % % % % % % % % #.% #.% % % #.% #.% % % #.% % % % % % % % % % % % % % % % % % % ",
|
||||||
" . % ^.% % % ^.% % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % % % % % % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % % % % % % % % % % % % % % % ",
|
" . % #.% % % #.% % % % % #.% % % % % #.% % % % % #.% #.% % % #.% #.% % % % % #.% % % % % % % % % #.% #.% % % #.% #.% % % #.% % % % % % % % % % % % % % % % % % % ",
|
||||||
" . % /.% % % /.% % % % % /.% /.^.^.^./.% % ^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% % % % % /.% (.^.^.^.(.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % % ",
|
" . % %.% % % %.% % % % % %.% %.#.#.#.%.% % #.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% % % % % %.% &.#.#.#.&.% %.#.#.#.%.% %.#.#.#.%.% % % % % % % % % % % % % ",
|
||||||
" . % ^.% % % ^.% % % % % ^.% ^.% % % % % % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% % % % % % % % % % % % % % % % % % % ",
|
" . % #.% % % #.% % % % % #.% #.% % % % % % % % % #.% % % % % #.% % % % % #.% #.% % % #.% % % % % #.% #.% % % #.% % % % % #.% % % % % % % % % % % % % % % % % % % ",
|
||||||
" . % ^.% % % ^.% % % % % ^.% ^.% % % % % % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% % % % % % % % % % % % % % % % % % % ",
|
" . % #.% % % #.% % % % % #.% #.% % % % % % % % % #.% % % % % #.% % % % % #.% #.% % % #.% % % % % #.% #.% % % #.% % % % % #.% % % % % % % % % % % % % % % % % % % ",
|
||||||
". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % ^.^.^.% % % % % % ^.% /.^.^.^./.% /.^.^.^./.% % % % % /.% /.^.^.^./.% /.^.^.^./.% % % % % /.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % % % % % % ^.% ",
|
". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % #.#.#.% % % % % % #.% %.#.#.#.%.% %.#.#.#.%.% % % % % %.% %.#.#.#.%.% %.#.#.#.%.% % % % % %.% %.#.#.#.%.% %.#.#.#.%.% % % % % % % % % % % % % % % % % #.% ",
|
||||||
" % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
" % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
||||||
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
||||||
"% (.^.^.^.(.% /.^.^.^.% % /.^.^.^./.% /.^.^.^.% % /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% % % /.% % % % % % % /.% /.% % % /.% /.% % % % % ^.% % % ^.% /.^.^.^.% % /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% /.% % % /.% /.% % % /.% /.% % % /.% /.% % % /.% /.^.^.^./.% ",
|
"% &.#.#.#.&.% %.#.#.#.% % %.#.#.#.%.% %.#.#.#.% % %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.% % % %.% % % %.% % % % % % % %.% %.% % % %.% %.% % % % % #.% % % #.% %.#.#.#.% % %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.% % % %.% %.% % % %.% %.% % % %.% %.% % % %.% %.% % % %.% %.#.#.#.%.% ",
|
||||||
"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % % % ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % % ^.% ^.% % % % % ^.^.% ^.^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % ^.% ",
|
"% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % % % #.% % % #.% % % #.% % % % % % % #.% #.% % % #.% #.% % % % % #.#.% #.#.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % % % #.% % % #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% % % % % #.% ",
|
||||||
"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % % % ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % ^.(.% ^.% % % % % ^.% ^.% ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% (.^.% ^.(.% ^.% % % ^.% % % % ^.(.% ",
|
"% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % % % #.% % % #.% % % #.% % % % % % % #.% #.% % #.&.% #.% % % % % #.% #.% #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % % % #.% % % #.% % % #.% #.% % % #.% #.% % % #.% &.#.% #.&.% #.% % % #.% % % % #.&.% ",
|
||||||
"% /.^.^.^./.% /.^.^.^.% % /.% % % % % /.% % % /.% /.^.^.^.% % /.^.^.^.% % /.(.^.^./.% /.^.^.^./.% % % /.% % % % % % % /.% /.^.^.(.% % /.% % % % % /.% % % /.% /.% % % /.% /.% % % /.% /.^.^.^./.% /.^.% % /.% /.^.^.^.% % /.^.^.^./.% % % /.% % % /.% % % /.% /.% % % /.% /.% % % /.% % (.^.(.% % /.^.^.^./.% % (.^.(.% % ",
|
"% %.#.#.#.%.% %.#.#.#.% % %.% % % % % %.% % % %.% %.#.#.#.% % %.#.#.#.% % %.&.#.#.%.% %.#.#.#.%.% % % %.% % % % % % % %.% %.#.#.&.% % %.% % % % % %.% % % %.% %.% % % %.% %.% % % %.% %.#.#.#.%.% %.#.% % %.% %.#.#.#.% % %.#.#.#.%.% % % %.% % % %.% % % %.% %.% % % %.% %.% % % %.% % &.#.&.% % %.#.#.#.%.% % &.#.&.% % ",
|
||||||
"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % ^.% ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % ^.(.% ^.% % % % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% ^.% ^.% ^.% % % ^.% % % % % ^.% % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% ^.% ^.% (.^.% ^.(.% % % % % ^.% (.^.% % % % ",
|
"% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % #.% #.% % % #.% % % #.% % % % % % % #.% #.% % #.&.% #.% % % % % #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % #.% #.% #.% #.% % % #.% % % % % #.% % % #.% % % #.% % % #.% #.% % % #.% #.% #.% #.% &.#.% #.&.% % % % % #.% &.#.% % % % ",
|
||||||
"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % ^.% ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % ^.^.% ^.% % % ^.% % % % % ^.% % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.^.% ^.^.% ^.% % % ^.% % % % % ^.% ^.% % % % % ",
|
"% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % #.% #.% % % #.% % % #.% % % % % % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % #.% % #.#.% #.% % % #.% % % % % #.% % % #.% % % #.% % % #.% #.% % % #.% #.#.% #.#.% #.% % % #.% % % % % #.% #.% % % % % ",
|
||||||
"% /.% % % /.% /.^.^.^.% % /.^.^.^./.% ^.^.^.^.% % /.^.^.^./.% ^.% % % % % /.^.^.^./.% /.% % % /.% % % ^.% % % /.^.^.^./.% /.% % % /.% /.^.^.^.(.% /.% % % /.% ^.% % % ^.% /.^.^.^./.% /.% % % % % /.^.^.^./.% /.% % % /.% /.^.^.^./.% % % /.% % % (.^.^.^.^.% % ^.^.^.% % ^.% % % ^.% /.% % % ^.% /.^.^.^./.% /.^.^.^./.% ",
|
"% %.% % % %.% %.#.#.#.% % %.#.#.#.%.% #.#.#.#.% % %.#.#.#.%.% #.% % % % % %.#.#.#.%.% %.% % % %.% % % #.% % % %.#.#.#.%.% %.% % % %.% %.#.#.#.&.% %.% % % %.% #.% % % #.% %.#.#.#.%.% %.% % % % % %.#.#.#.%.% %.% % % %.% %.#.#.#.%.% % % %.% % % &.#.#.#.#.% % #.#.#.% % #.% % % #.% %.% % % #.% %.#.#.#.%.% %.#.#.#.%.% ",
|
||||||
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
||||||
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ",
|
||||||
"% % ........% % % +.+.+.+._.% _.........@.% _........._.% _.+.+.+.+._.% _........._.% _.........@.% _........._.% _.........@.% _.........@.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % % ^.+.+.+.^.% ",
|
"% % ........% % % +.+.+.+.$.% $.........@.% $.........$.% $.+.+.+.+.$.% $.........$.% $.........@.% $.........$.% $.........@.% $.........@.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % % #.+.+.+.#.% ",
|
||||||
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ^.% ^.% ^.+.% ",
|
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % #.% #.% #.+.% ",
|
||||||
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % +.^.% ^.% +.% ",
|
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % +.#.% #.% +.% ",
|
||||||
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% ^.% ^.+.% ",
|
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% #.% #.+.% ",
|
||||||
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.^.% ^.% ^.% ",
|
"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.#.% #.% #.% ",
|
||||||
"% _.+.+.+.+._.% % +.+.+.+._.% _........._.% _........._.% _........._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % % % % % _.+.+.+.+._.% _.+.+.+.+._.% % % % % _.+.+.+.+._.% _.+.+.+.+._.% % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ^.+.+.+.^.% % ",
|
"% $.+.+.+.+.$.% % +.+.+.+.$.% $.........$.% $.........$.% $.........$.% $.........$.% $.........$.% % +.+.+.+.$.% $.........$.% $.........$.% % % % % % $.+.+.+.+.$.% $.+.+.+.+.$.% % % % % $.+.+.+.+.$.% $.+.+.+.+.$.% % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % #.+.+.+.#.% % ",
|
||||||
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% % % % +.% ",
|
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% % % % +.% ",
|
||||||
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ^.^.^.^.^.+.% ",
|
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % #.#.#.#.#.+.% ",
|
||||||
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ^.% % % ^.^.% ",
|
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % #.% % % #.#.% ",
|
||||||
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ^.% % % ^.^.% ",
|
"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % #.% % % #.#.% ",
|
||||||
"% % ........% % % +.+.+.+._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ^.^.^.^.^.% % ",
|
"% % ........% % % +.+.+.+.$.% $.........$.% $.........$.% % +.+.+.+.$.% $.........$.% $.........$.% % +.+.+.+.$.% $.........$.% $.........$.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % #.#.#.#.#.% % ",
|
||||||
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % "};
|
"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % "};
|
||||||
|
|
|
@ -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[] = {
|
||||||
" . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
|
" . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
|
||||||
" . @@---@@@;;;>@>--->@>--->@>;;;>@>--->@>--->@>--->@>--->@>--->@@-@@@@@@@ ",
|
" . @@---@@@;;;>@>--->@>--->@>;;;>@>--->@>--->@>--->@>--->@>--->@@-@@@@@@@ ",
|
||||||
" ..................................... ................= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@-@-@-@@-@ ",
|
" ..................................... ................= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@-@-@-@@-@ ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= .,**.'''''''''=@= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@@-@-@@@>@ ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@@-@-@@@>@ ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= .***.',,,,,,,,=@= . @>;;;>@@;;;>@>--->@@--->@>--->@>--->@>--->@@;;;>@>--->@>--->@@@-@@@@@@ ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @>;;;>@@;;;>@>--->@@--->@>--->@>--->@>--->@@;;;>@>--->@>--->@@@-@@@@@@ ",
|
||||||
" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= .***.',,,,,,,,=@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@@-@-@@@@@ ",
|
" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= @@@@@@@@@;;;;@@@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@@-@-@@@@@ ",
|
||||||
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .....',,,,,,,,=@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@-@-@-@@-@ ,++ ",
|
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @@@@@@@@;@@@@;@@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@-@-@-@@-@ ",
|
||||||
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .''''',,,,,,,,=@= . @@---@@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@@@-@@@>@ +++ ",
|
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @,,,,@@@;@@@@;@@= . @@---@@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@@@-@@@>@ ",
|
||||||
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +++ ",
|
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
|
||||||
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . ",
|
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . ",
|
||||||
" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= .',,,,,,,,,,,,=@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ................= ................= ",
|
" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= @,@@@,@@@;;;;@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ................' ................' ",
|
||||||
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@@-----@@@ @----------@@ @>@@---@@@---@@@-@@@@ .,$$.))))))))))@= .,**.'''''''''=@= ",
|
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,,,,@@@;@@@@;@@= . @@@@@@-----@@@ @----------@@ @>@@---@@@---@@@-@@@@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ",
|
||||||
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@-@@@@---@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ .$$$.),,,,,,,,=@= .***.',,,,,,,,=@= ",
|
" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@@@-@@@@---@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ",
|
||||||
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@-@@@@-@@@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ .$$$.),,,,,,,,=@= .***.',,,,,,,,=@= ",
|
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@@@-@@@@-@@@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ @@@@@@@@@;;;;)@@' @@@@@@@@)---->@@' ",
|
||||||
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@---@@@@-@@@ @-@@@@@@@@--@ @>@>;;;>@>;;;>@@@-@@@ .....),,,,,,,,=@= .....',,,,,,,,=@= ",
|
" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@---@@@@-@@@ @-@@@@@@@@--@ @>@>;;;>@>;;;>@@@-@@@ @@@@@@@@;@@@@-@@' @@@@@@@@;@@@@-@@' ",
|
||||||
" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= .',,,,,,,,,,,,=@= . @@-@@-@@@@---@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ .))))),,,,,,,,=@= .''''',,,,,,,,=@= ",
|
" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= @,,,,@@@@;;;;@@@= . @@-@@-@@@@---@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ @,,,,@@@;@@@@-@@' @,,,,@@@;@@@@-@@' ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= .'=============@= . @-@@@@-----@@@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @-@@@@-----@@@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ @,@@@,@@;@@@@-@@' @,@@@,@@;@@@@-@@' ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= ...............@= . @-@@@@@@@@@@@@ @----------@@ @>@@---@@@---@@@@@-@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @-@@@@@@@@@@@@ @----------@@ @>@@---@@@---@@@@@-@@ @,@@@,@@;@@@@-@@' @,@@@,@@;@@@@-@@' ",
|
||||||
" ===================================== ================= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ",
|
" ===================================== ================= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @,@@@,@@@;;;;)@@' @,@@@,@@)----)@@' ",
|
||||||
" . .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ",
|
" . @,,,,@@@;@@@@-@@' @,,,,@@@-@@@@;@@' ",
|
||||||
" . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ",
|
" . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @,@@@,@@;@@@@-@@' @,@@@,@@-@@@@;@@' ",
|
||||||
" ........................................................ . @@@@@@;;;;;@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@;@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ",
|
" ........................................................ . @@@@@@;;;;;@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@;@@@@ @,@@@,@@;@@@@-@@' @,@@@,@@-@@@@;@@' ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;;;@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;;;@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ @,@@@,@@;@@@@-@@' @,@@@,@@-@@@@;@@' ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;@@@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;@@@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ @,,,,@@@@;;;;)@@' @,,,,@@@)----)@@' ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@;;;@@@@;@@@ @;@@@@@@@@;;@ @@@@;;;@@@;;;@@@@;@@@ .)=============@= .'=============@= ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@;;;@@@@;@@@ @;@@@@@@@@;;@ @@@@;;;@@@;;;@@@@;@@@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@;@@;@@@@;;;@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ ...............@= ...............@= ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@;@@;@@@@;;;@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@;;;;;@@@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ ================= ================= ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@;;;;;@@@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ ''''''''''''''''' ''''''''''''''''' ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@@@@@@@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@@@;@@ ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@@@@@@@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@@@;@@ ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@ ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@ ",
|
||||||
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@!!!@@@@@@~@~!!!~@~!!!~@~@@@~@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@@@@@@@@@@@@@ @@@@@@ ",
|
" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@,,,@@@@@@!@!,,,!@!,,,!@!@@@!@!,,,!@!,,,!@!,,,!@!,,,!@!,,,!@@@@@@@@@@@@@ @@@@@@ ",
|
||||||
" ======================================================== . @!@@@!@@@@@!@@@@@!@@@@@!@!@@@!@!@@@@@!@@@@@@@@@!@!@@@!@!@@@!@@@@@@@@@@@@@ @@@@@@ ",
|
" ======================================================== . @,@@@,@@@@@,@@@@@,@@@@@,@,@@@,@,@@@@@,@@@@@@@@@,@,@@@,@,@@@,@@@@@@@@@@@@@ @@@@@@ ",
|
||||||
" . @!@@@!@@@@@!@@@@@!@@@@@!@!@@@!@!@@@@@!@@@@@@@@@!@!@@@!@!@@@!@@@@@@@@@@@@@ @@@@@@ ",
|
" . @,@@@,@@@@@,@@@@@,@@@@@,@,@@@,@,@@@@@,@@@@@@@@@,@,@@@,@,@@@,@@@@@@@@@@@@@ @@@@@@ ",
|
||||||
" . @~@@@~@@@@@~@~!!!~@@!!!~@~!!!~@~!!!~@~!!!~@@@@@~@{!!!{@~!!!~@~!!!~@@@@@@@ @@@@@@ ",
|
" . @!@@@!@@@@@!@!,,,!@@,,,!@!,,,!@!,,,!@!,,,!@@@@@!@~,,,~@!,,,!@!,,,!@@@@@@@ @@@@@@ ",
|
||||||
" . @!@@@!@@@@@!@!@@@@@@@@@!@@@@@!@@@@@!@!@@@!@@@@@!@!@@@!@@@@@!@@@@@@@@@@@@@ @@@@@@ ",
|
" . @,@@@,@@@@@,@,@@@@@@@@@,@@@@@,@@@@@,@,@@@,@@@@@,@,@@@,@@@@@,@@@@@@@@@@@@@ @@@@@@ ",
|
||||||
" . @!@@@!@@@@@!@!@@@@@@@@@!@@@@@!@@@@@!@!@@@!@@@@@!@!@@@!@@@@@!@@@@@@@@@@@@@ @@@@@@ ",
|
" . @,@@@,@@@@@,@,@@@@@@@@@,@@@@@,@@@@@,@,@@@,@@@@@,@,@@@,@@@@@,@@@@@@@@@@@@@ @@@@@@ ",
|
||||||
"................................................................. @@!!!@@@@@@!@~!!!~@~!!!~@@@@@~@~!!!~@~!!!~@@@@@~@~!!!~@~!!!~@@@@@@@@@@@@@ @@@@!@ ",
|
"................................................................. @@,,,@@@@@@,@!,,,!@!,,,!@@@@@!@!,,,!@!,,,!@@@@@!@!,,,!@!,,,!@@@@@@@@@@@@@ @@@@,@ ",
|
||||||
" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
|
" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ",
|
||||||
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
|
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
|
||||||
"@{!!!{@~!!!@@~!!!~@~!!!@@~!!!~@~!!!~@~!!!~@~@@@~@@@~@@@@@@@~@~@@@~@~@@@@@!@@@!@~!!!@@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@~@@@~@~@@@~@~@@@~@~@@@~@~@@@~@~!!!~@",
|
"@~,,,~@!,,,@@!,,,!@!,,,@@!,,,!@!,,,!@!,,,!@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@,@@@,@!,,,@@!,,,!@!,,,!@!,,,!@!,,,!@!,,,!@!,,,!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!,,,!@",
|
||||||
"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@@@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@!!@!!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@@@@@!@@@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@@@@@!@",
|
"@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@@@,@@@,@@@,@@@@@@@,@,@@@,@,@@@@@,,@,,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@@@@@,@@@,@@@,@,@@@,@,@@@,@,@@@,@,@@@,@@@@@,@",
|
||||||
"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@@@!@@@!@@@!@@@@@@@!@!@@!{@!@@@@@!@!@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@@@@@!@@@!@@@!@!@@@!@!@@@!@{!@!{@!@@@!@@@@!{@",
|
"@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@@@,@@@,@@@,@@@@@@@,@,@@,~@,@@@@@,@,@,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@@@@@,@@@,@@@,@,@@@,@,@@@,@~,@,~@,@@@,@@@@,~@",
|
||||||
"@~!!!~@~!!!@@~@@@@@~@@@~@~!!!@@~!!!@@~{!!~@~!!!~@@@~@@@@@@@~@~!!{@@~@@@@@~@@@~@~@@@~@~@@@~@~!!!~@~!@@~@~!!!@@~!!!~@@@~@@@~@@@~@~@@@~@~@@@~@@{!{@@~!!!~@@{!{@@",
|
"@!,,,!@!,,,@@!@@@@@!@@@!@!,,,@@!,,,@@!~,,!@!,,,!@@@!@@@@@@@!@!,,~@@!@@@@@!@@@!@!@@@!@!@@@!@!,,,!@!,@@!@!,,,@@!,,,!@@@!@@@!@@@!@!@@@!@!@@@!@@~,~@@!,,,!@@~,~@@",
|
||||||
"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@!@!@@@!@@@!@@@@@@@!@!@@!{@!@@@@@!@@@!@!@@@!@!@@@!@!@@@@@!@!@!@!@@@!@@@@@!@@@!@@@!@@@!@!@@@!@!@!@!@{!@!{@@@@@!@{!@@@@",
|
"@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@,@,@@@,@@@,@@@@@@@,@,@@,~@,@@@@@,@@@,@,@@@,@,@@@,@,@@@@@,@,@,@,@@@,@@@@@,@@@,@@@,@@@,@,@@@,@,@,@,@~,@,~@@@@@,@~,@@@@",
|
||||||
"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@!@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@!@@@!@!@@@!@!@@@!@!@@@@@!@@!!@!@@@!@@@@@!@@@!@@@!@@@!@!@@@!@!!@!!@!@@@!@@@@@!@!@@@@@",
|
"@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@,@,@@@,@@@,@@@@@@@,@,@@@,@,@@@@@,@@@,@,@@@,@,@@@,@,@@@@@,@@,,@,@@@,@@@@@,@@@,@@@,@@@,@,@@@,@,,@,,@,@@@,@@@@@,@,@@@@@",
|
||||||
"@~@@@~@~!!!@@~!!!~@!!!!@@~!!!~@!@@@@@~!!!~@~@@@~@@@!@@@~!!!~@~@@@~@~!!!{@~@@@~@!@@@!@~!!!~@~@@@@@~!!!~@~@@@~@~!!!~@@@~@@@{!!!!@@!!!@@!@@@!@~@@@!@~!!!~@~!!!~@",
|
"@!@@@!@!,,,@@!,,,!@,,,,@@!,,,!@,@@@@@!,,,!@!@@@!@@@,@@@!,,,!@!@@@!@!,,,~@!@@@!@,@@@,@!,,,!@!@@@@@!,,,!@!@@@!@!,,,!@@@!@@@~,,,,@@,,,@@,@@@,@!@@@,@!,,,!@!,,,!@",
|
||||||
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
|
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
|
||||||
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@",
|
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@",
|
||||||
"@@----@@@;;;;]@]---->@]----]@];;;;]@]----]@]---->@]----]@]---->@]---->@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @@!;;;!@",
|
"@@----@@@;;;;)@)---->@)----)@);;;;)@)----)@)---->@)----)@)---->@)---->@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @@,;;;,@",
|
||||||
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@!@!;@",
|
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @,@,@,;@",
|
||||||
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @;!@!@;@",
|
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @;,@,@;@",
|
||||||
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@!@!;@",
|
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@,@,;@",
|
||||||
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;!@!@!@",
|
"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;,@,@,@",
|
||||||
"@];;;;]@@;;;;]@]----]@]----]@]----]@]----]@]----]@@;;;;]@]----]@]----]@@@@@ @];;;;]@];;;;]@@@@@];;;;]@];;;;]@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @!;;;!@@",
|
"@);;;;)@@;;;;)@)----)@)----)@)----)@)----)@)----)@@;;;;)@)----)@)----)@@@@@ @);;;;)@);;;;)@@@@@);;;;)@);;;;)@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @,;;;,@@",
|
||||||
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@@@@;@",
|
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@@@@;@",
|
||||||
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @!!!!!;@",
|
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @,,,,,;@",
|
||||||
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@@@!!@",
|
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @,@@@,,@",
|
||||||
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@@@!!@",
|
"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @,@@@,,@",
|
||||||
"@@----@@@;;;;]@]----]@]----]@@;;;;]@]----]@]----]@@;;;;]@]----]@]----]@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @!!!!!@@",
|
"@@----@@@;;;;)@)----)@)----)@@;;;;)@)----)@)----)@@;;;;)@)----)@)----)@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @,,,,,@@",
|
||||||
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@"};
|
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@"};
|
||||||
|
|
|
@ -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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* set the current state of the power panel */
|
||||||
|
enum panel_states {
|
||||||
|
PS_AC,
|
||||||
|
PS_BATT,
|
||||||
|
PS_NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void set_power_panel(void)
|
||||||
{
|
{
|
||||||
static int dopower;
|
enum panel_states power = PS_NULL;
|
||||||
static int docharging;
|
static int counter = 0;
|
||||||
static int dobattery;
|
battery *binfo = apminfo->binfo;
|
||||||
static int docritical;
|
|
||||||
static int counter;
|
if (apminfo->power == AC) {
|
||||||
|
if (power != PS_AC) {
|
||||||
switch (apminfo->power) {
|
power = PS_AC;
|
||||||
case POWER:
|
kill_battery_glyph();
|
||||||
eprint(0, "selected ac power case");
|
display_power_glyph();
|
||||||
if (!dopower) {
|
|
||||||
dopower = 1;
|
|
||||||
docharging = 0;
|
|
||||||
dobattery = 0;
|
|
||||||
dockapp->blink = OFF;
|
|
||||||
copy_xpm_area(67, 38, 12, 7, 6, 17);
|
|
||||||
copy_xpm_area(82, 48, 11, 7, 20, 17);
|
|
||||||
render_text("On AC power");
|
|
||||||
}
|
}
|
||||||
break;
|
} 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
9
wmacpi/wmacpi-ng.h
Normal 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_ */
|
|
@ -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_ */
|
|
Loading…
Reference in a new issue