diff --git a/wmacpi/.xvpics/master-new.xpm b/wmacpi/.xvpics/master-new.xpm new file mode 100644 index 0000000..e1c06f0 Binary files /dev/null and b/wmacpi/.xvpics/master-new.xpm differ diff --git a/wmacpi/.xvpics/master.xpm b/wmacpi/.xvpics/master.xpm new file mode 100644 index 0000000..4b09bc3 Binary files /dev/null and b/wmacpi/.xvpics/master.xpm differ diff --git a/wmacpi/.xvpics/master_low.xpm b/wmacpi/.xvpics/master_low.xpm new file mode 100644 index 0000000..913957f Binary files /dev/null and b/wmacpi/.xvpics/master_low.xpm differ diff --git a/wmacpi/COPYING b/wmacpi/COPYING index d159169..f4f3ea5 100644 --- a/wmacpi/COPYING +++ b/wmacpi/COPYING @@ -1,339 +1,2 @@ - GNU GENERAL PUBLIC LICENSE - 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. - - - Copyright (C) - - 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. - - , 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. +#include + diff --git a/wmacpi/ChangeLog b/wmacpi/ChangeLog index b457789..69b6af9 100644 --- a/wmacpi/ChangeLog +++ b/wmacpi/ChangeLog @@ -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, + 2002 Feb 17 1.34 Updated ACPI statistics gathering code for the latest ACPI patch from Intel. Now uses/checks for subsystem version 20020214+. Redone the version diff --git a/wmacpi/Makefile b/wmacpi/Makefile index 79f379c..229ef5a 100644 --- a/wmacpi/Makefile +++ b/wmacpi/Makefile @@ -1,8 +1,7 @@ # set options. pick one, acpi or apm. comment out the other one. don't # uncomment both, bad things will happen :) -OPT = -O3 -DACPI -#OPT = -O3 -DAPM +OPT := -O2 # uncomment this to make wmacpi use less system colors (looks uglier too) #OPT += -DLOW_COLOR @@ -10,16 +9,41 @@ OPT = -O3 -DACPI # debugging options (don't bother with these) #OPT = -pg -g -DPRO -DACPI -CC = gcc -CFLAGS = $(OPT) -Wall -ansi -I/usr/X11R6/include -LDFLAGS = $(OPT) -L/usr/X11R6/lib -lX11 -lXpm -lXext +CC := gcc +CFLAGS := $(OPT) -Wall -W -g -ansi -I/usr/X11R6/include +LDFLAGS := $(OPT) -L/usr/X11R6/lib -lX11 -lXpm -lXext -SRCS = wmacpi.c libapm.c libacpi.c -OBJS = wmacpi.o libapm.o libacpi.o +WMSRC := wmacpi-ng.c libacpi.c +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: - 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) diff --git a/wmacpi/TODO b/wmacpi/TODO new file mode 100644 index 0000000..1aab3e8 --- /dev/null +++ b/wmacpi/TODO @@ -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, diff --git a/wmacpi/acpi-ng.c b/wmacpi/acpi-ng.c new file mode 100644 index 0000000..b2919e2 --- /dev/null +++ b/wmacpi/acpi-ng.c @@ -0,0 +1,125 @@ +/* + * acpi-ng: command line acpi battery status tool. + * + * Written by Simon Fowler , 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 +#include +#include +#include +#include + +#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; +} + diff --git a/wmacpi/debian/changelog b/wmacpi/debian/changelog new file mode 100644 index 0000000..527b8c0 --- /dev/null +++ b/wmacpi/debian/changelog @@ -0,0 +1,105 @@ +wmacpi-ng (0.50-1) unstable; urgency=low + + * New upstream version. + + -- Simon Fowler Sun, 6 Jul 2003 16:50:59 +1000 + +wmacpi-ng (0.19-1) unstable; urgency=low + + * New upstream version. + + -- Simon Fowler Wed, 2 Jul 2003 00:55:36 +1000 + +wmacpi-ng (0.15-1) unstable; urgency=low + + * New upstream version. + + -- Simon Fowler Tue, 24 Jun 2003 00:38:26 +1000 + +wmacpi-ng (0.14-1) unstable; urgency=low + + * New upstream version. + + -- Simon Fowler Tue, 24 Jun 2003 00:00:26 +1000 + +wmacpi-ng (0.13-1) unstable; urgency=low + + * New upstream version. + + -- Simon Fowler Mon, 23 Jun 2003 23:49:05 +1000 + +wmacpi-ng (0.12-1) unstable; urgency=low + + * New upstream version. + + -- Simon Fowler Sat, 21 Jun 2003 12:24:43 +1000 + +wmacpi-ng (0.11-1) unstable; urgency=low + + * New upstream version. + + -- Simon Fowler Fri, 30 May 2003 23:42:12 +1000 + +wmacpi-ng (0.10-1) unstable; urgency=low + + * New upstream version. + + -- Simon Fowler Fri, 30 May 2003 13:35:50 +1000 + +wmacpi-ng (0.2a-1) unstable; urgency=low + + * New upstream version. + + -- Simon Fowler Mon, 26 May 2003 22:08:45 +1000 + +wmacpi-ng (0.2-1) unstable; urgency=low + + * New version. + + -- Simon Fowler 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 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 Sat, 19 Apr 2003 17:09:11 +0200 + +wmacpi (1.33-1) unstable; urgency=low + + * New upstream release + + -- Simon Richter Mon, 28 May 2001 01:49:55 +0200 + +wmacpi (1.31-1) unstable; urgency=low + + * Initial Release (Closes: #90347). + + -- Simon Richter Mon, 19 Mar 2001 23:26:49 +0100 + diff --git a/wmacpi/debian/compat b/wmacpi/debian/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/wmacpi/debian/compat @@ -0,0 +1 @@ +4 diff --git a/wmacpi/debian/control b/wmacpi/debian/control new file mode 100644 index 0000000..d6d72a8 --- /dev/null +++ b/wmacpi/debian/control @@ -0,0 +1,21 @@ +Source: wmacpi-ng +Section: x11 +Priority: optional +Maintainer: Simon Fowler +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 + . + Author: Tim Copperfield + Homepage: http://www.ne.jp/asahi/linux/timecop/ diff --git a/wmacpi/debian/copyright b/wmacpi/debian/copyright new file mode 100644 index 0000000..dfd7321 --- /dev/null +++ b/wmacpi/debian/copyright @@ -0,0 +1,27 @@ +This package was debianized by Simon Richter on +Mon, 19 Mar 2001 23:26:49 +0100. +It was taken over by Sebastian Henschel on Sat, 19 Apr 2003 15:31:00 +0200. + +It was downloaded from http://www.ne.jp/asahi/linux/timecop/ + +Upstream Author: Timecop + +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'. + diff --git a/wmacpi/debian/dirs b/wmacpi/debian/dirs new file mode 100644 index 0000000..e772481 --- /dev/null +++ b/wmacpi/debian/dirs @@ -0,0 +1 @@ +usr/bin diff --git a/wmacpi/debian/docs b/wmacpi/debian/docs new file mode 100644 index 0000000..9bce069 --- /dev/null +++ b/wmacpi/debian/docs @@ -0,0 +1,3 @@ +README +AUTHORS +TODO \ No newline at end of file diff --git a/wmacpi/debian/menu b/wmacpi/debian/menu new file mode 100644 index 0000000..e76a272 --- /dev/null +++ b/wmacpi/debian/menu @@ -0,0 +1,2 @@ +?package(wmacpi-ng):needs=X11 section=Apps/System\ + title="wmacpi-ng" command="/usr/bin/wmacpi-ng" diff --git a/wmacpi/debian/rules b/wmacpi/debian/rules new file mode 100755 index 0000000..97fa83f --- /dev/null +++ b/wmacpi/debian/rules @@ -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 diff --git a/wmacpi/debian/watch b/wmacpi/debian/watch new file mode 100644 index 0000000..ff95adf --- /dev/null +++ b/wmacpi/debian/watch @@ -0,0 +1,2 @@ +version=2 +http://www.ne.jp/asahi/linux/timecop/software/wmacpi-(.*)\.tar\.gz debian uupdate diff --git a/wmacpi/debian/wmacpi-ng.1 b/wmacpi/debian/wmacpi-ng.1 new file mode 100644 index 0000000..800f506 --- /dev/null +++ b/wmacpi/debian/wmacpi-ng.1 @@ -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 % (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 . +.B wmacpi-ng +is a reworking of +.B wmacpi 1.34 +to support recent kernel versions, performed by Simon Fowler +. +.PP +This manual page was originally written by Simon Richter + for the Debian GNU/Linux system, and then updated for +.B wmacpi-ng +by Simon Fowler. +.br +Last modification by Simon Fowler , 2003-05-30. diff --git a/wmacpi/libacpi.c b/wmacpi/libacpi.c index 120a157..e619143 100644 --- a/wmacpi/libacpi.c +++ b/wmacpi/libacpi.c @@ -1,21 +1,16 @@ +#define _GNU_SOURCE + #include #include +#include #include #include #include -#include "wmacpi.h" +#include "libacpi.h" -#define MAXBATT 8 - -#ifdef ACPI -#ifdef PRO extern char *state[]; -#endif extern APMInfo *apminfo; -static char batteries[MAXBATT][128]; -static char battinfo[MAXBATT][128]; -int batt_count; /* temp buffer */ char buf[512]; @@ -29,7 +24,9 @@ int power_init(void) char buf[4096]; DIR *battdir; struct dirent *batt; - char *name; + char *name, *tmp1, *tmp2; + char *names[MAXBATT]; + int i, j; int acpi_ver = 0; if (!(acpi = fopen("/proc/acpi/info", "r"))) { @@ -40,7 +37,7 @@ int power_init(void) /* okay, now see if we got the right version */ fread(buf, 4096, 1, acpi); 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) { fprintf(stderr, "This version requires ACPI subsystem version 20020214\n"); fclose(acpi); @@ -58,149 +55,373 @@ int power_init(void) return 1; } 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; /* skip . and .. */ if (!strncmp(".", name, 1) || !strncmp("..", name, 2)) continue; - sprintf(batteries[batt_count], "/proc/acpi/battery/%s/state", name); - sprintf(battinfo[batt_count], "/proc/acpi/battery/%s/info", name); - eprint(1, "battery detected at %s\n", batteries[batt_count]); + names[batt_count] = strdup(name); batt_count++; } 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 */ - 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, (batt_count == 1) ? "y" : "ies"); return 0; } -int acpi_get_design_cap(int battery) +char *get_value(char *string) { - FILE *acpi; - char *ptr; - int design_cap; + char *retval; + int i; - if (battery > MAXBATT) - return -1; + if (string == NULL) + return NULL; - if (!(acpi = fopen(battinfo[battery], "r"))) - return -1; - - fread(buf, 512, 1, acpi); - fclose(acpi); + i = 0; + while (string[i] != ':') i++; + while (!isalnum(string[i])) i++; + retval = (string + i); - if ((ptr = strstr(buf, "last full capacity"))) { - ptr += 25; - sscanf(ptr, "%d", &design_cap); - eprint(1, "last full capacity: %d\n", design_cap); - } else { - /* hack. if there isnt any info on last capacity, we are - * screwed, but let's not come back here again */ - design_cap = -1; - eprint(1, "Cannot retrieve design capacity!"); - } - - return design_cap; + return retval; } -void acquire_info(void) +power_state_t get_power_status(void) { - FILE *acpi; - char *ptr; - char stat; - - static int dcap = 0xdeadbeef; - - int percent = 100; /* battery percentage */ - int ptemp, rate, rtime = 0; - - if (dcap == 0xdeadbeef) { - /* get from first battery for now */ - dcap = acpi_get_design_cap(0); + FILE *file; + char buf[1024]; + char *val; + + if ((file = fopen("/proc/acpi/ac_adapter/AC/state", "r")) == NULL) { + perror("Could not open /proc/acpi/ac_adapter/AC/state\n"); + return PS_ERR; } - 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; - - eprint(1, "opened acpi file successfully"); - fread(buf, 512, 1, acpi); - fclose(acpi); - - /* This section of the code will calculate "percentage remaining" - * using battery capacity, and the following formula (acpi spec 3.9.2): - * percentage = (current_capacity / last_full_capacity) * 100; */ - if ((ptr = strstr(buf, "remaining capacity"))) { - ptr += 25; - sscanf(ptr, "%d", &ptemp); - eprint(1, "capacity: %d\n", ptemp); - percent = (float)((float)ptemp / (float)dcap) * 100; - eprint(1, "percent: %d\n", percent); } - apminfo->percentage = percent; - /* this section of code will calculate "time remaining" - * using battery remaining capacity, and battery "rate" (3.9.3) */ - if ((ptr = strstr(buf, "present rate"))) { - ptr += 25; - sscanf(ptr, "%d", &rate); - eprint(1, "rate: %d\n", rate); - if (rate <= 0) - rate = 0; - /* time remaining in minutes */ - rtime = ((float)((float)ptemp / (float)rate)) * 60; - if (rtime <= 0) - rtime = 0; - eprint(1, "time rem: %d\n", rtime); + /* calculate the percentage remaining, using the values of + * remaining capacity and last full capacity, as outlined in + * the ACPI spec v2.0a, section 3.9.3. */ + { + rcap = (float)binfo->remaining_cap; + lfcap = (float)binfo->last_full_cap; + if (rcap <= 0) + rcap = 0; + if (lfcap <= 0) + lfcap = 1; + binfo->percentage = (int)((rcap/lfcap) * 100.0); + eprint(0, "percent: %d\n", binfo->percentage); } - apminfo->rtime = rtime; - if ((ptr = strstr(buf, "charging state"))) { - /* found battery discharging. This is used to determine if - * we are on AC power or not. Notice check for "ch" later on */ - stat = *(ptr + 25); - if (stat == 'o' || stat == 'u') /* "ok" | "unknown" : charged, on ac power */ - apminfo->power = POWER; - else - /* we set this, and later on use percentage - * value to determine high/med/low */ - apminfo->power = HIGH; + /* set the battery's capacity state, based (at present) on some + * guesstimated values: more than 75% == HIGH, 25% to 75% MED, and + * less than 25% is LOW. Less than apminfo->crit_level is CRIT. */ + if (binfo->percentage > 75) + binfo->state = HIGH; + else if (binfo->percentage > 25) + binfo->state = MED; + else + /* we only go to critical state if the battery is reporting + * critical itself . . . */ + binfo->state = LOW; - /* but if we are on power, we might be charging too. Check. */ - if ((ptr = strstr(buf, "charging state"))) { - /* found battery charging line. We will change power state - * if we are on power, and charging. */ - stat = *(ptr + 25); - /* this is seriously stupid - but we catch "critical" */ - if (stat == 'c' && (*(ptr + 26) == 'h')) - apminfo->power = CHARGING; + /* we need to /know/ that we've got a valid state for the + * apminfo->power value . . . .*/ + apminfo->power = get_power_status(); + + if ((apminfo->power != AC) && !binfo->charging) { + /* we're not on power, and not charging. So we might as well + * check if we're at a critical battery level, and calculate + * 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 - * to check if battery is "critical low", and calculate interesting - * things like battery HIGH/LOW, and maybe battery usage LOAD - * This will be replaced with some code to allow setting user-specified - * low / critical alarms */ - if ((apminfo->power != POWER) && (apminfo->power != CHARGING)) { - eprint(1, "entering battery status check"); - if ((ptr = strstr(buf, "capacity state"))) { - stat = *(ptr + 25); - /* only check "c" here because we already caught "CHarging" earlier - * and also look into crit_level */ - if (stat == 'c' || (apminfo->percentage <= apminfo->crit_level)) { - /* nothing else to do here - critical battery. get out */ - eprint(1, "Received critical battery status"); - apminfo->power = CRIT; + /* and finally, we tell anyone who wants to use this information + * that it's now valid . . .*/ + binfo->valid = 1; +} + +void acquire_all_batt_info(void) +{ + int i; + + for(i = 0; i < batt_count; i++) + acquire_batt_info(i); +} + +void acquire_global_info(void) +{ + int i; + int rtime; + float rcap = 0; + float rate = 0; + static float rate_samples[SAMPLES]; + static int j = 0; + static int sample_count = 0; + static int n = 0; + + /* calculate the time remaining, using the battery's remaining + * capacity and the reported burn rate (3.9.3). + * For added accuracy, we average the value over the last + * SAMPLES number of calls, or for anything less than this we + * simply report the raw number. */ + { + + for (i = 0; i < batt_count; i++) { + if (batteries[i].present && batteries[i].valid) { + rcap += (float)batteries[i].remaining_cap; + rate += (float)batteries[i].present_rate; } } - } - process_plugin_timer(); + rate_samples[j] = rate; + 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 */ diff --git a/wmacpi/libacpi.h b/wmacpi/libacpi.h new file mode 100644 index 0000000..0867711 --- /dev/null +++ b/wmacpi/libacpi.h @@ -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_ */ diff --git a/wmacpi/libapm.c b/wmacpi/libapm.c deleted file mode 100644 index 684da76..0000000 --- a/wmacpi/libapm.c +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include "wmacpi.h" - -#ifdef APM -#ifdef PRO -extern char *state[]; -#endif -extern APMInfo *apminfo; -extern int crit_level; - -int power_init(void) -{ - FILE *apm; - - if (!(apm = fopen("/proc/apm", "r"))) { - fprintf(stderr, "This system does not support APM\n"); - return 1; - } - fclose(apm); - - return 0; -} - -void acquire_info(void) -{ - FILE *apm; - char buf[256]; - char min[10]; - - int ac_line, batt, percent, rtime; - -#ifdef PRO - /* testing */ - if (!(apm = fopen("apm", "r"))) - return; -#else - if (!(apm = fopen("/proc/apm", "r"))) - return; -#endif - - fgets(buf, 255, apm); - sscanf(buf, "%*s %*s %*s %x %x %*s %d%% %d %s", - &ac_line, &batt, &percent, &rtime, min); - - eprint(0, "%02x %02x, %03d%%, %d", ac_line, batt, percent, rtime); - apminfo->percentage = percent; - apminfo->rtime = rtime; - - switch (ac_line) { - case 0: /* on battery. calculate status. handle charging under AC */ - switch (batt) { - case 0: - apminfo->power = HIGH; - break; - case 1: - apminfo->power = LOW; - break; - case 2: - apminfo->power = CRIT; - break; - } - - /* check user-defined critical alarm */ - if (apminfo->percentage <= apminfo->crit_level) - apminfo->power = CRIT; - - break; - case 1: /* on AC power. Check if battery is being charged */ -#ifdef RETARDED_APM - /* this is incase your battery is "charging" all the fucking time, - * even when it's actually done charging */ - if ((batt == 3) && (percent != 100)) -#else - if (batt == 3) -#endif - apminfo->power = CHARGING; - else - apminfo->power = POWER; - break; -#ifdef STUPID_APM - /* treatment for GAY apm bioses that show wrong time - * remaining when AC is plugged in */ - apminfo->rtime = 0; -#endif - } - fclose(apm); - process_plugin_timer(); - - eprint(1, "current state: %s (%d)", state[apminfo->power], apminfo->power); -} -#endif /* APM */ diff --git a/wmacpi/master.xpm b/wmacpi/master.xpm index 30c5d58..cb1cddd 100644 --- a/wmacpi/master.xpm +++ b/wmacpi/master.xpm @@ -1,6 +1,6 @@ /* XPM */ static char * master_xpm[] = { -"157 88 116 2", +"157 88 100 2", " c None", ". c #000000", "+ c #FF0000", @@ -97,26 +97,10 @@ static char * master_xpm[] = { ".. c #20B2AE", "+. c #004941", "@. c #188A86", -"#. c #DAF5B2", -"$. c #355600", -"%. c #FEFFFF", -"&. c #AAAFA9", -"*. c #315900", -"=. c #D0D2D1", -"-. c #FDFEF6", -";. c #FF2D00", -">. c #DA0710", -",. c #F3FFF9", -"'. c #A5F812", -"). c #A7ACB2", -"!. c #4F5354", -"~. c #87F91F", -"{. c #94F625", -"]. c #C0C6BC", -"^. c #22B2AE", -"/. c #027E72", -"(. c #034A40", -"_. c #107D79", +"#. c #22B2AE", +"$. c #107D79", +"%. c #027E72", +"&. c #034A40", " . + @ # $ % & * = - % ; > , ' % ) ! ~ { % ] ^ / ( % _ : < [ % } | 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[] = { " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", " . % % ......% % % +.+.+.@.% @.......@.% @.......@.% @.+.+.+.@.% @.......@.% @.......@.% @.......@.% @.......@.% @.......@.% % ..% % % % % % % ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % ..% ", -" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . #.$.$.. %.%.%.%.%.%.%.%.%.&.% ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% % ..% ..% % % @.% ", -" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` . % @.+.+.+.@.% % +.+.+.@.% @.......@.% % ......@.% @.......@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % ..% % % % % % ", -" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% % ..% ..% % % % % ", -" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . . . . . %.=.=.=.=.=.=.=.=.&.% ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% ..% ..% % ..% -.;.;. ", -" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . %.%.%.%.%.=.=.=.=.=.=.=.=.&.% ` . % % ......% % % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % % ..% % % @.% ;.;.;. ", -" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ;.;.>. ", -" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . ", -" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . . . . . . . . . . . . . . . . ` . . . . . . . . . . . . . . . . ` ", -" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % % ..........% % % % ....................% % % @.% % ......% % % ......% % % ..% % % % . ,.'.'.. ).).).).).).).).).!.% ` . #.$.$.. %.%.%.%.%.%.%.%.%.&.% ` ", -" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % ..% % % % ......% % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% . '.~.{.. ).].].].].].].].].!.% ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` ", -" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % % % ..% % % % ..% % % % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % . '.{.{.. ).].].].].].].].].!.% ` . $.*.*.. %.=.=.=.=.=.=.=.=.&.% ` ", -" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % % ......% % % % ..% % % % ..% % % % % % % % ....% % @.% @.+.+.+.@.% @.+.+.+.@.% % % ..% % % . . . . . ).].].].].].].].].!.% ` . . . . . %.=.=.=.=.=.=.=.=.&.% ` ", -" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` . % % ..% % ..% % % % ......% % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % . ).).).).).].].].].].].].].!.% ` . %.%.%.%.%.=.=.=.=.=.=.=.=.&.% ` ", -" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . %.&.&.&.&.&.&.&.&.&.&.&.&.&.% ` . % ..% % % % ..........% % % % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", -" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . . . . . . . . . . . . . . . % ` . % ..% % % % % % % % % % % % % ....................% % % @.% % ......% % % ......% % % % % ..% % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", -" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", -" . . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", -" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", -" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % % % % % +.+.+.+.+.% % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % +.% % % % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", -" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.+.+.% % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", -" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.% % % % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % . ).].].].].].].].].].].].].!.% ` . %.=.=.=.=.=.=.=.=.=.=.=.=.&.% ` ", -" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % +.+.+.% % % % +.% % % % +.% % % % % % % % +.+.% % % % % +.+.+.% % % +.+.+.% % % % +.% % % . ).!.!.!.!.!.!.!.!.!.!.!.!.!.% ` . %.&.&.&.&.&.&.&.&.&.&.&.&.&.% ` ", -" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % +.% % +.% % % % +.+.+.% % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % . . . . . . . . . . . . . . . % ` . . . . . . . . . . . . . . . % ` ", +" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % ..% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% ..% % % +.% ..% % % +.% +.% % % ..% ..% % % ..% ..% % % ..% % ..% ..% % % @.% ", +" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % @.+.+.+.@.% % +.+.+.@.% @.......@.% % ......@.% @.......@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % ..% % % % % % ", +" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` % % % % % % % % % +.+.+.+.% % % ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% % ..% ..% % % % % ", +" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % % % % % % % % +.% % % % +.% % ` . % ..% % % ..% +.% % % ..% ..% % % +.% +.% % % ..% +.% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% % % ..% +.% % % ..% ..% ..% ..% % ..% ", +" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % #.#.#.#.% % % +.% % % % +.% % ` . % % ......% % % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % +.+.+.@.% @.......@.% @.......@.% % % % ..% % % @.% ", +" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", +" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . ", +" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` % #.% % % #.% % % +.+.+.+.% % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % . . . . . . . . . . . . . . . . ` . . . . . . . . . . . . . . . . ` ", +" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.#.#.#.% % % +.% % % % +.% % ` . % % % % % % ..........% % % % ....................% % % @.% % ......% % % ......% % % ..% % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ", +" . % % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % % % ..% % % % ......% % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ", +" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % % % ..% % % % ..% % % % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % % % % % % % % % % +.+.+.+.$.% % ` % % % % % % % % $.........@.% % ` ", +" . % % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ` % #.% % % #.% % +.% % % % +.% % ` . % % % ......% % % % ..% % % % ..% % % % % % % % ....% % @.% @.+.+.+.@.% @.+.+.+.@.% % % ..% % % % % % % % % % % +.% % % % ..% % ` % % % % % % % % +.% % % % ..% % ` ", +" . % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ` % #.#.#.#.% % % % +.+.+.+.% % % ` . % % ..% % ..% % % % ......% % ..% % % % % % % % ....% % ..% ..% % % ..% ..% % % ..% % ..% ..% % % #.#.#.#.% % % +.% % % % ..% % ` % #.#.#.#.% % % +.% % % % ..% % ` ", +" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % % ..........% % % % ..% % % % % % % % ..% % % ..% ..% % % ..% ..% % % ..% ..% ..% ..% % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % +.% % % % ..% % ` ", +" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` . % ..% % % % % % % % % % % % % ....................% % % @.% % ......% % % ......% % % % % ..% % % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % +.% % % % ..% % ` ", +" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % #.% % % #.% % % +.+.+.+.$.% % ` % #.% % % #.% % $.........$.% % ` ", +" . % #.#.#.#.% % % +.% % % % ..% % ` % #.#.#.#.% % % ..% % % % +.% % ` ", +" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % ..% % % % +.% % ` ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % % % % % +.+.+.+.+.% % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % +.% % % % % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % ..% % % % +.% % ` ", +" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.+.+.% % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% % #.% % % #.% % +.% % % % ..% % ` % #.% % % #.% % ..% % % % +.% % ` ", +" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % +.% % % % +.% % % % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % % #.#.#.#.% % % % +.+.+.+.$.% % ` % #.#.#.#.% % % $.........$.% % ` ", +" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % +.+.+.% % % % +.% % % % +.% % % % % % % % +.+.% % % % % +.+.+.% % % +.+.+.% % % % +.% % % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ", +" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % +.% % +.% % % % +.+.+.% % +.% % % % % % % % +.+.% % +.% +.% % % +.% +.% % % +.% % +.% +.% % % % % % % % % % % % % % % % % % ` % % % % % % % % % % % % % % % % ` ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % +.% % % % +.+.+.+.+.% % % % +.% % % % % % % % +.% % % +.% +.% % % +.% +.% % % +.% +.% +.% +.% ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % +.% % % % % % % % % % % % % +.+.+.+.+.+.+.+.+.+.% % % % % % +.+.+.% % % +.+.+.% % % % % +.% % ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . ", " . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", -" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % ^.^.^.% % % % % % /.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % % % % % % % % ", -" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % ^.% % % ^.% % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % % % % % % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % % % % % % % % % % % % % % % ", -" . % ^.% % % ^.% % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % % % % % % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % % % % % % % % % % % % % % % ", -" . % /.% % % /.% % % % % /.% /.^.^.^./.% % ^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% % % % % /.% (.^.^.^.(.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % % ", -" . % ^.% % % ^.% % % % % ^.% ^.% % % % % % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% % % % % % % % % % % % % % % % % % % ", -" . % ^.% % % ^.% % % % % ^.% ^.% % % % % % % % % ^.% % % % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% ^.% % % ^.% % % % % ^.% % % % % % % % % % % % % % % % % % % ", -". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % ^.^.^.% % % % % % ^.% /.^.^.^./.% /.^.^.^./.% % % % % /.% /.^.^.^./.% /.^.^.^./.% % % % % /.% /.^.^.^./.% /.^.^.^./.% % % % % % % % % % % % % % % % % ^.% ", +" . % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ` . % % #.#.#.% % % % % % %.% %.#.#.#.%.% %.#.#.#.%.% %.% % % %.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% % % % % % % % % % % % % % % % % % % ", +" ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` . % #.% % % #.% % % % % #.% % % % % #.% % % % % #.% #.% % % #.% #.% % % % % #.% % % % % % % % % #.% #.% % % #.% #.% % % #.% % % % % % % % % % % % % % % % % % % ", +" . % #.% % % #.% % % % % #.% % % % % #.% % % % % #.% #.% % % #.% #.% % % % % #.% % % % % % % % % #.% #.% % % #.% #.% % % #.% % % % % % % % % % % % % % % % % % % ", +" . % %.% % % %.% % % % % %.% %.#.#.#.%.% % #.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% % % % % %.% &.#.#.#.&.% %.#.#.#.%.% %.#.#.#.%.% % % % % % % % % % % % % ", +" . % #.% % % #.% % % % % #.% #.% % % % % % % % % #.% % % % % #.% % % % % #.% #.% % % #.% % % % % #.% #.% % % #.% % % % % #.% % % % % % % % % % % % % % % % % % % ", +" . % #.% % % #.% % % % % #.% #.% % % % % % % % % #.% % % % % #.% % % % % #.% #.% % % #.% % % % % #.% #.% % % #.% % % % % #.% % % % % % % % % % % % % % % % % % % ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % % #.#.#.% % % % % % #.% %.#.#.#.%.% %.#.#.#.%.% % % % % %.% %.#.#.#.%.% %.#.#.#.%.% % % % % %.% %.#.#.#.%.% %.#.#.#.%.% % % % % % % % % % % % % % % % % #.% ", " % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", "% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", -"% (.^.^.^.(.% /.^.^.^.% % /.^.^.^./.% /.^.^.^.% % /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% % % /.% % % % % % % /.% /.% % % /.% /.% % % % % ^.% % % ^.% /.^.^.^.% % /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.^.^.^./.% /.% % % /.% /.% % % /.% /.% % % /.% /.% % % /.% /.% % % /.% /.^.^.^./.% ", -"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % % % ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % % ^.% ^.% % % % % ^.^.% ^.^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% % % % % ^.% ", -"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % % % ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % ^.(.% ^.% % % % % ^.% ^.% ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% (.^.% ^.(.% ^.% % % ^.% % % % ^.(.% ", -"% /.^.^.^./.% /.^.^.^.% % /.% % % % % /.% % % /.% /.^.^.^.% % /.^.^.^.% % /.(.^.^./.% /.^.^.^./.% % % /.% % % % % % % /.% /.^.^.(.% % /.% % % % % /.% % % /.% /.% % % /.% /.% % % /.% /.^.^.^./.% /.^.% % /.% /.^.^.^.% % /.^.^.^./.% % % /.% % % /.% % % /.% /.% % % /.% /.% % % /.% % (.^.(.% % /.^.^.^./.% % (.^.(.% % ", -"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % ^.% ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % ^.(.% ^.% % % % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% ^.% ^.% ^.% % % ^.% % % % % ^.% % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.% ^.% ^.% (.^.% ^.(.% % % % % ^.% (.^.% % % % ", -"% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % % % ^.% % % % % ^.% % % ^.% ^.% % % ^.% % % ^.% % % % % % % ^.% ^.% % % ^.% ^.% % % % % ^.% % % ^.% ^.% % % ^.% ^.% % % ^.% ^.% % % % % ^.% % ^.^.% ^.% % % ^.% % % % % ^.% % % ^.% % % ^.% % % ^.% ^.% % % ^.% ^.^.% ^.^.% ^.% % % ^.% % % % % ^.% ^.% % % % % ", -"% /.% % % /.% /.^.^.^.% % /.^.^.^./.% ^.^.^.^.% % /.^.^.^./.% ^.% % % % % /.^.^.^./.% /.% % % /.% % % ^.% % % /.^.^.^./.% /.% % % /.% /.^.^.^.(.% /.% % % /.% ^.% % % ^.% /.^.^.^./.% /.% % % % % /.^.^.^./.% /.% % % /.% /.^.^.^./.% % % /.% % % (.^.^.^.^.% % ^.^.^.% % ^.% % % ^.% /.% % % ^.% /.^.^.^./.% /.^.^.^./.% ", +"% &.#.#.#.&.% %.#.#.#.% % %.#.#.#.%.% %.#.#.#.% % %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.% % % %.% % % %.% % % % % % % %.% %.% % % %.% %.% % % % % #.% % % #.% %.#.#.#.% % %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.#.#.#.%.% %.% % % %.% %.% % % %.% %.% % % %.% %.% % % %.% %.% % % %.% %.#.#.#.%.% ", +"% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % % % #.% % % #.% % % #.% % % % % % % #.% #.% % % #.% #.% % % % % #.#.% #.#.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % % % #.% % % #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% % % % % #.% ", +"% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % % % #.% % % #.% % % #.% % % % % % % #.% #.% % #.&.% #.% % % % % #.% #.% #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % % % #.% % % #.% % % #.% #.% % % #.% #.% % % #.% &.#.% #.&.% #.% % % #.% % % % #.&.% ", +"% %.#.#.#.%.% %.#.#.#.% % %.% % % % % %.% % % %.% %.#.#.#.% % %.#.#.#.% % %.&.#.#.%.% %.#.#.#.%.% % % %.% % % % % % % %.% %.#.#.&.% % %.% % % % % %.% % % %.% %.% % % %.% %.% % % %.% %.#.#.#.%.% %.#.% % %.% %.#.#.#.% % %.#.#.#.%.% % % %.% % % %.% % % %.% %.% % % %.% %.% % % %.% % &.#.&.% % %.#.#.#.%.% % &.#.&.% % ", +"% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % #.% #.% % % #.% % % #.% % % % % % % #.% #.% % #.&.% #.% % % % % #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % #.% #.% #.% #.% % % #.% % % % % #.% % % #.% % % #.% % % #.% #.% % % #.% #.% #.% #.% &.#.% #.&.% % % % % #.% &.#.% % % % ", +"% #.% % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % % % #.% % % % % #.% % % #.% #.% % % #.% % % #.% % % % % % % #.% #.% % % #.% #.% % % % % #.% % % #.% #.% % % #.% #.% % % #.% #.% % % % % #.% % #.#.% #.% % % #.% % % % % #.% % % #.% % % #.% % % #.% #.% % % #.% #.#.% #.#.% #.% % % #.% % % % % #.% #.% % % % % ", +"% %.% % % %.% %.#.#.#.% % %.#.#.#.%.% #.#.#.#.% % %.#.#.#.%.% #.% % % % % %.#.#.#.%.% %.% % % %.% % % #.% % % %.#.#.#.%.% %.% % % %.% %.#.#.#.&.% %.% % % %.% #.% % % #.% %.#.#.#.%.% %.% % % % % %.#.#.#.%.% %.% % % %.% %.#.#.#.%.% % % %.% % % &.#.#.#.#.% % #.#.#.% % #.% % % #.% %.% % % #.% %.#.#.#.%.% %.#.#.#.%.% ", "% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", "% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ", -"% % ........% % % +.+.+.+._.% _.........@.% _........._.% _.+.+.+.+._.% _........._.% _.........@.% _........._.% _.........@.% _.........@.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % % ^.+.+.+.^.% ", -"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ^.% ^.% ^.+.% ", -"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % +.^.% ^.% +.% ", -"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% ^.% ^.+.% ", -"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.^.% ^.% ^.% ", -"% _.+.+.+.+._.% % +.+.+.+._.% _........._.% _........._.% _........._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % % % % % _.+.+.+.+._.% _.+.+.+.+._.% % % % % _.+.+.+.+._.% _.+.+.+.+._.% % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ^.+.+.+.^.% % ", +"% % ........% % % +.+.+.+.$.% $.........@.% $.........$.% $.+.+.+.+.$.% $.........$.% $.........@.% $.........$.% $.........@.% $.........@.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % % #.+.+.+.#.% ", +"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % #.% #.% #.+.% ", +"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % +.#.% #.% +.% ", +"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% #.% #.+.% ", +"% ..% % % % ..% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% ..% % % % +.% ..% % % % +.% +.% % % % ..% ..% % % % ..% ..% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.#.% #.% #.% ", +"% $.+.+.+.+.$.% % +.+.+.+.$.% $.........$.% $.........$.% $.........$.% $.........$.% $.........$.% % +.+.+.+.$.% $.........$.% $.........$.% % % % % % $.+.+.+.+.$.% $.+.+.+.+.$.% % % % % $.+.+.+.+.$.% $.+.+.+.+.$.% % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % #.+.+.+.#.% % ", "% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % +.% % % % +.% ", -"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % ^.^.^.^.^.+.% ", -"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ^.% % % ^.^.% ", -"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % ^.% % % ^.^.% ", -"% % ........% % % +.+.+.+._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % +.+.+.+._.% _........._.% _........._.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % ^.^.^.^.^.% % ", +"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % % % % % ..% % % % ..% ..% % % % ..% % % % % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % % % % +.% % % % +.% +.% % % % +.% % #.#.#.#.#.+.% ", +"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % #.% % % #.#.% ", +"% ..% % % % ..% +.% % % % ..% ..% % % % +.% +.% % % % ..% +.% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% ..% % % % ..% +.% % % % ..% % ..% % % ..% % % % ..% ..% % % % ..% % ..% % ..% % % % ..% ..% % % % ..% % +.% % % % +.% +.% % % % +.% % +.% % +.% % % % +.% +.% % % % +.% % #.% % % #.#.% ", +"% % ........% % % +.+.+.+.$.% $.........$.% $.........$.% % +.+.+.+.$.% $.........$.% $.........$.% % +.+.+.+.$.% $.........$.% $.........$.% % % % % % % ........% % % ........% % % % % % % ........% % % ........% % % % +.+.+.+.% % % +.+.+.+.% % % % % % % +.+.+.+.% % % +.+.+.+.% % % #.#.#.#.#.% % ", "% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % "}; diff --git a/wmacpi/master_low.xpm b/wmacpi/master_low.xpm index 2156b41..03ca81d 100644 --- a/wmacpi/master_low.xpm +++ b/wmacpi/master_low.xpm @@ -1,6 +1,6 @@ /* XPM */ -static char * master_xpm[] = { -"157 88 20 1", +static char * master_low_xpm[] = { +"157 88 18 1", " c None", ". c #000000", "+ c #FF0000", @@ -14,13 +14,11 @@ static char * master_xpm[] = { "- c #20B2AE", "; c #004941", "> c #188A86", -", c #D0D2D1", -"' c #FEFFFF", -") c #4F5354", -"! c #22B2AE", -"~ c #027E72", -"{ c #034A40", -"] c #107D79", +", c #22B2AE", +"' c #C7C7C7", +") c #107D79", +"! c #027E72", +"~ c #034A40", " . ++++@++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ", " . ++++@++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ", " . ++++@++++@++++@####@####@####@####@$$$$@$$$$@$$$$@$$$$ ", @@ -51,61 +49,61 @@ static char * master_xpm[] = { " . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ", " . @@---@@@;;;>@>--->@>--->@>;;;>@>--->@>--->@>--->@>--->@>--->@@-@@@@@@@ ", " ..................................... ................= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@-@-@-@@-@ ", -" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= .,**.'''''''''=@= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@@-@-@@@>@ ", -" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= .***.',,,,,,,,=@= . @>;;;>@@;;;>@>--->@@--->@>--->@>--->@>--->@@;;;>@>--->@>--->@@@-@@@@@@ ", -" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= .***.',,,,,,,,=@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@@-@-@@@@@ ", -" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .....',,,,,,,,=@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@-@-@-@@-@ ,++ ", -" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .''''',,,,,,,,=@= . @@---@@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@@@-@@@>@ +++ ", -" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +++ ", -" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . ", -" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= .',,,,,,,,,,,,=@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ................= ................= ", -" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@@-----@@@ @----------@@ @>@@---@@@---@@@-@@@@ .,$$.))))))))))@= .,**.'''''''''=@= ", -" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@-@@@@---@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ .$$$.),,,,,,,,=@= .***.',,,,,,,,=@= ", -" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@@@-@@@@-@@@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ .$$$.),,,,,,,,=@= .***.',,,,,,,,=@= ", -" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= .',,,,,,,,,,,,=@= . @@@---@@@@-@@@ @-@@@@@@@@--@ @>@>;;;>@>;;;>@@@-@@@ .....),,,,,,,,=@= .....',,,,,,,,=@= ", -" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= .',,,,,,,,,,,,=@= . @@-@@-@@@@---@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ .))))),,,,,,,,=@= .''''',,,,,,,,=@= ", -" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= .'=============@= . @-@@@@-----@@@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", -" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= ...............@= . @-@@@@@@@@@@@@ @----------@@ @>@@---@@@---@@@@@-@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", -" ===================================== ================= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", -" . .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", -" . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", -" ........................................................ . @@@@@@;;;;;@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@;@@@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", -" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;;;@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", -" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;@@@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ .),,,,,,,,,,,,=@= .',,,,,,,,,,,,=@= ", -" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@;;;@@@@;@@@ @;@@@@@@@@;;@ @@@@;;;@@@;;;@@@@;@@@ .)=============@= .'=============@= ", -" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@;@@;@@@@;;;@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ ...............@= ...............@= ", -" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@;;;;;@@@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ ================= ================= ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @-@@@-@;@@@-@;@@@-@;@@@-@-@@@-@-@@@;@-@@@;@;@@@-@-@@@-@-@@@-@@-@-@@@>@ ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @>;;;>@@;;;>@>--->@@--->@>--->@>--->@>--->@@;;;>@>--->@>--->@@@-@@@@@@ ", +" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= @@@@@@@@@;;;;@@@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@@-@-@@@@@ ", +" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @@@@@@@@;@@@@;@@= . @-@@@-@;@@@-@-@@@;@;@@@-@;@@@-@;@@@-@-@@@-@;@@@-@-@@@-@;@@@-@-@-@-@@-@ ", +" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @,,,,@@@;@@@@;@@= . @@---@@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@;;;>@>--->@>--->@@@@-@@@>@ ", +" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ", +" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . ", +" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= @,@@@,@@@;;;;@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ................' ................' ", +" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,,,,@@@;@@@@;@@= . @@@@@@-----@@@ @----------@@ @>@@---@@@---@@@-@@@@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ", +" .@@;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@@@-@@@@---@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ", +" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@@@-@@@@-@@@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ @@@@@@@@@;;;;)@@' @@@@@@@@)---->@@' ", +" .@@;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@@= @,@@@,@@;@@@@;@@= . @@@---@@@@-@@@ @-@@@@@@@@--@ @>@>;;;>@>;;;>@@@-@@@ @@@@@@@@;@@@@-@@' @@@@@@@@;@@@@-@@' ", +" .@@@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@@= @,,,,@@@@;;;;@@@= . @@-@@-@@@@---@ @-@@@@@@@@--@ @-@-@@@-@-@@@-@@-@-@@ @,,,,@@@;@@@@-@@' @,,,,@@@;@@@@-@@' ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @-@@@@-----@@@ @-@@@@@@@@-@@ @-@-@@@-@-@@@-@-@-@-@ @,@@@,@@;@@@@-@@' @,@@@,@@;@@@@-@@' ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@@@= . @-@@@@@@@@@@@@ @----------@@ @>@@---@@@---@@@@@-@@ @,@@@,@@;@@@@-@@' @,@@@,@@;@@@@-@@' ", +" ===================================== ================= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @,@@@,@@@;;;;)@@' @,@@@,@@)----)@@' ", +" . @,,,,@@@;@@@@-@@' @,,,,@@@-@@@@;@@' ", +" . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @,@@@,@@;@@@@-@@' @,@@@,@@-@@@@;@@' ", +" ........................................................ . @@@@@@;;;;;@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@;@@@@ @,@@@,@@;@@@@-@@' @,@@@,@@-@@@@;@@' ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;;;@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ @,@@@,@@;@@@@-@@' @,@@@,@@-@@@@;@@' ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@;@@@@;@@@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ @,,,,@@@@;;;;)@@' @,,,,@@@)----)@@' ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@;;;@@@@;@@@ @;@@@@@@@@;;@ @@@@;;;@@@;;;@@@@;@@@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@;@@;@@@@;;;@ @;@@@@@@@@;;@ @;@;@@@;@;@@@;@@;@;@@ @@@@@@@@@@@@@@@@' @@@@@@@@@@@@@@@@' ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@;;;;;@@@ @;@@@@@@@@;@@ @;@;@@@;@;@@@;@;@;@;@ ''''''''''''''''' ''''''''''''''''' ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @;@@@@@@@@@@@@ @;;;;;;;;;;@@ @@@@;;;@@@;;;@@@@@;@@ ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . ", " .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@ ", -" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@!!!@@@@@@~@~!!!~@~!!!~@~@@@~@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@@@@@@@@@@@@@ @@@@@@ ", -" ======================================================== . @!@@@!@@@@@!@@@@@!@@@@@!@!@@@!@!@@@@@!@@@@@@@@@!@!@@@!@!@@@!@@@@@@@@@@@@@ @@@@@@ ", -" . @!@@@!@@@@@!@@@@@!@@@@@!@!@@@!@!@@@@@!@@@@@@@@@!@!@@@!@!@@@!@@@@@@@@@@@@@ @@@@@@ ", -" . @~@@@~@@@@@~@~!!!~@@!!!~@~!!!~@~!!!~@~!!!~@@@@@~@{!!!{@~!!!~@~!!!~@@@@@@@ @@@@@@ ", -" . @!@@@!@@@@@!@!@@@@@@@@@!@@@@@!@@@@@!@!@@@!@@@@@!@!@@@!@@@@@!@@@@@@@@@@@@@ @@@@@@ ", -" . @!@@@!@@@@@!@!@@@@@@@@@!@@@@@!@@@@@!@!@@@!@@@@@!@!@@@!@@@@@!@@@@@@@@@@@@@ @@@@@@ ", -"................................................................. @@!!!@@@@@@!@~!!!~@~!!!~@@@@@~@~!!!~@~!!!~@@@@@~@~!!!~@~!!!~@@@@@@@@@@@@@ @@@@!@ ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@= . @@,,,@@@@@@!@!,,,!@!,,,!@!@@@!@!,,,!@!,,,!@!,,,!@!,,,!@!,,,!@@@@@@@@@@@@@ @@@@@@ ", +" ======================================================== . @,@@@,@@@@@,@@@@@,@@@@@,@,@@@,@,@@@@@,@@@@@@@@@,@,@@@,@,@@@,@@@@@@@@@@@@@ @@@@@@ ", +" . @,@@@,@@@@@,@@@@@,@@@@@,@,@@@,@,@@@@@,@@@@@@@@@,@,@@@,@,@@@,@@@@@@@@@@@@@ @@@@@@ ", +" . @!@@@!@@@@@!@!,,,!@@,,,!@!,,,!@!,,,!@!,,,!@@@@@!@~,,,~@!,,,!@!,,,!@@@@@@@ @@@@@@ ", +" . @,@@@,@@@@@,@,@@@@@@@@@,@@@@@,@@@@@,@,@@@,@@@@@,@,@@@,@@@@@,@@@@@@@@@@@@@ @@@@@@ ", +" . @,@@@,@@@@@,@,@@@@@@@@@,@@@@@,@@@@@,@,@@@,@@@@@,@,@@@,@@@@@,@@@@@@@@@@@@@ @@@@@@ ", +"................................................................. @@,,,@@@@@@,@!,,,!@!,,,!@@@@@!@!,,,!@!,,,!@@@@@!@!,,,!@!,,,!@@@@@@@@@@@@@ @@@@,@ ", " @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", -"@{!!!{@~!!!@@~!!!~@~!!!@@~!!!~@~!!!~@~!!!~@~@@@~@@@~@@@@@@@~@~@@@~@~@@@@@!@@@!@~!!!@@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@~!!!~@~@@@~@~@@@~@~@@@~@~@@@~@~@@@~@~!!!~@", -"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@@@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@!!@!!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@@@@@!@@@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@@@@@!@", -"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@@@!@@@!@@@!@@@@@@@!@!@@!{@!@@@@@!@!@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@@@@@!@@@!@@@!@!@@@!@!@@@!@{!@!{@!@@@!@@@@!{@", -"@~!!!~@~!!!@@~@@@@@~@@@~@~!!!@@~!!!@@~{!!~@~!!!~@@@~@@@@@@@~@~!!{@@~@@@@@~@@@~@~@@@~@~@@@~@~!!!~@~!@@~@~!!!@@~!!!~@@@~@@@~@@@~@~@@@~@~@@@~@@{!{@@~!!!~@@{!{@@", -"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@!@!@@@!@@@!@@@@@@@!@!@@!{@!@@@@@!@@@!@!@@@!@!@@@!@!@@@@@!@!@!@!@@@!@@@@@!@@@!@@@!@@@!@!@@@!@!@!@!@{!@!{@@@@@!@{!@@@@", -"@!@@@!@!@@@!@!@@@@@!@@@!@!@@@@@!@@@@@!@@@!@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@!@@@!@!@@@!@!@@@!@!@@@@@!@@!!@!@@@!@@@@@!@@@!@@@!@@@!@!@@@!@!!@!!@!@@@!@@@@@!@!@@@@@", -"@~@@@~@~!!!@@~!!!~@!!!!@@~!!!~@!@@@@@~!!!~@~@@@~@@@!@@@~!!!~@~@@@~@~!!!{@~@@@~@!@@@!@~!!!~@~@@@@@~!!!~@~@@@~@~!!!~@@@~@@@{!!!!@@!!!@@!@@@!@~@@@!@~!!!~@~!!!~@", +"@~,,,~@!,,,@@!,,,!@!,,,@@!,,,!@!,,,!@!,,,!@!@@@!@@@!@@@@@@@!@!@@@!@!@@@@@,@@@,@!,,,@@!,,,!@!,,,!@!,,,!@!,,,!@!,,,!@!,,,!@!@@@!@!@@@!@!@@@!@!@@@!@!@@@!@!,,,!@", +"@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@@@,@@@,@@@,@@@@@@@,@,@@@,@,@@@@@,,@,,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@@@@@,@@@,@@@,@,@@@,@,@@@,@,@@@,@,@@@,@@@@@,@", +"@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@@@,@@@,@@@,@@@@@@@,@,@@,~@,@@@@@,@,@,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@,@,@@@@@@@,@@@,@@@,@,@@@,@,@@@,@~,@,~@,@@@,@@@@,~@", +"@!,,,!@!,,,@@!@@@@@!@@@!@!,,,@@!,,,@@!~,,!@!,,,!@@@!@@@@@@@!@!,,~@@!@@@@@!@@@!@!@@@!@!@@@!@!,,,!@!,@@!@!,,,@@!,,,!@@@!@@@!@@@!@!@@@!@!@@@!@@~,~@@!,,,!@@~,~@@", +"@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@,@,@@@,@@@,@@@@@@@,@,@@,~@,@@@@@,@@@,@,@@@,@,@@@,@,@@@@@,@,@,@,@@@,@@@@@,@@@,@@@,@@@,@,@@@,@,@,@,@~,@,~@@@@@,@~,@@@@", +"@,@@@,@,@@@,@,@@@@@,@@@,@,@@@@@,@@@@@,@@@,@,@@@,@@@,@@@@@@@,@,@@@,@,@@@@@,@@@,@,@@@,@,@@@,@,@@@@@,@@,,@,@@@,@@@@@,@@@,@@@,@@@,@,@@@,@,,@,,@,@@@,@@@@@,@,@@@@@", +"@!@@@!@!,,,@@!,,,!@,,,,@@!,,,!@,@@@@@!,,,!@!@@@!@@@,@@@!,,,!@!@@@!@!,,,~@!@@@!@,@@@,@!,,,!@!@@@@@!,,,!@!@@@!@!,,,!@@@!@@@~,,,,@@,,,@@,@@@,@!@@@,@!,,,!@!,,,!@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@", -"@@----@@@;;;;]@]---->@]----]@];;;;]@]----]@]---->@]----]@]---->@]---->@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @@!;;;!@", -"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@!@!;@", -"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @;!@!@;@", -"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@!@!;@", -"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;!@!@!@", -"@];;;;]@@;;;;]@]----]@]----]@]----]@]----]@]----]@@;;;;]@]----]@]----]@@@@@ @];;;;]@];;;;]@@@@@];;;;]@];;;;]@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @!;;;!@@", +"@@----@@@;;;;)@)---->@)----)@);;;;)@)----)@)---->@)----)@)---->@)---->@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @@,;;;,@", +"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @,@,@,;@", +"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @;,@,@;@", +"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@,@,;@", +"@-@@@@-@;@@@@-@;@@@@-@;@@@@-@-@@@@-@-@@@@;@-@@@@;@;@@@@-@-@@@@-@-@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;,@,@,@", +"@);;;;)@@;;;;)@)----)@)----)@)----)@)----)@)----)@@;;;;)@)----)@)----)@@@@@ @);;;;)@);;;;)@@@@@);;;;)@);;;;)@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @,;;;,@@", "@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @;@@@@;@", -"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @!!!!!;@", -"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@@@!!@", -"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @!@@@!!@", -"@@----@@@;;;;]@]----]@]----]@@;;;;]@]----]@]----]@@;;;;]@]----]@]----]@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @!!!!!@@", +"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@@@@ @-@@@@-@-@@@@-@@@@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@@@@;@@@@;@;@@@@;@ @,,,,,;@", +"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @,@@@,,@", +"@-@@@@-@;@@@@-@-@@@@;@;@@@@-@;@@@@-@;@@@@-@-@@@@-@;@@@@-@-@@@@-@;@@@@-@@-@@ @-@@@@-@-@@@@-@@-@@-@@@@-@-@@@@-@ @;@@@@;@;@@@@;@@;@@;@@@@;@;@@@@;@ @,@@@,,@", +"@@----@@@;;;;)@)----)@)----)@@;;;;)@)----)@)----)@@;;;;)@)----)@)----)@@@@@ @@----@@@----@@@@@@@----@@@----@@ @@;;;;@@@;;;;@@@@@@@;;;;@@@;;;;@@ @,,,,,@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@"}; diff --git a/wmacpi/wmacpi.c b/wmacpi/wmacpi-ng.c similarity index 64% rename from wmacpi/wmacpi.c rename to wmacpi/wmacpi-ng.c index 36bc574..4d968dd 100644 --- a/wmacpi/wmacpi.c +++ b/wmacpi/wmacpi-ng.c @@ -13,14 +13,9 @@ * * 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. + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* #define RETARDED_APM */ -/* #define STUPID_APM */ -/* see README if you need to #define these or not. No user serviceable - * parts below */ - #define _GNU_SOURCE #include @@ -37,11 +32,10 @@ #include #include -#include "wmacpi.h" +#include "libacpi.h" +#include "wmacpi-ng.h" -#if defined(ACPI) && defined(APM) -# error Cannot compile with ACPI and APM compiled in. Please select only one. -#endif +#define WMACPI_NG_VER "0.50" /* main pixmap */ #ifdef LOW_COLOR @@ -85,9 +79,7 @@ static void redraw_window(void); static void render_text(char *string); static void scroll_text(int x, int y, int width, int tw, int reset); static void display_percentage(int percent); -static void display_state(void); static void display_time(int minutes); -static void blink_button(Mode mode); #define copy_xpm_area(x, y, w, h, dx, dy) \ { \ @@ -96,10 +88,34 @@ static void blink_button(Mode mode); 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) { if (dockapp->update) { - eprint(1, "redrawing window"); + eprint(0, "redrawing window"); XCopyArea(dockapp->display, dockapp->pixmap, dockapp->iconwin, dockapp->gc, 0, 0, 64, 64, 0, 0); XCopyArea(dockapp->display, dockapp->pixmap, dockapp->win, @@ -203,7 +219,7 @@ static void render_text(char *string) if (strlen(string) > 53) return; - eprint(1, "rendering: %s", string); + eprint(0, "rendering: %s", string); /* prepare the text area by clearing it */ 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; - eprint(0, "scrolling"); - if (pos > 0) { copy_xpm_area(66, 9, pos, 7, x, y); /* clear */ 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 int op = -1, obar; + static int op = -1; + static unsigned int obar; unsigned int bar; - eprint(1, "received: %d\n", percent); + eprint(0, "received: %d\n", percent); if (op == percent) return; @@ -365,107 +380,168 @@ static void display_time(int minutes) 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; - static int docharging; - static int dobattery; - static int docritical; - static int counter; - - switch (apminfo->power) { - case POWER: - eprint(0, "selected ac power case"); - if (!dopower) { - dopower = 1; - docharging = 0; - dobattery = 0; - dockapp->blink = OFF; - copy_xpm_area(67, 38, 12, 7, 6, 17); - copy_xpm_area(82, 48, 11, 7, 20, 17); - render_text("On AC power"); + enum panel_states power = PS_NULL; + static int counter = 0; + battery *binfo = apminfo->binfo; + + if (apminfo->power == AC) { + if (power != PS_AC) { + power = PS_AC; + kill_battery_glyph(); + display_power_glyph(); } - break; - case CHARGING: - eprint(0, "selected charging case"); - counter++; - if (counter == 10) { - copy_xpm_area(67, 38, 12, 7, 6, 17); - } else if (counter == 20) { - copy_xpm_area(67, 48, 12, 7, 6, 17); + } else if (apminfo->power == BATT) { + if (power != PS_BATT) { + power = PS_BATT; + kill_power_glyph(); + display_battery_glyph(); } - 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; - if (!docharging) { - render_text("Battery is charging"); - /* get rid of battery symbol */ - copy_xpm_area(82, 48, 12, 7, 20, 17); - /* housekeeping */ - dockapp->blink = OFF; - docharging = 1; - dopower = 0; - dobattery = 0; + counter++; + } + + if (binfo->capacity_state == CRITICAL) { + if (counter == 10) + display_battery_glyph(); + else if (counter == 20) + kill_battery_glyph(); + 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; - case HIGH: - case LOW: - case CRIT: - eprint(0, "selected battery case"); - if (!dobattery) { - render_text("On Battery"); - /* display battery symbol */ - copy_xpm_area(82, 38, 12, 7, 20, 17); - /* get rid of AC power symbol */ - copy_xpm_area(67, 48, 12, 7, 6, 17); - dobattery = 1; - dopower = 0; - docharging = 0; - } - if (apminfo->power == CRIT) { - dockapp->blink = BLINK; - if (!docritical) { - render_text("Battery Critical Low"); - docritical = 1; + } else if (apminfo->power == AC) { + if (binfo->charging) { + if (state != M_CH) { + state = M_CH; + render_text("battery charging"); } } else { - if (docritical) { - render_text("On Battery"); - docritical = 0; + if (state != M_AC) { + state = M_AC; + 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; } } -static void blink_button(Mode mode) +void usage(char *name) { - static int counter; - static int clear; + printf("%s - help\t\t[timecop@japan.co.jp]\n\n" + "-d display\t\tdisplay on remote display \n" + "-b\t\t\tmake noise when battery is critical low (beep)\n" + "-c value\t\tset critical low alarm at percent\n" + "\t\t\t(default: 10 percent)\n" + "-m \tbattery number to monitor\n" + "-v\t\t\tincrease verbosity.\n" + "-h\t\t\tdisplay this help\n", + name); +} - if ((mode == OFF) && !clear) { - eprint(0, "we are off"); - copy_xpm_area(136, 38, 3, 3, 44, 30); - clear = 1; - return; - } - if (mode != BLINK) - return; - - counter++; - - if (counter == 5) { - copy_xpm_area(137, 33, 3, 3, 44, 30); - clear = 0; - } else if (counter == 10) { - copy_xpm_area(136, 38, 3, 3, 44, 30); - clear = 0; - /* make some noise */ - if (noisy_critical) - XBell(dockapp->display, 100); - } - if (counter > 10) - counter = 0; +void print_version(void) +{ + printf("wmacpi-ng version %s\n", WMACPI_NG_VER); + printf(" Using libacpi version %s\n", LIBACPI_VER); } int main(int argc, char **argv) @@ -473,21 +549,22 @@ int main(int argc, char **argv) char *display = NULL; char ch; int update = 0; + battery *binfo; dockapp = calloc(1, sizeof(Dockapp)); apminfo = calloc(1, sizeof(APMInfo)); dockapp->blink = OFF; apminfo->crit_level = 10; + battery_no = 1; /* see if whatever we want to use is supported */ - if (power_init()) { + if (power_init()) /* power_init functions handle printing error messages */ exit(1); - } /* parse command-line options */ - while ((ch = getopt(argc, argv, "bd:c:h")) != EOF) { + while ((ch = getopt(argc, argv, "bd:c:m:hvV")) != EOF) { switch (ch) { case 'b': noisy_critical = 1; @@ -506,18 +583,38 @@ int main(int argc, char **argv) if (optarg) display = strdup(optarg); break; - case 'h': - printf("wmacpi - help\t\t[timecop@japan.co.jp]\n\n" - "-d display\t\tdisplay on remote display \n" - "-b\t\t\tmake noise when battery is critical low (beep)\n" - "-c value\t\tset critical low alarm at percent\n" - "\t\t\t(default: 10 percent)\n" - "-h\t\t\tdisplay this help\n"); - return 0; + case 'm': + if (optarg) { + battery_no = atoi(optarg); + if (battery_no >= MAXBATT) { + fprintf(stderr, "Please specify a battery number below %d\n", + MAXBATT); + return 1; + } + 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; + 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 */ if (open_display(display)) @@ -527,8 +624,11 @@ int main(int argc, char **argv) new_window("apm"); /* 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; /* main loop */ @@ -549,40 +649,22 @@ int main(int argc, char **argv) exit(0); break; case ButtonPress: - /* press event */ - if (event.xbutton.x >= 44 && event.xbutton.x <= 57 && - event.xbutton.y >= 30 && event.xbutton.y <= 43) { - eprint(0, "inside button!"); - dockapp->pressed = 1; - copy_xpm_area(118, 38, 15, 15, 44, 30); - } break; case ButtonRelease: - /* release event */ - if (event.xbutton.x >= 44 && event.xbutton.x <= 57 && - event.xbutton.y >= 30 && event.xbutton.y <= 43 && - dockapp->pressed) { - /* handle button press */ - eprint(0, "release still inside button!"); - dockapp->pressed = 0; - copy_xpm_area(136, 38, 15, 15, 44, 30); - if ((apminfo->power != POWER) && (apminfo->power != CHARGING)) { - dockapp->dspmode = !dockapp->dspmode; - eprint(1, "Mode: %d", dockapp->dspmode); - } - /* end button press handler */ - } - if (dockapp->pressed) { - copy_xpm_area(136, 38, 15, 15, 44, 30); - dockapp->pressed = 0; - } + /* cycle through the known batteries. */ + battery_no++; + battery_no = battery_no % batt_count; + apminfo->binfo = &batteries[battery_no]; + binfo = apminfo->binfo; + fprintf(stderr, "changing to monitor battery %d\n", battery_no + 1); + set_batt_id_area(battery_no); break; } } if (update++ == 30) { - eprint(1, "polling apm"); - acquire_info(); + eprint(0, "polling apm"); + acquire_all_info(); update = 0; } @@ -591,18 +673,24 @@ int main(int argc, char **argv) count = 0; } - /* it's okay to test here because display_time will not draw anything - * unless there is a change. Also if we switched power states from - * battery to charging/etc, we need to exit from "timer" mode */ - if (dockapp->dspmode == REMAIN || apminfo->power == POWER || apminfo->power == CHARGING) { + /* the old code had some kind of weird crap with timers and the like. + * As far as I can tell, it's meaningless - the time we want to display + * is the time calculated from the remaining capacity, as per the + * 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); - } else { - display_time((time(NULL) - apminfo->timer) / 60); - } - - display_state(); - blink_button(dockapp->blink); - display_percentage(apminfo->percentage); + set_power_panel(); + set_message(); + display_percentage(binfo->percentage); scroll_text(6, 50, 52, dockapp->tw, 0); /* redraw_window, if anything changed - determined inside @@ -612,23 +700,3 @@ int main(int argc, char **argv) } return 0; } - -/* this handles enabling "on-battery" timer. It only needs to happen once - * for each unplug event. Functions from libapm and libacpi call this to - * start the timer */ -void process_plugin_timer(void) -{ - static int timer; - - if ((apminfo->power != POWER) && (apminfo->power != CHARGING) && !timer) { - eprint(1, "not AC and not charging, and timer is not started"); - eprint(1, "starting battery timer"); - apminfo->timer = time(NULL); - timer = 1; - } - if (((apminfo->power == POWER) || (apminfo->power == CHARGING)) && timer) { - eprint(1, "disabling battery timer"); - timer = 0; - } - -} diff --git a/wmacpi/wmacpi-ng.h b/wmacpi/wmacpi-ng.h new file mode 100644 index 0000000..a49acdf --- /dev/null +++ b/wmacpi/wmacpi-ng.h @@ -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_ */ diff --git a/wmacpi/wmacpi.h b/wmacpi/wmacpi.h deleted file mode 100644 index e9c15a5..0000000 --- a/wmacpi/wmacpi.h +++ /dev/null @@ -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_ */