[Pkg-wmaker-commits] [wmbattery] 120/241: wmbattery (2.41) unstable; urgency=low

Doug Torrance dtorrance-guest at moszumanska.debian.org
Mon Aug 24 23:37:44 UTC 2015


This is an automated email from the git hooks/post-receive script.

dtorrance-guest pushed a commit to branch master
in repository wmbattery.

commit 2a4bc742a1fa67ce6338be38cfb5670c6d826a4d
Author: Joey Hess <joeyh at debian.org>
Date:   Fri Mar 30 10:20:17 2012 -0400

    wmbattery (2.41) unstable; urgency=low
    
      * Accumulated packaging modernizations. Closes: #666370
    
    # imported from the archive
---
 GPL                  | 340 ++++++++++++++++++++++++++++
 INSTALL              | 195 ++++++++++++++++
 Makefile             |  42 ++++
 README               |  40 ++++
 TODO                 |  11 +
 acpi.c               | 444 ++++++++++++++++++++++++++++++++++++
 acpi.h               |  67 ++++++
 apm.h                |  27 +++
 autoconf/install-sh  | 250 ++++++++++++++++++++
 autoconf/makeinfo.in |  18 ++
 battery_blink.xpm    |  19 ++
 battery_high.xpm     |  19 ++
 battery_low.xpm      |  20 ++
 battery_medium.xpm   |  20 ++
 battery_none.xpm     |  18 ++
 bigfont.xpm          |  17 ++
 charging.xpm         |  19 ++
 config.h.in          |   9 +
 configure.ac         |  44 ++++
 debian/changelog     | 515 +++++++++++++++++++++++++++++++++++++++++
 debian/compat        |   1 +
 debian/control       |  25 ++
 debian/copyright     |  12 +
 debian/docs          |   2 +
 debian/menu          |   2 +
 debian/rules         |  11 +
 dial_bright.xpm      |  43 ++++
 dial_dim.xpm         |  43 ++++
 face.xpm             |  74 ++++++
 mask.xbm             |  46 ++++
 nocharging.xpm       |  18 ++
 plugged.xpm          |  17 ++
 simplehal.c          | 223 ++++++++++++++++++
 simplehal.h          |   2 +
 smallfont.xpm        |  16 ++
 sonypi.c             |  74 ++++++
 sonypi.h             |  19 ++
 unplugged.xpm        |  17 ++
 wmbattery.1x         | 108 +++++++++
 wmbattery.c          | 629 +++++++++++++++++++++++++++++++++++++++++++++++++++
 wmbattery.h          |  70 ++++++
 41 files changed, 3586 insertions(+)

diff --git a/GPL b/GPL
new file mode 100644
index 0000000..b7b5f53
--- /dev/null
+++ b/GPL
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+	51 Franklin St, 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 Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+

+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+

+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+

+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+

+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+

+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..6255a97
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,195 @@
+Quickstart:
+
+   make
+   make install
+
+To install in the same location as previous version's Makefile did,
+run configure like this:
+
+  ./configure --prefix=/usr/X11R6 --datadir=/usr/share
+
+Note that you will need libxpm to build and use the program.
+
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.in' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory.  After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..70d39fe
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,42 @@
+include makeinfo
+
+all: wmbattery
+
+clean:
+	rm -f wmbattery *.o
+
+distclean: clean
+	rm -f config.status config.cache config.log makeinfo config.h configure
+
+install: all
+	$(INSTALL) -d $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir) $(DESTDIR)$(icondir)
+	$(INSTALL_PROGRAM) wmbattery $(DESTDIR)$(bindir)
+	$(INSTALL_DATA) $(srcdir)/wmbattery.1x $(DESTDIR)$(man1dir)/wmbattery.1x
+	$(INSTALL_DATA) $(srcdir)/*.xpm $(DESTDIR)$(icondir)
+
+uninstall:
+	rm -rf $(bindir)/wmbattery $(man1dir)/wmbattery.1x $(icondir)
+
+OBJS=wmbattery.o acpi.o sonypi.o
+
+ifdef USE_HAL
+LIBS+=$(shell pkg-config --libs hal)
+OBJS+=simplehal.o
+CFLAGS+=-DHAL
+simplehal.o: simplehal.c
+	$(CC) $(CFLAGS) $(shell pkg-config --cflags hal) -c simplehal.c -o simplehal.o
+endif
+
+wmbattery: $(OBJS)
+	$(CC) -o wmbattery $(LDFLAGS) $(OBJS) $(LIBS)
+
+wmbattery.o: wmbattery.c wmbattery.h
+
+configure: configure.ac
+	autoconf
+
+config.status: configure
+	./configure
+
+makeinfo: autoconf/makeinfo.in config.status
+	./config.status
diff --git a/README b/README
new file mode 100644
index 0000000..2d145dc
--- /dev/null
+++ b/README
@@ -0,0 +1,40 @@
+wmbattery displays the status of your laptop's battery in a small icon. This
+includes if it is plugged in, if the battery is charging, how many minutes
+of battery life remain, battery life remaining (with both a percentage and a
+graph), and battery status (high - green, low - yellow, or critical - red).
+
+wmbattery is based on wmapm by Chris D. Faulhaber <jedgar at speck.ml.org>
+-- see the copyright file for more information.
+
+wmapm is a nice program - why have I modified it into wmbattery? Here are
+some improvements in wmbattery:
+
+  - Improved icon layout. I crammed the same information into less space
+    while making the icon more elegant and visually pleasing (IMHO).
+  - Easier to drag onto dock.
+  - It consumes a little less memory.
+  - Uses only 10 colors.
+  - You can run in on a different display via -d (broken in wmapm).
+  - Support for getting battery status from the sonypi driver instead of APM,
+    for some Sony laptops that do not have apm support.
+  - ACPI support, including multiple battery support and battery charging
+    completion countdown timer.
+  - HAL support.
+  - Can make its own estimatess of time remaining or time until full
+    charge, even if APM does not.
+
+Conversely, here are some reasons to stick with wmapm:
+
+  - You like its look.
+  - It has a neat rainbow-colored progress bar.
+  - It has buttons to suspend the laptop and stuff.
+  - It may be more actively and/or better maintained. Or not. 
+    Decide for yourself.
+
+Still, forking is evil, and if I was doing this all over again, I suppose
+I'd try to add theme support to wmamn so it could morph into wmbattery with
+a theme. Oh well.
+
+The homepage for wmbattery is <http://kitenet.net/~joey/code/wmbattery/>
+
+-- Joey Hess <joey at kitenet.net>
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..7b41755
--- /dev/null
+++ b/TODO
@@ -0,0 +1,11 @@
+* The dial doesn't fill up/drain out very prettily. Add some code to special
+  case things so it looks better.
+* Make it load up the mask from file, not #include it.
+* Allow user-settable colors, like asclock does.
+* Improve the battery lifetime estimation algo.
+* Break the ACPI code out into a proper standalone library (already 2 other
+  programs use it).
+* Make -b 0 display an overall average of the status of all batteries,
+  much like apm does on multi-battery laptops.
+* The simplehal interface is not very good. It polls once per second, 
+  it would be much better if it let HAL notify it about changes instead.
diff --git a/acpi.c b/acpi.c
new file mode 100644
index 0000000..667888a
--- /dev/null
+++ b/acpi.c
@@ -0,0 +1,444 @@
+/* 
+ * A not-yet-general-purpose ACPI library, by Joey Hess <joey at kitenet.net>
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <string.h>
+#ifdef ACPI_APM
+#include "apm.h"
+#endif
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "acpi.h"
+
+#define PROC_ACPI "/proc/acpi"
+#define ACPI_MAXITEM 8
+
+int acpi_batt_count = 0;
+/* Filenames of the battery info files for each system battery. */
+char acpi_batt_info[ACPI_MAXITEM][128];
+/* Filenames of the battery status files for each system battery. */
+char acpi_batt_status[ACPI_MAXITEM][128];
+/* Stores battery capacity, or 0 if the battery is absent. */
+int acpi_batt_capacity[ACPI_MAXITEM];
+
+int acpi_ac_count = 0;
+char acpi_ac_adapter_info[ACPI_MAXITEM][128];
+char acpi_ac_adapter_status[ACPI_MAXITEM][128];
+
+/* These are the strings used in the ACPI shipped with the 2.4 kernels */
+char *acpi_labels_old[] = {
+	"info",
+	"status",
+	"battery",
+	"ac_adapter",
+	"on-line",
+	"Design Capacity:",
+	"Present:",
+	"Remaining Capacity:",
+	"Present Rate:",
+	"State:",
+#if ACPI_THERMAL
+	"thermal",
+#endif
+	"Status:",
+	NULL
+};
+
+/* These are the strings used in ACPI in the 2.5 kernels, circa version
+ * 20020214 */
+char *acpi_labels_20020214[] = {
+	"info",
+	"state",
+	"battery",
+	"ac_adapter",
+	"on-line",
+	"design capacity:",
+	"present:",
+	"remaining capacity:",
+	"present rate:",
+	"charging state:",
+#if ACPI_THERMAL
+	"thermal_zone",
+#endif
+	"state:",
+	"last full capacity:",
+	NULL
+};
+
+char **acpi_labels = NULL;
+
+#if ACPI_THERMAL
+int acpi_thermal_count = 0;
+char acpi_thermal_info[ACPI_MAXITEM][128];
+char acpi_thermal_status[ACPI_MAXITEM][128];
+#endif
+
+/* Read in an entire ACPI proc file (well, the first 1024 bytes anyway), and
+ * return a statically allocated array containing it. */
+inline char *get_acpi_file (const char *file) {
+	int fd;
+	int end;
+	static char buf[1024];
+	fd = open(file, O_RDONLY);
+	if (fd == -1) return NULL;
+	end = read(fd, buf, sizeof(buf));
+	buf[end-1] = '\0';
+	close(fd);
+	return buf;
+}
+
+/* Given a buffer holding an acpi file, searches for the given key in it,
+ * and returns the numeric value. 0 is returned on failure. */
+inline int scan_acpi_num (const char *buf, const char *key) {
+	char *ptr;
+	int ret;
+	if ((ptr = strstr(buf, key))) {
+		if (sscanf(ptr + strlen(key), "%d", &ret) == 1)
+			return ret;
+	}
+	return 0;
+}
+
+/* Given a buffer holding an acpi file, searches for the given key in it,
+ * and returns its value in a statically allocated string. */
+inline char *scan_acpi_value (const char *buf, const char *key) {
+	char *ptr;
+	static char ret[256];
+	
+	if ((ptr = strstr(buf, key))) {
+		if (sscanf(ptr + strlen(key), "%255s", ret) == 1)
+			return ret;
+	}
+	return NULL;
+}
+
+/* Read an ACPI proc file, pull out the requested piece of information, and
+ * return it (statically allocated string). Returns NULL on error, This is 
+ * the slow, dumb way, fine for initialization or if only one value is needed
+ * from a file, slow if called many times. */
+char *get_acpi_value (const char *file, const char *key) {
+	char *buf = get_acpi_file(file);
+	if (! buf) return NULL;
+	return scan_acpi_value(buf, key);
+}
+
+/* Returns the maximum capacity of a battery.
+ *
+ * Note that this returns the highest possible capacity for the battery,
+ * even if it can no longer charge that fully. So normally it uses the
+ * design capacity. While the last full capacity of the battery should
+ * never exceed the design capacity, some silly hardware might report
+ * that it does. So if the last full capacity is greater, it will be
+ * returned.
+ */
+int get_acpi_batt_capacity(int battery) {
+	int dcap, lcap;
+	char *s;
+
+	s=get_acpi_value(acpi_batt_info[battery], acpi_labels[label_design_capacity]);
+	if (s == NULL)
+		dcap=0; /* battery not present */
+	else
+		dcap=atoi(s);
+
+	/* This is ACPI's broken way of saying that there is no battery. */
+	if (dcap == 655350)
+		return 0;
+
+	s=get_acpi_value(acpi_batt_info[battery], acpi_labels[label_last_full_capacity]);
+	if (s != NULL) {
+		lcap=atoi(s);
+		if (lcap > dcap)
+			return lcap;
+	}
+
+	return dcap;
+}
+
+/* Comparison function for qsort. */
+int _acpi_compare_strings (const void *a, const void *b) {
+	const char **pa = (const char **)a;
+	const char **pb = (const char **)b;
+	return strcasecmp((const char *)*pa, (const char *)*pb);
+}
+
+/* Find something (batteries, ac adpaters, etc), and set up a string array
+ * to hold the paths to info and status files of the things found.
+ * Returns the number of items found. */
+int find_items (char *itemname, char infoarray[ACPI_MAXITEM][128],
+		                char statusarray[ACPI_MAXITEM][128]) {
+	DIR *dir;
+	struct dirent *ent;
+	int num_devices=0;
+	int i;
+	char **devices = malloc(ACPI_MAXITEM * sizeof(char *));
+	
+	char pathname[128];
+
+	sprintf(pathname,PROC_ACPI "/%s",itemname);
+
+	dir = opendir(pathname);
+	if (dir == NULL)
+		return 0;
+	while ((ent = readdir(dir))) {
+		if (!strcmp(".", ent->d_name) || 
+		    !strcmp("..", ent->d_name))
+			continue;
+
+		devices[num_devices]=strdup(ent->d_name);
+		num_devices++;
+		if (num_devices >= ACPI_MAXITEM)
+			break;
+	}
+	closedir(dir);
+	
+	/* Sort, since readdir can return in any order. /proc/ does
+	 * sometimes list BATT2 before BATT1. */
+	qsort(devices, num_devices, sizeof(char *), _acpi_compare_strings);
+
+	for (i = 0; i < num_devices; i++) {
+		sprintf(infoarray[i], PROC_ACPI "/%s/%s/%s", itemname, devices[i],
+			acpi_labels[label_info]);
+		sprintf(statusarray[i], PROC_ACPI "/%s/%s/%s", itemname, devices[i],
+			acpi_labels[label_status]);
+		free(devices[i]);
+	}
+
+	return num_devices;
+}
+
+/* Find batteries, return the number, and set acpi_batt_count to it as well. */
+int find_batteries(void) {
+	int i;
+	acpi_batt_count = find_items(acpi_labels[label_battery], acpi_batt_info, acpi_batt_status);
+	for (i = 0; i < acpi_batt_count; i++)
+		acpi_batt_capacity[i] = get_acpi_batt_capacity(i);
+	return acpi_batt_count;
+}
+
+/* Find AC power adapters, return the number found, and set acpi_ac_count to it
+ * as well. */
+int find_ac_adapters(void) {
+	acpi_ac_count = find_items(acpi_labels[label_ac_adapter], acpi_ac_adapter_info, acpi_ac_adapter_status);
+	return acpi_ac_count;
+}
+
+#if ACPI_THERMAL
+/* Find thermal information sources, return the number found, and set
+ * thermal_count to it as well. */
+int find_thermal(void) {
+	acpi_thermal_count = find_items(acpi_labels[label_thermal], acpi_thermal_info, acpi_thermal_status);
+	return acpi_thermal_count;
+}
+#endif
+
+/* Returns true if the system is on ac power. Call find_ac_adapters first. */
+int on_ac_power (void) {
+	int i;
+	for (i = 0; i < acpi_ac_count; i++) {
+                char *online=get_acpi_value(acpi_ac_adapter_status[i], acpi_labels[label_ac_state]);
+		if (online && strcmp(acpi_labels[label_online], online) == 0)
+			return 1;
+		else
+			return 0;
+	}
+	return 0;
+}
+
+/* See if we have ACPI support and check version. Also find batteries and
+ * ac power adapters. */
+int acpi_supported (void) {
+	char *version;
+	DIR *dir;
+	int num;
+
+	if (!(dir = opendir(PROC_ACPI))) {
+		return 0;
+	}
+	closedir(dir);
+	
+	/* If kernel is 2.6.21 or newer, version is in
+	   /sys/module/acpi/parameters/acpica_version */
+	
+	version = get_acpi_file("/sys/module/acpi/parameters/acpica_version");
+	if (version == NULL) {
+		version = get_acpi_value(PROC_ACPI "/info", "ACPI-CA Version:");
+		if (version == NULL) {
+			/* 2.5 kernel acpi */
+			version = get_acpi_value(PROC_ACPI "/info", "version:");
+		}
+	}
+	if (version == NULL) {
+		return 0;
+	}
+	num = atoi(version);
+	if (num < ACPI_VERSION) {
+		fprintf(stderr, "ACPI subsystem %s too is old, consider upgrading to %i.\n",
+				version, ACPI_VERSION);
+		return 0;
+	}
+	else if (num >= 20020214) {
+		acpi_labels = acpi_labels_20020214;
+	}
+	else {
+		acpi_labels = acpi_labels_old;
+	}
+	
+	find_batteries();
+	find_ac_adapters();
+#if ACPI_THERMAL
+	find_thermal();
+#endif
+	
+	return 1;
+}
+
+#ifdef ACPI_APM
+/* Read ACPI info on a given power adapter and battery, and fill the passed
+ * apm_info struct. */
+int acpi_read (int battery, apm_info *info) {
+	char *buf, *state;
+	
+	if (acpi_batt_count == 0) {
+		info->battery_percentage = 0;
+		info->battery_time = 0;
+		info->battery_status = BATTERY_STATUS_ABSENT;
+		acpi_batt_capacity[battery] = 0;
+		/* Where else would the power come from, eh? ;-) */
+		info->ac_line_status = 1;
+		return 0;
+	}
+	
+	/* Internally it's zero indexed. */
+	battery--;
+	
+	buf = get_acpi_file(acpi_batt_status[battery]);
+	if (buf == NULL) {
+		fprintf(stderr, "unable to read %s\n", acpi_batt_status[battery]);
+		perror("read");
+		exit(1);
+	}
+
+	info->ac_line_status = 0;
+	info->battery_flags = 0;
+	info->using_minutes = 1;
+	
+	/* Work out if the battery is present, and what percentage of full
+	 * it is and how much time is left. */
+	if (strcmp(scan_acpi_value(buf, acpi_labels[label_present]), "yes") == 0) {
+		int pcap = scan_acpi_num(buf, acpi_labels[label_remaining_capacity]);
+		int rate = scan_acpi_num(buf, acpi_labels[label_present_rate]);
+
+		if (rate) {
+			/* time remaining = (current_capacity / discharge rate) */
+			info->battery_time = (float) pcap / (float) rate * 60;
+		}
+		else {
+			char *rate_s = scan_acpi_value(buf, acpi_labels[label_present_rate]);
+			if (! rate_s) {
+				/* Time remaining unknown. */
+				info->battery_time = 0;
+			}
+			else {
+				/* a zero or unknown in the file; time 
+				 * unknown so use a negative one to
+				 * indicate this */
+				info->battery_time = -1;
+			}
+		}
+
+		state = scan_acpi_value(buf, acpi_labels[label_charging_state]);
+		if (state) {
+			if (state[0] == 'd') { /* discharging */
+				info->battery_status = BATTERY_STATUS_CHARGING;
+				/* Expensive ac power check used here
+				 * because AC power might be on even if a
+				 * battery is discharging in some cases. */
+				info->ac_line_status = on_ac_power();
+			}
+			else if (state[0] == 'c' && state[1] == 'h') { /* charging */
+				info->battery_status = BATTERY_STATUS_CHARGING;
+				info->ac_line_status = 1;
+				info->battery_flags = info->battery_flags | BATTERY_FLAGS_CHARGING;
+				if (rate)
+					info->battery_time = -1 * (float) (acpi_batt_capacity[battery] - pcap) / (float) rate * 60;
+				else
+					info->battery_time = 0;
+				if (abs(info->battery_time) < 0.5)
+					info->battery_time = 0;
+			}
+			else if (state[0] == 'o') { /* ok */
+				/* charged, on ac power */
+				info->battery_status = BATTERY_STATUS_HIGH;
+				info->ac_line_status = 1;
+			}
+			else if (state[0] == 'c') { /* not charging, so must be critical */
+				info->battery_status = BATTERY_STATUS_CRITICAL;
+				/* Expensive ac power check used here
+				 * because AC power might be on even if a
+				 * battery is critical in some cases. */
+				info->ac_line_status = on_ac_power();
+			}
+			else if (rate == 0) {
+				/* if rate is null, battery charged, on
+				 * ac power */
+				info->battery_status = BATTERY_STATUS_HIGH;
+				info->ac_line_status = 1;
+			}
+			else {
+				fprintf(stderr, "unknown battery state: %s\n", state);
+			}
+		}
+		else {
+			/* Battery state unknown. */
+			info->battery_status = BATTERY_STATUS_ABSENT;
+		}
+		
+		if (acpi_batt_capacity[battery] == 0) {
+			/* The battery was absent, and now is present.
+			 * Well, it might be a different battery. So
+			 * re-probe the battery. */
+			/* NOTE that this invalidates buf. No accesses of
+			 * buf below this point! */
+			acpi_batt_capacity[battery] = get_acpi_batt_capacity(battery);
+		}
+		else if (pcap > acpi_batt_capacity[battery]) {
+			/* Battery is somehow charged to greater than max
+			 * capacity. Rescan for a new max capacity. */
+			find_batteries();
+		}
+		
+		if (pcap && acpi_batt_capacity[battery]) {
+			/* percentage = (current_capacity / max capacity) * 100 */
+			info->battery_percentage = (float) pcap / (float) acpi_batt_capacity[battery] * 100;
+		}
+		else {
+			info->battery_percentage = -1;
+		}
+
+	}
+	else {
+		info->battery_percentage = 0;
+		info->battery_time = 0;
+		info->battery_status = BATTERY_STATUS_ABSENT;
+		acpi_batt_capacity[battery] = 0;
+		if (acpi_batt_count == 0) {
+			/* Where else would the power come from, eh? ;-) */
+			info->ac_line_status = 1;
+		}
+		else {
+			/* Expensive ac power check. */
+			info->ac_line_status = on_ac_power();
+		}
+	}
+	
+	return 0;
+}
+#endif
diff --git a/acpi.h b/acpi.h
new file mode 100644
index 0000000..d6347e1
--- /dev/null
+++ b/acpi.h
@@ -0,0 +1,67 @@
+/* 
+ * A not-yet-general-purpose ACPI library, by Joey Hess <joey at kitenet.net>
+ */
+
+/* Define ACPI_THERMAL to make the library support finding info about thermal
+ * sources. */
+//#define ACPI_THERMAL 1
+
+/* Define ACPI_APM to get the acpi_read function, which is like apm_read. */
+//#define ACPI_APM 1
+
+/* The lowest version of ACPI proc files supported. */
+#define ACPI_VERSION 20011018
+
+/* The number of acpi items of each class supported. */
+#define ACPI_MAXITEM 8
+
+int acpi_supported (void);
+#ifdef ACPI_APM
+int acpi_read (int battery, apm_info *info);
+#endif
+char *get_acpi_file (const char *file);
+int scan_acpi_num (const char *buf, const char *key);
+char *scan_acpi_value (const char *buf, const char *key);
+char *get_acpi_value (const char *file, const char *key);
+int get_acpi_batt_capacity(int battery);
+
+extern int acpi_batt_count;
+/* Filenames of the battery info files for each system battery. */
+extern char acpi_batt_info[ACPI_MAXITEM][128];
+/* Filenames of the battery status files for each system battery. */
+extern char acpi_batt_status[ACPI_MAXITEM][128];
+/* Stores battery capacity, or 0 if the battery is absent. */
+extern int acpi_batt_capacity[ACPI_MAXITEM];
+
+extern int acpi_ac_count;
+extern char acpi_ac_adapter_info[ACPI_MAXITEM][128];
+extern char acpi_ac_adapter_status[ACPI_MAXITEM][128];
+
+#if ACPI_THERMAL
+extern int acpi_thermal_count;
+extern char acpi_thermal_info[ACPI_MAXITEM][128];
+extern char acpi_thermal_status[ACPI_MAXITEM][128];
+#endif
+
+/* This enum is used to index into the acpi_labels */
+enum acpi_labels_items {
+	label_info,
+	label_status,
+	label_battery,
+	label_ac_adapter,
+	label_online,
+	label_design_capacity,
+	label_present,
+	label_remaining_capacity,
+	label_present_rate,
+	label_charging_state,
+#if ACPI_THERMAL
+	label_thermal,
+#endif
+	label_ac_state,
+	label_last_full_capacity,
+};
+
+/* This is set to point to a list of strings used for the given acpi
+ *  * version. */
+extern char **acpi_labels;
diff --git a/apm.h b/apm.h
new file mode 100644
index 0000000..a5aec22
--- /dev/null
+++ b/apm.h
@@ -0,0 +1,27 @@
+#include <apm.h>
+
+/* Symbolic constants for apm may be in system apm.h, or may not. */
+#ifndef AC_LINE_STATUS_ON
+#define AC_LINE_STATUS_OFF      (0)
+#define AC_LINE_STATUS_ON       (1)
+#define AC_LINE_STATUS_BACKUP   (2)
+#define AC_LINE_STATUS_UNKNOWN  (0xff)
+
+#define BATTERY_STATUS_HIGH     (0)
+#define BATTERY_STATUS_LOW      (1)
+#define BATTERY_STATUS_CRITICAL (2)
+#define BATTERY_STATUS_CHARGING (3)
+#define BATTERY_STATUS_ABSENT   (4)
+#define BATTERY_STATUS_UNKNOWN  (0xff)
+
+#define BATTERY_FLAGS_HIGH      (0x1)
+#define BATTERY_FLAGS_LOW       (0x2)
+#define BATTERY_FLAGS_CRITICAL  (0x4)
+#define BATTERY_FLAGS_CHARGING  (0x8)
+#define BATTERY_FLAGS_ABSENT    (0x80)
+ 
+#define BATTERY_PERCENTAGE_UNKNOWN  (-1)
+
+#define BATTERY_TIME_UNKNOWN        (-1)
+#endif /* AC_LINE_STATUS_ON */
+
diff --git a/autoconf/install-sh b/autoconf/install-sh
new file mode 100755
index 0000000..ebc6691
--- /dev/null
+++ b/autoconf/install-sh
@@ -0,0 +1,250 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+	-c) instcmd="$cpprog"
+	    shift
+	    continue;;
+
+	-d) dir_arg=true
+	    shift
+	    continue;;
+
+	-m) chmodcmd="$chmodprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-o) chowncmd="$chownprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-g) chgrpcmd="$chgrpprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-s) stripcmd="$stripprog"
+	    shift
+	    continue;;
+
+	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
+	    shift
+	    continue;;
+
+	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+	    shift
+	    continue;;
+
+	*)  if [ x"$src" = x ]
+	    then
+		src=$1
+	    else
+		# this colon is to work around a 386BSD /bin/sh bug
+		:
+		dst=$1
+	    fi
+	    shift
+	    continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+	echo "install:	no input file specified"
+	exit 1
+else
+	true
+fi
+
+if [ x"$dir_arg" != x ]; then
+	dst=$src
+	src=""
+	
+	if [ -d $dst ]; then
+		instcmd=:
+	else
+		instcmd=mkdir
+	fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+	if [ -f $src -o -d $src ]
+	then
+		true
+	else
+		echo "install:  $src does not exist"
+		exit 1
+	fi
+	
+	if [ x"$dst" = x ]
+	then
+		echo "install:	no destination specified"
+		exit 1
+	else
+		true
+	fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+	if [ -d $dst ]
+	then
+		dst="$dst"/`basename $src`
+	else
+		true
+	fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='	
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+	pathcomp="${pathcomp}${1}"
+	shift
+
+	if [ ! -d "${pathcomp}" ] ;
+        then
+		$mkdirprog "${pathcomp}"
+	else
+		true
+	fi
+
+	pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+	$doit $instcmd $dst &&
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+	if [ x"$transformarg" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		dstfile=`basename $dst $transformbasename | 
+			sed $transformarg`$transformbasename
+	fi
+
+# don't allow the sed command to completely eliminate the filename
+
+	if [ x"$dstfile" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		true
+	fi
+
+# Make a temp file name in the proper directory.
+
+	dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+	$doit $instcmd $src $dsttmp &&
+
+	trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+	$doit $rmcmd -f $dstdir/$dstfile &&
+	$doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/autoconf/makeinfo.in b/autoconf/makeinfo.in
new file mode 100644
index 0000000..192e8e0
--- /dev/null
+++ b/autoconf/makeinfo.in
@@ -0,0 +1,18 @@
+# Info for make, this will be preprocessed by autoconf.
+bindir		= @bindir@
+exec_prefix 	= @exec_prefix@
+icondir		= @datadir@/icons/wmbattery
+man1dir		= @mandir@/man1
+prefix		= @prefix@
+srcdir		= @srcdir@
+
+CC		= @CC@
+CFLAGS		= @CFLAGS@ -Wall -DACPI_APM
+CPPFLAGS	= @CPPFLAGS@ -DICONDIR=\"$(icondir)\"
+INSTALL		= @INSTALL@
+INSTALL_DATA	= @INSTALL_DATA@
+INSTALL_PROGRAM	= @INSTALL_PROGRAM@
+LDFLAGS		= @LDFLAGS@
+LIBS		= @LIBS@
+
+USE_HAL		= 1
diff --git a/battery_blink.xpm b/battery_blink.xpm
new file mode 100644
index 0000000..28c5ef6
--- /dev/null
+++ b/battery_blink.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * battery_blink_xpm[] = {
+"25 13 3 1",
+" 	c #208120812081",
+".	c #000049244103",
+"X	c #2081B2CAAEBA",
+" .....................   ",
+"..                   ..  ",
+".                     .  ",
+".    ...   ...   X    .  ",
+". . .   . .   . X X X ...",
+". . .   . .   .  X X  ...",
+".    ...   ...    X   ...",
+". . .   . .   .  X X  ...",
+". . .   . .   . X X X ...",
+".    ...   ...     .  .  ",
+".                     .  ",
+"..                   ..  ",
+" .....................   "};
diff --git a/battery_high.xpm b/battery_high.xpm
new file mode 100644
index 0000000..034f8ed
--- /dev/null
+++ b/battery_high.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * battery_high_xpm[] = {
+"25 13 3 1",
+" 	c #208120812081",
+".	c #2081B2CAAEBA",
+"X	c #000049244103",
+" .....................   ",
+".X                   X.  ",
+".                     .  ",
+".    XXX   XXX   .    .  ",
+". X X   X X   X . . . ...",
+". X X   X X   X  . .  ...",
+".    XXX   XXX    .   ...",
+". X X   X X   X  . .  ...",
+". X X   X X   X . . . ...",
+".    XXX   XXX     .  .  ",
+".                     .  ",
+".X                   X.  ",
+" .....................   "};
diff --git a/battery_low.xpm b/battery_low.xpm
new file mode 100644
index 0000000..c707a75
--- /dev/null
+++ b/battery_low.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char * battery_low_xpm[] = {
+"25 13 4 1",
+" 	c #208120812081",
+".	c #FFFF00000000",
+"X	c #000049244103",
+"o	c #2081B2CAAEBA",
+" .....................   ",
+".X                   X.  ",
+".                     .  ",
+".    XXX   XXX   o    .  ",
+". X X   X X   X o o o ...",
+". X X   X X   X  o o  ...",
+".    XXX   XXX    o   ...",
+". X X   X X   X  o o  ...",
+". X X   X X   X o o o ...",
+".    XXX   XXX     o  .  ",
+".                     .  ",
+".X                   X.  ",
+" .....................   "};
diff --git a/battery_medium.xpm b/battery_medium.xpm
new file mode 100644
index 0000000..730f0ac
--- /dev/null
+++ b/battery_medium.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char * battery_medium_xpm[] = {
+"25 13 4 1",
+" 	c #208120812081",
+".	c #FFFFFFFF0000",
+"X	c #000049244103",
+"o	c #2081B2CAAEBA",
+" .....................   ",
+".X                   X.  ",
+".                     .  ",
+".    XXX   XXX   o    .  ",
+". X X   X X   X o o o ...",
+". X X   X X   X  o o  ...",
+".    XXX   XXX    o   ...",
+". X X   X X   X  o o  ...",
+". X X   X X   X o o o ...",
+".    XXX   XXX     o  .  ",
+".                     .  ",
+".X                   X.  ",
+" .....................   "};
diff --git a/battery_none.xpm b/battery_none.xpm
new file mode 100644
index 0000000..d97902f
--- /dev/null
+++ b/battery_none.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char * battery_none_xpm[] = {
+"25 13 2 1",
+" 	c #208120812081",
+".	c #000049244103",
+" .....................   ",
+"..                   ..  ",
+".                     .  ",
+".    ...   ...   .    .  ",
+". . .   . .   . . . . ...",
+". . .   . .   .  . .  ...",
+".    ...   ...    .   ...",
+". . .   . .   .  . .  ...",
+". . .   . .   . . . . ...",
+".    ...   ...     .  .  ",
+".                     .  ",
+"..                   ..  ",
+" .....................   "};
diff --git a/bigfont.xpm b/bigfont.xpm
new file mode 100644
index 0000000..7b79a86
--- /dev/null
+++ b/bigfont.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char * bigfont_xpm[] = {
+"84 9 5 1",
+" 	c #208120812081",
+".	c #2081B2CAAEBA",
+"X	c #000049244103",
+"o	c #104079E779E7",
+"O	c #18618A288617",
+" ....   XXXXo o....O o....o oXXXXo o....o o....O o....o o....O o....O         XXXX  ",
+".    . X    . X    . X    . .    . .    X .    X X    . .    . .    .  XX    X    X ",
+".    . X    . X    . X    . .    . .    X .    X X    . .    . .    .  XX    X    X ",
+".    . X    . X    . X    . .    . .    X .    X X    . .    . .    .        X    X ",
+"oXXXXo  XXXXo o....o o....o o....o o....o o....o  XXXXo o....o o....o        o....o ",
+".    . X    . .    X X    . X    . X    . .    . X    . .    . X    .        X    X ",
+".    . X    . .    X X    . X    . X    . .    . X    . .    . X    .  XX    X    X ",
+".    . X    . .    X X    . X    . X    . .    . X    . .    . X    .  XX    X    X ",
+" ....   XXXXo o....o o....o  XXXXo o....o o....o  XXXXo o....o o....o         XXXX  "};
diff --git a/charging.xpm b/charging.xpm
new file mode 100644
index 0000000..29c5f40
--- /dev/null
+++ b/charging.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *charging[] = {
+/* width height num_colors chars_per_pixel */
+"    15     9        3            1",
+/* colors */
+". c #202020",
+"# c #004941",
+"a c #20b2ae",
+/* pixels */
+"........#a.....",
+".......#aaa#...",
+".......aaa#aa#.",
+"......#aa#..#aa",
+"......aaa......",
+"aa#..#aa#......",
+".#aa#aaa.......",
+"...#aaa#.......",
+"....#a#........"
+};
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..dd5a6b3
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,9 @@
+#ifndef CONFIG_H
+#define CONFIG_H
+
+/* What system header files can I use? */
+#undef HAVE_GETOPT_H
+#undef HAVE_SYS_FILE_H
+#undef HAVE_SYS_IOCTL_H
+
+#endif
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..4d2163e
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,44 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(wmbattery.c)
+AC_CONFIG_HEADER(config.h)
+
+AC_CONFIG_AUX_DIR(autoconf)
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+
+dnl Locate X11.
+AC_PATH_X
+if test "x${no_x}" = "xyes"; then
+   AC_MSG_ERROR(Can't find X windows include files and libraries)
+fi
+if test "x${x_includes}" != "x"; then
+   CPPFLAGS="$CPPFLAGS -I`echo ${x_includes}`"
+fi
+if test "x${x_libraries}" != "x"; then
+   LIBS="$LIBS -L`echo ${x_libraries}`"
+fi
+
+dnl Checks for libraries.
+AC_CHECK_LIB(X11, XOpenDisplay)
+AC_CHECK_LIB(Xext, XShapeCombineMask)
+AC_CHECK_LIB(Xpm, XpmReadFileToPixmap)
+AC_CHECK_LIB(apm, apm_read)
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS(X11/xpm.h)
+AC_CHECK_HEADERS(X11/extensions/shape.h)
+AC_CHECK_HEADERS(getopt.h)
+AC_CHECK_HEADERS(apm.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+
+dnl Checks for library functions.
+AC_PROG_GCC_TRADITIONAL
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS(strdup)
+
+AC_OUTPUT(makeinfo:autoconf/makeinfo.in)
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..57a86ad
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,515 @@
+wmbattery (2.41) unstable; urgency=low
+
+  * Accumulated packaging modernizations. Closes: #666370
+
+ -- Joey Hess <joeyh at debian.org>  Fri, 30 Mar 2012 10:20:17 -0400
+
+wmbattery (2.40) unstable; urgency=low
+
+  * Add -s option which can be used to ignore fluctuations
+    in reported battery charge (as seen on the EeePC) when
+    using -e. Closes: #527870 (Joseph Huang)
+
+ -- Joey Hess <joeyh at debian.org>  Sat, 09 May 2009 16:53:10 -0400
+
+wmbattery (2.39) unstable; urgency=low
+
+  * Use debhelper v7; rules file minimisation.
+  * Depend on hal since /proc/acpi is gone from the default kernels now.
+    Closes: #491099
+
+ -- Joey Hess <joeyh at debian.org>  Tue, 22 Jul 2008 00:23:47 -0400
+
+wmbattery (2.38) unstable; urgency=low
+
+  * Magic header file reordering to work around the disgusting
+    linux-libc-dev/libc headers conflicts (#435700). Closes: #463811
+
+ -- Joey Hess <joeyh at debian.org>  Wed, 27 Feb 2008 15:08:53 -0500
+
+wmbattery (2.37) unstable; urgency=low
+
+  * Support reconnecting to dbus if it's restarted. (AKA giant dbus-PITA)
+
+ -- Joey Hess <joeyh at debian.org>  Wed, 20 Feb 2008 22:44:00 -0500
+
+wmbattery (2.36) unstable; urgency=low
+
+  * Support reconnecting to hal if the connection is closed, as happens
+    if the hal is restarted.
+
+ -- Joey Hess <joeyh at debian.org>  Wed, 20 Feb 2008 22:29:00 -0500
+
+wmbattery (2.35) unstable; urgency=low
+
+  * Don't spew error messages if optional hal properties are not available.
+  * Only check to see if a battery is charging if hal reports there is AC
+    power. This is perhaps not 100% correct in systems with multiple batteries
+    that may cross-charge when off AC, but it's faster and it avoids bugs in
+    hal (#463740).
+
+ -- Joey Hess <joeyh at debian.org>  Sat, 02 Feb 2008 17:28:37 -0500
+
+wmbattery (2.34) unstable; urgency=low
+
+  * Bit the bullet, stopped trying to track the kernel's ever changing
+    interfaces, and added support for querying battery information from hal.
+    Support for the old kernel interfaces (APM, ACPI, etc) is still present,
+    but to use new interfaces such 2.6.24's /sys/class/power_adapter, you'll
+    have to have dbus and hal.
+    Closes: #456247, #246641, #290712, #393616, #456248
+  * Fix -e option.
+
+ -- Joey Hess <joeyh at debian.org>  Fri, 01 Feb 2008 21:36:39 -0500
+
+wmbattery (2.33) unstable; urgency=low
+
+  * Correct issue with the statically allocated string returned by
+    get_acpi_value that caused it to only look at last full capacity and never
+    really at design capacity.
+
+ -- Joey Hess <joeyh at debian.org>  Sat, 22 Dec 2007 22:26:38 -0500
+
+wmbattery (2.32) unstable; urgency=low
+
+  * Guard some divisions against division by zero. I've never seen that
+    happen and can't reproduce it, but see #454766.
+  * Merge acpi change from procmeter3: Limit string length when reading from
+    /proc/.
+
+ -- Joey Hess <joeyh at debian.org>  Fri, 07 Dec 2007 14:56:41 -0500
+
+wmbattery (2.31) unstable; urgency=low
+
+  * Further fix for my strange battery. If the present capacity is larger
+    than the maximum capacity, rescan to figure out the new max capacity.
+
+ -- Joey Hess <joeyh at debian.org>  Sun, 02 Dec 2007 15:50:29 -0500
+
+wmbattery (2.30) unstable; urgency=low
+
+  * My new battery has a design capacity of 7800 mAh and yet its
+    last full capacity was 9488, and its currently charged to 8540.
+    Deal with this wonderful miracle^W^Wcrap hardware by taking the max
+    of the design or last full capacities.
+
+ -- Joey Hess <joeyh at debian.org>  Tue, 23 Oct 2007 22:21:06 -0400
+
+wmbattery (2.29) unstable; urgency=low
+
+  * Update to new menu policy.
+  * The repository has moved from svn to git.
+
+ -- Joey Hess <joeyh at debian.org>  Fri, 19 Oct 2007 21:14:22 -0400
+
+wmbattery (2.28) unstable; urgency=low
+
+  * Correct off-by-one in acpi.c
+  * Put url to new web page in README.
+
+ -- Joey Hess <joeyh at debian.org>  Mon, 04 Jun 2007 16:44:03 -0400
+
+wmbattery (2.27) unstable; urgency=low
+
+  * Minor bug fix to acpi code, don't skip over dotfiles.
+  * Patch from Vincent Bernat adding support for 2.6.21, which changes
+    yet again where the ACPI version number is stored. Closes: #423612
+
+ -- Joey Hess <joeyh at debian.org>  Mon, 14 May 2007 14:23:09 -0400
+
+wmbattery (2.26) unstable; urgency=medium
+
+  * Add missing build dep on libxt-dev. Closes: #379247
+
+ -- Joey Hess <joeyh at debian.org>  Tue, 25 Jul 2006 22:00:41 -0400
+
+wmbattery (2.25) unstable; urgency=low
+
+  * Merge acpi.c changes for more robust AC power status from sleepd 1.3.0.
+
+ -- Joey Hess <joeyh at debian.org>  Thu, 30 Mar 2006 14:59:31 -0500
+
+wmbattery (2.24) unstable; urgency=low
+
+  * Current policy.
+  * Man page section fix.
+  * Menu file move.
+  * GPL update.
+  * Remove configure script in distclean.
+
+ -- Joey Hess <joeyh at debian.org>  Sun, 18 Dec 2005 17:39:07 -0500
+
+wmbattery (2.23) unstable; urgency=low
+
+  * xlibs-dev transition
+
+ -- Joey Hess <joeyh at debian.org>  Fri, 16 Dec 2005 14:54:25 -0500
+
+wmbattery (2.22) unstable; urgency=low
+
+  * Fix acpi detection, the code to read /proc/acpi/info was not updated
+    to the new cd-less code. Closes: #307278
+
+ -- Joey Hess <joeyh at debian.org>  Mon,  2 May 2005 18:14:01 -0400
+
+wmbattery (2.21) unstable; urgency=low
+
+  * Merge in changes from procmeter3's version of acpi.c, made by Andrew M.
+    Bishop, that avoid the ugly chdir to /proc/acpi and add a bit of error
+    checking. Now fully synced with procmeter3 3.4d.
+
+ -- Joey Hess <joeyh at debian.org>  Sat, 30 Apr 2005 22:58:44 -0400
+
+wmbattery (2.20) unstable; urgency=low
+
+  * Patch from Kris Verbeeck to add a -a option to play an au file
+    on low battery.
+  * Document it in the man page.
+  * Unicode dash fixes on man page.
+  * Some indentation fixes.
+
+ -- Joey Hess <joeyh at debian.org>  Wed, 24 Nov 2004 16:20:39 -0500
+
+wmbattery (2.19) unstable; urgency=low
+
+  * Use the proper new-style acpi string when looking for ac adaptor status.
+    Closes: #220039
+  * Remove the hack I added for my old picturebook, as it causes bad results
+    on systems that label a fully charged battery's charging rate as
+    unknown and state as charging.
+  * Base battery charge calculations for ACPI on design capacity, instead of
+    last full capacity. Some batteries may exceed previous last full on 
+    their next charging, and this also lets you see when you have a damaged
+    battery that is not fully charging.
+  * If acpi battery charging state is unknown, but the rate is 0,
+    then the battery is charged and on AC power, and the unknown state can
+    be ignored. Analysis and patch by "TeXitoi".
+
+ -- Joey Hess <joeyh at debian.org>  Mon, 17 Nov 2003 20:28:56 -0500
+
+wmbattery (2.18) unstable; urgency=low
+
+  * Sort devices returned by readdir in acpi, since the order can be random.
+    Closes: #204721
+
+ -- Joey Hess <joeyh at debian.org>  Wed, 13 Aug 2003 01:45:55 -0400
+
+wmbattery (2.17) unstable; urgency=low
+
+  * Make acpi code put -1 in the time remaining field if the "present rate"
+    is 0. Closes: #204722
+  * Enable internal time estimate code in this case.
+
+ -- Joey Hess <joeyh at debian.org>  Mon, 11 Aug 2003 17:21:17 -0400
+
+wmbattery (2.16) unstable; urgency=low
+
+  * Another patch from Hugo Haas, this time it adds time-till-charged
+    estimates for systems that lack them. The estimates are on by default,
+    though they're only linear guesses and may not be accurate.
+  * Display dimmed time estimate field if there is no estimate available.
+  * -e switch renamed to -r and forces both estimates on.
+
+ -- Joey Hess <joeyh at debian.org>  Thu,  7 Aug 2003 16:41:37 -0400
+
+wmbattery (2.15) unstable; urgency=low
+
+  * Patch from Hugo Haas <hugo at larve.net> to change when the icon is
+    refreshed for less latency.
+  * Patch from Hugo Haas to have wmbattery do its own time left estimates
+    if that info is not available from the machine.
+  * Add -r switch to force wmbattery to estimate the time left.
+
+ -- Joey Hess <joeyh at debian.org>  Sun,  3 Aug 2003 00:00:09 -0400
+
+wmbattery (2.14) unstable; urgency=low
+
+  * Set the cutoff point for old acpi to 20020214 (was 20020208).
+    Closes: #202083
+
+ -- Joey Hess <joeyh at debian.org>  Sun, 20 Jul 2003 13:44:59 +0200
+
+wmbattery (2.13) unstable; urgency=low
+
+  * Added support for ACPI version 20030109 (2.5 kernel), and generally
+    support for changing ACPI strings across versions. Closes: #177249
+
+ -- Joey Hess <joeyh at debian.org>  Thu,  6 Feb 2003 14:50:21 -0500
+
+wmbattery (2.12) unstable; urgency=low
+
+  * Rebuild w/o /usr/doc link.
+
+ -- Joey Hess <joeyh at debian.org>  Fri, 15 Nov 2002 15:23:13 -0500
+
+wmbattery (2.11) unstable; urgency=low
+
+  * Corrected inverted test to see if ac power is online, that was only called
+    on 2 battery systems. Closes: #152356
+
+ -- Joey Hess <joeyh at debian.org>  Wed, 10 Jul 2002 16:10:40 -0400
+
+wmbattery (2.10) unstable; urgency=low
+
+  * Deal with acpi putting nothing but "Present: no" in the info file for the
+    second battery of a thinkpad. This was with kernel 2.4.19-pre10.
+    Closes: #149715
+  * Moved DEB_BUILD_OPTIONS out of makeinfo.
+  * Updated to new autoconf.
+
+ -- Joey Hess <joeyh at debian.org>  Tue, 11 Jun 2002 22:51:45 -0400
+
+wmbattery (2.09) unstable; urgency=low
+
+  * Moved makefile stuff out of makeinfo, so it is just definitions.
+  * Support DEB_BUILD_OPTIONS.
+  * debhelper v4.
+
+ -- Joey Hess <joeyh at debian.org>  Sat,  1 Jun 2002 16:31:53 -0400
+
+wmbattery (2.08) unstable; urgency=low
+
+  * Don't crash if there is a /proc/acpi/ with no status file.
+
+ -- Joey Hess <joeyh at debian.org>  Fri, 31 May 2002 21:35:06 -0400
+
+wmbattery (2.07) unstable; urgency=low
+
+  * Added symbolic apm info constants to "apm.h", in case they are
+    not in the system <apm.h>.
+  * Put $(LIBS) last at link time.
+
+ -- Joey Hess <joeyh at debian.org>  Tue, 23 Apr 2002 11:49:16 -0400
+
+wmbattery (2.06) unstable; urgency=low
+
+  * Deal with -1 time left from apm (no estimate).
+  * Never dim colon, fixes display bug.
+
+ -- Joey Hess <joeyh at debian.org>  Mon, 22 Apr 2002 12:30:35 -0400
+
+wmbattery (2.05) unstable; urgency=low
+
+  * (acpi) don't display the rather wacky "- :0" on an almost full battery
+
+ -- Joey Hess <joeyh at debian.org>  Tue,  9 Apr 2002 23:19:35 -0400
+
+wmbattery (2.04) unstable; urgency=low
+
+  * Work around stupid ACPI output format  bug. Critical battery detection
+    now works.
+
+ -- Joey Hess <joeyh at debian.org>  Mon,  8 Apr 2002 22:49:43 -0400
+
+wmbattery (2.03) unstable; urgency=low
+
+  * Better error reporting.
+
+ -- Joey Hess <joeyh at debian.org>  Sun,  7 Apr 2002 22:57:17 -0400
+
+wmbattery (2.02) unstable; urgency=medium
+
+  * Improved acpi interface (also used for procmeter3 module now).
+  * Fixed segfault on non-ACPI systems.
+
+ -- Joey Hess <joeyh at debian.org>  Sun,  7 Apr 2002 17:48:41 -0400
+
+wmbattery (2.01) unstable; urgency=low
+
+  * Corrected minus sign in bigfont to proper faux-lcd appearance. Also fixed
+    offset slightly.
+
+ -- Joey Hess <joeyh at debian.org>  Fri,  5 Apr 2002 23:34:38 -0500
+
+wmbattery (2.00) unstable; urgency=low
+
+  * Added ACPI support, including battery change detection, and battery
+    charging time countdown timer.
+  * Added -w parameter to configure delay time.
+  * Added -c and -l parameters to allow user control of battery low/critical
+    percentages.
+  * Use constant defs from apm.h instead of nasty hardcoded numbers.
+  * Made -Wall clean.
+  * Reorg.
+  * Removed -s option, just fall back to SPIC if ACPI and APM are not
+    available.
+
+ -- Joey Hess <joeyh at debian.org>  Fri,  5 Apr 2002 12:53:18 -0500
+
+wmbattery (1.23) unstable; urgency=low
+
+  * Added support for querying for battery status via the sonypi driver, for
+    sony laptops that do not have apm support. This is a stopgap until linux
+    gets full ACPI support.
+
+ -- Joey Hess <joeyh at debian.org>  Thu,  4 Apr 2002 10:25:31 -0500
+
+wmbattery (1.22) unstable; urgency=low
+
+  * Converted to use libapm, instead of the hacked up old version of it
+    used before. This probably breaks wmbattery on the BSD's, for now. The
+    correct fix for the BSD's will be to get support for their apm
+    implementations into libapm. To that end, I have filed a bug with all the
+    code I ripped out.
+  * The -f option also had to be removed. If libapm does not work right on
+    systems that needed that flag it's probably a bug in the library.
+  * Closes: #100027
+
+ -- Joey Hess <joeyh at debian.org>  Sun, 24 Feb 2002 12:47:53 -0500
+
+wmbattery (1.21) unstable; urgency=low
+
+  * Typo, Closes: #125485
+
+ -- Joey Hess <joeyh at debian.org>  Mon, 17 Dec 2001 21:41:52 -0500
+
+wmbattery (1.20) unstable; urgency=low
+
+  * Still show percent sign when blinking low. Closes: #123183
+
+ -- Joey Hess <joeyh at debian.org>  Sun,  9 Dec 2001 22:44:17 -0500
+
+wmbattery (1.19) unstable; urgency=low
+
+  * Used two more grey's in the transition between shadow and highlight
+    in the dial. Looks a bit better.
+
+ -- Joey Hess <joeyh at debian.org>  Wed,  7 Nov 2001 22:35:37 -0500
+
+wmbattery (1.18) unstable; urgency=low
+
+  * Autoconf 2.50 demands an absolute --mandir=
+
+ -- Joey Hess <joeyh at debian.org>  Thu, 24 May 2001 15:04:23 -0400
+
+wmbattery (1.17) unstable; urgency=low
+
+  * Patch from Edward Betts <edward at debian.org> to make the icon redraw
+    immediatly when it gets an expose event. The patch also lowers the CPU
+    time used as the icon is not needlessly redrawn every second. Thanks
+    Edward! Closes: #97779
+  * Battery blink fixup. (I seem to have inexplicably lost the changelog
+    and version involving making the battery blink red on and off when the
+    status is critical -- I did this recently because the eye tends to
+    notice the motion).
+
+ -- Joey Hess <joeyh at debian.org>  Thu, 17 May 2001 13:16:55 -0400
+
+wmbattery (1.16) unstable; urgency=low
+
+  * Another patch from Kevin, which allows removal of the
+    config.{sub,guess} files and does smarter detection.
+
+ -- Joey Hess <joeyh at debian.org>  Mon,  5 Mar 2001 19:49:36 -0800
+
+wmbattery (1.15) unstable; urgency=medium
+
+  * Fixed icon search path.
+
+ -- Joey Hess <joeyh at debian.org>  Tue, 27 Feb 2001 18:00:44 -0800
+
+wmbattery (1.14) unstable; urgency=low
+
+  * OpenBSD port by Kevin Christen <christen at ix.netcom.com>
+  * Uses autoconf.
+
+ -- Joey Hess <joeyh at debian.org>  Mon, 26 Feb 2001 22:06:55 -0800
+
+wmbattery (1.13) unstable; urgency=low
+
+  * Added support for using files other than /proc/apm, via a -f switch.
+    (See bug #69585)
+
+ -- Joey Hess <joeyh at debian.org>  Mon, 21 Aug 2000 11:52:21 -0700
+
+wmbattery (1.12) unstable; urgency=low
+
+  * Use /usr/share/icons/wmbattery, not /usr/X11R6/share. Sheesh. 
+
+ -- Joey Hess <joeyh at debian.org>  Thu,  6 Apr 2000 13:16:52 -0700
+
+wmbattery (1.11) unstable; urgency=low
+
+  * Build deps.
+
+ -- Joey Hess <joeyh at debian.org>  Sat,  4 Dec 1999 16:56:32 -0800
+
+wmbattery (1.10) unstable; urgency=low
+
+  * Removed install-stamp target, which can cause obscure problems.
+
+ -- Joey Hess <joeyh at debian.org>  Thu, 30 Sep 1999 13:32:33 -0700
+
+wmbattery (1.9) unstable; urgency=low
+
+  * Expanded the man page to detail exactly what all parts of the display
+    mean.
+
+ -- Joey Hess <joeyh at debian.org>  Mon, 13 Sep 1999 11:37:11 -0700
+
+wmbattery (1.8) unstable; urgency=low
+
+  * Integrated with my build system.
+
+ -- Joey Hess <joeyh at debian.org>  Sun, 12 Sep 1999 12:47:00 -0700
+
+wmbattery (1.7) unstable; urgency=low
+
+  * FHS.
+
+ -- Joey Hess <joeyh at debian.org>  Mon,  6 Sep 1999 16:57:13 -0700
+
+wmbattery (1.6) unstable; urgency=low
+
+  * FreeBSD support, patch from Motoyuki Kasahara <m-kasahr at sra.co.jp>.
+
+ -- Joey Hess <joeyh at debian.org>  Sun,  8 Aug 1999 20:04:10 -0700
+
+wmbattery (1.5) unstable; urgency=low
+
+  * Built w/o that ugly bug source known as fakeroot. Now all files are
+    owned by root, not me.
+
+ -- Joey Hess <joeyh at debian.org>  Sun,  8 Aug 1999 17:35:32 -0700
+
+wmbattery (1.4) unstable; urgency=low
+
+  * Let's try again on that patch.
+
+ -- Joey Hess <joeyh at debian.org>  Sun,  8 Aug 1999 17:30:18 -0700
+
+wmbattery (1.3) unstable; urgency=low
+
+  * Patch from Hugo Haas <hugoh at MIT.EDU> to allow geometry support.
+
+ -- Joey Hess <joeyh at debian.org>  Sun,  8 Aug 1999 16:18:44 -0700
+
+wmbattery (1.2) unstable; urgency=low
+
+  * Patch from Edwin van Ouwerkerk Moria, may make the charging indicator
+    work better on thinkpads.
+
+ -- Joey Hess <joeyh at debian.org>  Thu,  1 Jul 1999 09:58:04 -0700
+
+wmbattery (1.1) unstable; urgency=low
+
+  * Fixed man page location.
+
+ -- Joey Hess <joeyh at debian.org>  Thu,  4 Feb 1999 14:33:58 -0800
+
+wmbattery (1.0) unstable; urgency=low
+
+  * First release.
+  .
+  * Started with wmapm 1.2 sources. Gutted it and cleaned it up extensively
+    and turned it into wmbattery.
+  * Drew new faceplate and graphics.
+  * Converted manpage to refer to new program name.
+  * Reorganized source tree.
+  * Split single xpm up into lots of small xpms, loaded seperately.
+  * Cleaned up Makefile.
+  * Removed README, TODO, INSTALL, etc; I'll write my own.
+  * Parse command line with getopt.
+  * Made -d work to set the display.
+
+ -- Joey Hess <joeyh at debian.org>  Fri, 25 Dec 1998 18:03:21 -0500
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..ec63514
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..b0c8921
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,25 @@
+Source: wmbattery
+Section: x11
+Priority: extra
+Build-Depends: debhelper (>= 9), libxext-dev, libxpm-dev, autoconf, libapm-dev, dpkg-dev (>= 1.9.0), libxt-dev, libhal-dev
+Maintainer: Joey Hess <joeyh at debian.org>
+Standards-Version: 3.9.3
+Vcs-Git: git://git.kitenet.net/wmbattery
+Homepage: http://kitenet.net/~joey/code/wmbattery/
+
+Package: wmbattery
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, hal
+Suggests: wmaker
+Description: display laptop battery info, dockable in WindowMaker
+ wmbattery displays the status of your laptop's battery in a small icon.
+ This includes if it is plugged in, if the battery is charging, how many
+ minutes of battery life remain, and battery status (high - green, low -
+ yellow, or critical - red).
+ .
+ There's nothing in the program that makes it require WindowMaker, except
+ maybe the look. It can be docked in WindowMaker or AfterStep's dock.
+ .
+ wmbattery can use HAL, APM, ACPI, or even the SPIC that is in some Sony
+ laptops. It supports multi-battery machines, and can estimate how long
+ it will take the battery to finish charging or discharging.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..94b6057
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,12 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Source: derived from wmapm
+
+Files: *
+Copyright: 1998-2008 Joey Hess <joey at kitenet.net>
+ 1998 Chris D. Faulhaber <jedgar at speck.ml.org>
+ Martijm Pieterse <pieterse at xs4all.nl> and
+ Antoine Nulle <warp at xs4all.nl> 
+Note: I would also like to thank Anna Hess for artistic guidance.
+License: GPL-2
+ On Debian systems, the complete text of the GPL can be found in
+ /usr/share/common-licenses/GPL.
diff --git a/debian/docs b/debian/docs
new file mode 100644
index 0000000..2bb19c3
--- /dev/null
+++ b/debian/docs
@@ -0,0 +1,2 @@
+TODO
+README
diff --git a/debian/menu b/debian/menu
new file mode 100644
index 0000000..62d4a19
--- /dev/null
+++ b/debian/menu
@@ -0,0 +1,2 @@
+?package(wmbattery):needs="x11" section="Applications/System/Monitoring" \
+	title="wmbattery" longtitle="wmbattery" command="wmbattery"
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..d20e7bc
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,11 @@
+#!/usr/bin/make -f
+%:
+	dh $@
+
+override_dh_auto_configure:
+	autoconf
+	dh_auto_configure
+
+# Not intended for use by anyone except the author.
+announcedir:
+	@echo ${HOME}/src/joeywiki/code/wmbattery/news
diff --git a/dial_bright.xpm b/dial_bright.xpm
new file mode 100644
index 0000000..3361348
--- /dev/null
+++ b/dial_bright.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char * dial_bright_xpm[] = {
+"56 31 9 1",
+" 	c #00000000FFFF",
+".	c #000000000000",
+"X	c #2081B2CAAEBA",
+"o	c #FFFFFFFFFFFF",
+"O	c #38E341034103",
+"+	c #C71BC30BC71B",
+"@	c #965896589658",
+"#	c #208120812081",
+"$	c #000049244103",
+"                       ..........                       ",
+"                   ....XXXXXXXXXX....                   ",
+"                ...XXXXXXXXXXXXXXXXXX...                ",
+"              ..XXXXXXXXXXXXXXXXXXXXXXXX..              ",
+"             .XXXXXXXXXXXXXXXXXXXXXXXXXXXX.             ",
+"           ..XXXXXXXXXXooooooooooXXXXXXXXXX.O           ",
+"          .XXXXXXXXXooo          oo+XXXXXXXXXO          ",
+"         .XXXXXXXXoo                ++XXXXXXXX@         ",
+"        .XXXXXXXoo                    @@XXXXXXX@        ",
+"       .XXXXXXoo                        @XXXXXXX+       ",
+"      .XXXXXXo                           OOXXXXXX+      ",
+"     .XXXXXXo                              OXXXXXXo     ",
+"     .XXXXXo                                .XXXXXo     ",
+"    .XXXXXo                                  .XXXXXo    ",
+"   .XXXXXo                                    .XXXXXo   ",
+"   .XXXXXo                                    .XXXXXo   ",
+"  .XXXXXo                                      .XXXXXo  ",
+"  .XXXXo  ....................................  .XXXXo  ",
+"  .XXXXo  .##################################o  .XXXXo  ",
+" .XXXXXo  .##$$$$###$$$$#######$$$$###$$$$###o  .XXXXXo ",
+" .XXXXo   .#$####$#$####$##X##$####$#$####$##o   .XXXXo ",
+" .XXXXo   .#$####$#$####$##X##$####$#$####$##o   .XXXXXo",
+".XXXXXo   .#$####$#$####$#####$####$#$####$##o   .XXXXXo",
+".XXXXo    .##$$$$###$$$$#######$$$$###$$$$###o    .XXXXo",
+".XXXXo    .#$####$#$####$#####$####$#$####$##o    .XXXXo",
+".XXXXo    .#$####$#$####$##X##$####$#$####$##o    .XXXXo",
+".XXXXo    .#$####$#$####$##X##$####$#$####$##o    .XXXXo",
+".XXXXo    .##$$$$###$$$$#######$$$$###$$$$###o    .XXXXo",
+".XXXXo    .##################################o    .XXXXo",
+".XXXXo    .##################################o    .XXXXo",
+".ooooo    .ooooooooooooooooooooooooooooooooooo    .ooooo"};
diff --git a/dial_dim.xpm b/dial_dim.xpm
new file mode 100644
index 0000000..08e6efa
--- /dev/null
+++ b/dial_dim.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char * dial_dim_xpm[] = {
+"56 31 9 1",
+" 	c #00000000FFFF",
+".	c #000000000000",
+"X	c #000049244103",
+"o	c #FFFFFFFFFFFF",
+"O	c #38E341034103",
+"+	c #C71BC30BC71B",
+"@	c #965896589658",
+"#	c #208120812081",
+"$	c #2081B2CAAEBA",
+"                       ..........                       ",
+"                   ....XXXXXXXXXX....                   ",
+"                ...XXXXXXXXXXXXXXXXXX...                ",
+"              ..XXXXXXXXXXXXXXXXXXXXXXXX..              ",
+"             .XXXXXXXXXXXXXXXXXXXXXXXXXXXX.             ",
+"           ..XXXXXXXXXXooooooooooXXXXXXXXXX..           ",
+"          .XXXXXXXXXooo          oooXXXXXXXXXO          ",
+"         .XXXXXXXXoo                ++XXXXXXXXO         ",
+"        .XXXXXXXoo                    @@XXXXXXX@        ",
+"       .XXXXXXoo                        @XXXXXXX@       ",
+"      .XXXXXXo                           OOXXXXXX+      ",
+"     .XXXXXXo                              OXXXXXX+     ",
+"     .XXXXXo                                .XXXXXo     ",
+"    .XXXXXo                                  .XXXXXo    ",
+"   .XXXXXo                                    .XXXXXo   ",
+"   .XXXXXo                                    .XXXXXo   ",
+"  .XXXXXo                                      .XXXXXo  ",
+"  .XXXXo  ....................................  .XXXXo  ",
+"  .XXXXo  .##################################o  .XXXXo  ",
+" .XXXXXo  .##XXXX###XXXX#######XXXX###XXXX###o  .XXXXXo ",
+" .XXXXo   .#X####X#X####X##$##X####X#X####X##o   .XXXXo ",
+" .XXXXo   .#X####X#X####X##$##X####X#X####X##o   .XXXXXo",
+".XXXXXo   .#X####X#X####X#####X####X#X####X##o   .XXXXXo",
+".XXXXo    .##XXXX###XXXX#######XXXX###XXXX###o    .XXXXo",
+".XXXXo    .#X####X#X####X#####X####X#X####X##o    .XXXXo",
+".XXXXo    .#X####X#X####X##$##X####X#X####X##o    .XXXXo",
+".XXXXo    .#X####X#X####X##$##X####X#X####X##o    .XXXXo",
+".XXXXo    .##XXXX###XXXX#######XXXX###XXXX###o    .XXXXo",
+".XXXXo    .##################################o    .XXXXo",
+".XXXXo    .##################################o    .XXXXo",
+".ooooo    .ooooooooooooooooooooooooooooooooooo    .ooooo"};
diff --git a/face.xpm b/face.xpm
new file mode 100644
index 0000000..5704fa7
--- /dev/null
+++ b/face.xpm
@@ -0,0 +1,74 @@
+/* XPM */
+static char * face_xpm[] = {
+"64 64 7 1",
+" 	c #00000000FFFF",
+".	c #000000000000",
+"X	c #000049244103",
+"o	c #FFFFFFFFFFFF",
+"O	c #C71BC30BC71B",
+"+	c #965896589658",
+"@	c #208120812081",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                           ..........                           ",
+"                       ....XXXXXXXXXX....                       ",
+"                    ...XXXXXXXXXXXXXXXXXX...                    ",
+"                  ..XXXXXXXXXXXXXXXXXXXXXXXX..                  ",
+"                 .XXXXXXXXXXXXXXXXXXXXXXXXXXXX.                 ",
+"               ..XXXXXXXXXXooooooooooXXXXXXXXXX..               ",
+"              .XXXXXXXXXooo          ooOXXXXXXXXX.              ",
+"             .XXXXXXXXoo                OOXXXXXXXX+             ",
+"            .XXXXXXXoo                    ++XXXXXXX+            ",
+"           .XXXXXXoo                        +.XXXXXXO           ",
+"          .XXXXXXo                            .XXXXXXO          ",
+"         .XXXXXXo                              .XXXXXXo         ",
+"         .XXXXXo                                .XXXXXo         ",
+"        .XXXXXo                                  .XXXXXo        ",
+"       .XXXXXo                                    .XXXXXo       ",
+"       .XXXXXo                                    .XXXXXo       ",
+"      .XXXXXo                                      .XXXXXo      ",
+"      .XXXXo  ....................................  .XXXXo      ",
+"      .XXXXo  .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o  .XXXXo      ",
+"     .XXXXXo  .@@XXXX@@@XXXX@@@@@@@XXXX@@@XXXX@@@o  .XXXXXo     ",
+"     .XXXXo   . at X@@@@X at X@@@@X@@X@@X@@@@X at X@@@@X@@o   .XXXXo     ",
+"     .XXXXo   . at X@@@@X at X@@@@X@@X@@X@@@@X at X@@@@X@@o   .XXXXXo    ",
+"    .XXXXXo   . at X@@@@X at X@@@@X@@@@@X@@@@X at X@@@@X@@o   .XXXXXo    ",
+"    .XXXXo    .@@XXXX@@@XXXX@@@@@@@XXXX@@@XXXX@@@o    .XXXXo    ",
+"    .XXXXo    . at X@@@@X at X@@@@X@@@@@X@@@@X at X@@@@X@@o    .XXXXo    ",
+"    .XXXXo    . at X@@@@X at X@@@@X@@X@@X@@@@X at X@@@@X@@o    .XXXXo    ",
+"    .XXXXo    . at X@@@@X at X@@@@X@@X@@X@@@@X at X@@@@X@@o    .XXXXo    ",
+"    .XXXXo    .@@XXXX@@@XXXX@@@@@@@XXXX@@@XXXX@@@o    .XXXXo    ",
+"    .XXXXo    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o    .XXXXo    ",
+"    .XXXXo    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o    .XXXXo    ",
+"    .ooooo    .ooooooooooooooooooooooooooooooooooo    .ooooo    ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"    ........................................................    ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o    ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o    ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXXXXXXXXXXXXXX@@@@o    ",
+"    .@@@@@@@@@@@@@@@@@@@@@X@@@@@@X@@@@@@@@@@@@@@@@@@@@@X@@@o    ",
+"    .@@@@@@@@@@@@@@@@@@@@XXX@@@@@X@@@@@@@@@@@@@@@@@@@@@X@@@o    ",
+"    .@@@@@XXXX@@@@@@@@@@XXX at XX@@@X@@@@XXX@@@XXX@@@X@@@@X@@@o    ",
+"    .@@@@X@@@XXX@@@@@@@@XX@@@@XX at X@X at X@@@X at X@@@X at X@X at X@XXX at o    ",
+"    .@@@@X@@@X@@@@@@@@@XXX@@@@@@@X at X@X@@@X at X@@@X@@X at X@@XXX at o    ",
+"    .@@XXX@@@X@@@XX@@@@XX@@@@@@@@X@@@@XXX@@@XXX@@@@X@@@XXX at o    ",
+"    . at X@@X@@@XXX@@@XX at XXX@@@@@@@@X at X@X@@@X at X@@@X@@X at X@@XXX at o    ",
+"    . at X@@@XXXX@@@@@@@XXX@@@@@@@@@X at X@X@@@X at X@@@X at X@X at X@XXX at o    ",
+"    . at X@@@@@@@@@@@@@@@X@@@@@@@@@@X@@@@XXX@@@XXX@@@@@X@@X@@@o    ",
+"    . at X@@@@@@@@@@@@@@@@@@@@@@@@@@X@@@@@@@@@@@@@@@@@@@@@X@@@o    ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@X@@@@@@@@@@@@@@@@@@@@@X@@@o    ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXXXXXXXXXXXXXX@@@@o    ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o    ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o    ",
+"    .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o    ",
+"    .ooooooooooooooooooooooooooooooooooooooooooooooooooooooo    ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                "};
diff --git a/mask.xbm b/mask.xbm
new file mode 100644
index 0000000..1722641
--- /dev/null
+++ b/mask.xbm
@@ -0,0 +1,46 @@
+#define mask_width 64
+#define mask_height 64
+static char mask_bits[] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
+  0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0xf0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff,
+  0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0x00, 0x00,
+  0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xff, 0x07,
+  0xe0, 0xff, 0x03, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xff, 0x07, 0x00,
+  0x00, 0xf0, 0x3f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xf8, 0x0f, 0x00,
+  0x00, 0xf0, 0x1f, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0xc0, 0x3f, 0x00,
+  0x00, 0xfe, 0x01, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0xfe, 0x00, 0x00,
+  0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00,
+  0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x80, 0x3f, 0x00, 0x00,
+  0x00, 0x00, 0xfc, 0x01, 0xc0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03,
+  0xc0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x03, 0xc0, 0xcf, 0xff, 0xff,
+  0xff, 0xff, 0xf3, 0x03, 0xe0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x07,
+  0xe0, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x07, 0xe0, 0xc7, 0xff, 0xff,
+  0xff, 0xff, 0xe3, 0x0f, 0xf0, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0f,
+  0xf0, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0f, 0xf0, 0xc3, 0xff, 0xff,
+  0xff, 0xff, 0xc3, 0x0f, 0xf0, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0f,
+  0xf0, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0f, 0xf0, 0xc3, 0xff, 0xff,
+  0xff, 0xff, 0xc3, 0x0f, 0xf0, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0f,
+  0xf0, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0f, 0xf0, 0xc3, 0xff, 0xff,
+  0xff, 0xff, 0xc3, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+  0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+  0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+  0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+  0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+  0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+  0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
diff --git a/nocharging.xpm b/nocharging.xpm
new file mode 100644
index 0000000..29c8838
--- /dev/null
+++ b/nocharging.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *nocharging[] = {
+/* width height num_colors chars_per_pixel */
+"    15     9        2            1",
+/* colors */
+". c #202020",
+"# c #004941",
+/* pixels */
+".........#.....",
+"........###....",
+".......###.##..",
+".......##....##",
+"......###......",
+"##....##.......",
+"..##.###.......",
+"....###........",
+".....#........."
+};
diff --git a/plugged.xpm b/plugged.xpm
new file mode 100644
index 0000000..e62a263
--- /dev/null
+++ b/plugged.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *plugged[] = {
+/* width height num_colors chars_per_pixel */
+"    10     8        2            1",
+/* colors */
+". c #202020",
+"# c #20b2ae",
+/* pixels */
+"....####..",
+"...#...###",
+"...#...#..",
+".###...#..",
+"#..#...###",
+"#...####..",
+"#.........",
+"#........."
+};
diff --git a/simplehal.c b/simplehal.c
new file mode 100644
index 0000000..f6379cd
--- /dev/null
+++ b/simplehal.c
@@ -0,0 +1,223 @@
+/* Not particularly good interface to hal, for programs that used to use
+ * apm.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <libhal.h>
+#include "apm.h"
+
+static DBusConnection *dbus_ctx = NULL;
+static LibHalContext *hal_ctx = NULL;
+
+int num_ac_adapters = 0;
+int num_batteries = 0;
+char **ac_adapters = NULL;
+char **batteries = NULL;
+
+int connect_hal (void) {
+	DBusError error;
+
+	dbus_error_init(&error);
+	dbus_ctx = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
+	if (dbus_ctx == NULL) {
+		fprintf(stderr, "error: dbus_bus_get: %s: %s\n",
+			 error.name, error.message);
+		LIBHAL_FREE_DBUS_ERROR(&error);
+		return 0;
+	}
+	if ((hal_ctx = libhal_ctx_new()) == NULL) {
+		fprintf(stderr, "error: libhal_ctx_new\n");
+		LIBHAL_FREE_DBUS_ERROR(&error);
+		return 0;
+	}
+	if (!libhal_ctx_set_dbus_connection(hal_ctx, dbus_ctx)) {
+		fprintf(stderr, "error: libhal_ctx_set_dbus_connection: %s: %s\n",
+			 error.name, error.message);
+		LIBHAL_FREE_DBUS_ERROR(&error);
+		return 0;
+	}
+	if (!libhal_ctx_init(hal_ctx, &error)) {
+		if (dbus_error_is_set(&error)) {
+			fprintf(stderr, "error: libhal_ctx_init: %s: %s\n", error.name, error.message);
+			LIBHAL_FREE_DBUS_ERROR(&error);
+		}
+		fprintf(stderr, "Could not initialise connection to hald.\n"
+				 "Normally this means the HAL daemon (hald) is not running or not ready.\n");
+		return 0;
+	}
+
+	return 1;
+}
+	
+int hal_ready (void) {
+	if (hal_ctx && dbus_connection_get_is_connected(dbus_ctx)) {
+		return 1;
+	}
+	else {
+		/* The messy business of reconnecting.
+		 * dbus's design is crap when it comes to reconnecting.
+		 * If dbus is down, can't actually close the connection to hal,
+		 * since libhal wants to use dbus to do it. */
+		if (dbus_ctx) {
+			dbus_connection_close(dbus_ctx);
+			dbus_connection_unref(dbus_ctx);
+		}
+		dbus_ctx = NULL;
+		hal_ctx = NULL;
+
+		return connect_hal();
+	}
+}
+
+signed int get_hal_int (const char *udi, const char *key, int optional) {
+	int ret;
+	DBusError error;
+
+	if (! hal_ready()) {
+		return -1;
+	}
+
+	dbus_error_init(&error);
+
+	ret = libhal_device_get_property_int (hal_ctx, udi, key, &error);
+	
+	if (! dbus_error_is_set (&error)) {
+		return ret;
+	}
+	else {
+		if (! optional) {
+			fprintf(stderr, "error: libhal_device_get_property_int: %s: %s\n",
+				 error.name, error.message);
+		}
+		dbus_error_free (&error);
+		return -1;
+	}
+}
+
+signed int get_hal_bool (const char *udi, const char *key, int optional) {
+	int ret;
+	DBusError error;
+	
+	if (! hal_ready()) {
+		return -1;
+	}
+	
+	dbus_error_init(&error);
+
+	ret = libhal_device_get_property_bool (hal_ctx, udi, key, &error);
+	
+	if (! dbus_error_is_set (&error)) {
+		return ret;
+	}
+	else {
+		if (! optional) {
+			fprintf(stderr, "error: libhal_device_get_property_bool: %s: %s\n",
+				 error.name, error.message);
+		}
+		dbus_error_free (&error);
+		return -1;
+	}
+}
+
+void find_devices (void) {
+	DBusError error;
+
+	dbus_error_init(&error);
+
+	if (ac_adapters)
+		libhal_free_string_array(ac_adapters);
+	ac_adapters = libhal_find_device_by_capability(hal_ctx, "ac_adapter",
+		&num_ac_adapters, &error);
+	if (dbus_error_is_set (&error)) {
+		fprintf (stderr, "error: %s: %s\n", error.name, error.message);
+		LIBHAL_FREE_DBUS_ERROR (&error);
+	}
+
+	if (batteries)
+		libhal_free_string_array(batteries);
+	batteries = libhal_find_device_by_capability(hal_ctx, "battery",
+		&num_batteries, &error);
+	if (dbus_error_is_set (&error)) {
+		fprintf (stderr, "error: %s: %s\n", error.name, error.message);
+		LIBHAL_FREE_DBUS_ERROR (&error);
+	}
+}
+
+int simplehal_supported (void) {
+	if (! connect_hal()) {
+		return 0;
+	}
+	else {
+		find_devices();
+		return 1;
+	}
+}
+
+/* Fill the passed apm_info struct. */
+int simplehal_read (int battery, apm_info *info) {
+	char *device;
+	int i;
+
+	/* Allow a battery that was not present before to appear. */
+	if (battery > num_batteries) {
+		find_devices();
+	}
+
+	info->battery_flags = 0;
+	info->using_minutes = 0;
+
+	info->ac_line_status=0;
+	for (i = 0 ; i < num_ac_adapters && ! info->ac_line_status ; i++) {
+		info->ac_line_status = (get_hal_bool(ac_adapters[i], "ac_adapter.present", 0) == 1);
+	}
+
+	if (battery > num_batteries) {
+		info->battery_percentage = 0;
+		info->battery_time = 0;
+		info->battery_status = BATTERY_STATUS_ABSENT;
+		return 0;
+	}
+	else {
+		device=batteries[battery-1];
+	}
+
+	if (get_hal_bool(device, "battery.present", 0) != 1) {
+		info->battery_percentage = 0;
+		info->battery_time = 0;
+		info->battery_status = BATTERY_STATUS_ABSENT;
+		return 0;
+	}
+	
+	/* remaining_time and charge_level.percentage are not a mandatory
+	 * keys, so if not present, -1 will be returned */
+	info->battery_time = get_hal_int(device, "battery.remaining_time", 1);
+	info->battery_percentage = get_hal_int(device, "battery.charge_level.percentage", 1);
+	if (get_hal_bool(device, "battery.rechargeable.is_discharging", 0) == 1) {
+		info->battery_status = BATTERY_STATUS_CHARGING;
+		/* charge_level.warning and charge_level.low are not
+		 * required to be available; this is good enough */
+		if (info->battery_percentage < 1) {
+			info->battery_status = BATTERY_STATUS_CRITICAL;
+		}
+		else if (info->battery_percentage < 10) {
+			info->battery_status = BATTERY_STATUS_LOW;
+		}
+	}
+	else if (info->ac_line_status &&
+	         get_hal_bool(device, "battery.rechargeable.is_charging", 0) == 1) {
+		info->battery_status = BATTERY_STATUS_CHARGING;
+		info->battery_flags = info->battery_flags | BATTERY_FLAGS_CHARGING;
+	}
+	else if (info->ac_line_status) {
+		/* Must be fully charged. */
+		info->battery_status = BATTERY_STATUS_HIGH;
+	}
+	else {
+		fprintf(stderr, "unknown battery state\n");
+	}
+
+	return 0;
+}
diff --git a/simplehal.h b/simplehal.h
new file mode 100644
index 0000000..1f4cd2a
--- /dev/null
+++ b/simplehal.h
@@ -0,0 +1,2 @@
+int simplehal_supported (void);
+int simplehal_read (int battery, apm_info *info);
diff --git a/smallfont.xpm b/smallfont.xpm
new file mode 100644
index 0000000..52077af
--- /dev/null
+++ b/smallfont.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char * smallfont_xpm[] = {
+"67 7 6 1",
+" 	c #208120812081",
+".	c #2081B2CAAEBA",
+"X	c #000049244103",
+"o	c #18618A288617",
+"O	c #000079E771C6",
+"+	c #104079E779E7",
+" ...   XXXo o...o o...o oXXXo o...o o...o o...o o...o o...o  X    o",
+".   . X   . X   . X   . .   . .   X .   X X   . .   . .   . X X X .",
+".   . X   . X   . X   . .   . .   X .   X X   . .   . .   .  X X  .",
+"oXXXo  XXXo o...o  ...o o...o O...o o...o  XXXo o...o +...o   X   o",
+".   . X   . .   X X   . X   . X   . .   . X   . .   . X   .  X X  .",
+".   . X   . .   X X   . X   . X   . .   . X   . .   . X   . X X X .",
+" ...   XXX. o...o o...o  XXXo o...o o...o  XXXO o...o o...o    X  ."};
diff --git a/sonypi.c b/sonypi.c
new file mode 100644
index 0000000..71ff9b1
--- /dev/null
+++ b/sonypi.c
@@ -0,0 +1,74 @@
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include "apm.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "sonypi.h"
+
+signed int spicfd = -1;
+
+int sonypi_supported (void) {
+	if ((spicfd = open("/dev/sonypi", O_RDWR)) == -1)
+		return 0;
+	else
+		return 1;
+}
+
+inline int sonypi_ioctl(int ioctlno, void *param) {
+	if (ioctl(spicfd, ioctlno, param) < 0)
+		return 0;
+	else
+		return 1;
+}
+
+/* Read battery info from sonypi device and shove it into an apm_info
+ * struct. */
+int sonypi_read (apm_info *info) {
+	__u8 batflags;
+	__u16 cap, rem;
+	int havebatt = 0;
+	
+	info->using_minutes = info->battery_flags = 0;
+	
+	if (! sonypi_ioctl(SONYPI_IOCGBATFLAGS, &batflags)) {
+		return 1;
+	}
+
+	info->ac_line_status = (batflags & SONYPI_BFLAGS_AC) != 0;
+	if (batflags & SONYPI_BFLAGS_B1) {
+		if (! sonypi_ioctl(SONYPI_IOCGBAT1CAP, &cap))
+			return 1;
+		if (! sonypi_ioctl(SONYPI_IOCGBAT1REM, &rem))
+			return 1;
+		havebatt = 1;
+	}
+	else if (batflags & SONYPI_BFLAGS_B2) {
+		/* Not quite right, if there is a second battery I should
+		 * probably merge the two somehow.. */
+		if (! sonypi_ioctl(SONYPI_IOCGBAT2CAP, &cap))
+			return 1;
+		if (! sonypi_ioctl(SONYPI_IOCGBAT2REM, &rem))
+			return 1;
+		havebatt = 1;
+	}
+	else {
+		info->battery_percentage = 0;
+		info->battery_status = BATTERY_STATUS_ABSENT;
+	}
+	
+	if (havebatt) {
+		info->battery_percentage = 100 * rem / cap;
+		/* Guess at whether the battery is charging. */
+		if (info->battery_percentage < 99 && info->ac_line_status == 1) {
+			info->battery_flags = info->battery_flags | BATTERY_FLAGS_CHARGING;
+			info->battery_status = BATTERY_STATUS_CHARGING;
+		}
+	}
+	
+	/* Sadly, there is no way to estimate this. */
+	info->battery_time = 0;
+	
+	return 0;
+}
diff --git a/sonypi.h b/sonypi.h
new file mode 100644
index 0000000..03650af
--- /dev/null
+++ b/sonypi.h
@@ -0,0 +1,19 @@
+int sonypi_supported (void);
+int sonypi_read (apm_info *info);
+
+/* There's no good place to get these constants, so I must define them
+ * myself. */
+
+#include <linux/types.h>
+
+/* get battery full capacity/remaining capacity */
+#define SONYPI_IOCGBAT1CAP	_IOR('v', 2, __u16)
+#define SONYPI_IOCGBAT1REM	_IOR('v', 3, __u16)
+#define SONYPI_IOCGBAT2CAP	_IOR('v', 4, __u16)
+#define SONYPI_IOCGBAT2REM	_IOR('v', 5, __u16)
+
+/* get battery flags: battery1/battery2/ac adapter present */
+#define SONYPI_BFLAGS_B1	0x01
+#define SONYPI_BFLAGS_B2	0x02
+#define SONYPI_BFLAGS_AC	0x04
+#define SONYPI_IOCGBATFLAGS	_IOR('v', 7, __u8)
diff --git a/unplugged.xpm b/unplugged.xpm
new file mode 100644
index 0000000..7b74879
--- /dev/null
+++ b/unplugged.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *unplugged[] = {
+/* width height num_colors chars_per_pixel */
+"    10     8        2            1",
+/* colors */
+". c #202020",
+"# c #004941",
+/* pixels */
+"....####..",
+"...#...###",
+"...#...#..",
+".###...#..",
+"#..#...###",
+"#...####..",
+"#.........",
+"#........."
+};
diff --git a/wmbattery.1x b/wmbattery.1x
new file mode 100644
index 0000000..f879afc
--- /dev/null
+++ b/wmbattery.1x
@@ -0,0 +1,108 @@
+.TH WMBATTERY 1x
+.SH NAME
+wmbattery \- dockable battery monitor
+.SH SYNOPSIS
+.B wmbattery
+[options]
+.SH DESCRIPTION
+.PP
+.B wmbattery
+is a battery monitor.  It is used to visually display the system's battery 
+status.
+.PP
+.B wmbattery
+can get battery information using HAL, APM, ACPI, or
+the SPIC controller in some Sony laptops. You need to build your kernel with
+support for at least one of these for the program to work.
+.B wmbattery
+is dockable using WindowMaker and AfterStep window managers; under
+other window managers
+.B wmbattery
+appears as a nicely-sized 64x64 application.
+.PP
+.B wmbattery
+displays the status of your laptop's battery in a small icon.  This
+includes if it is plugged in, if the battery is charging, how many
+minutes of battery life remain, battery life remaining (with both a
+percentage and a graph), and battery status (high - green, low -
+yellow, or critical - red).
+.SH "ELEMENTS OF THE DISPLAY"
+The
+.B wmbattery
+display consists of these elements:
+.TP
+.B dial
+The large dial at the top of the display shows battery life remaining.
+.TP
+.B time display
+The time display, right under and in the middle of the dial, shows how
+many hours and minutes of battery life is estimated to remain at the
+current rate of use.
+.P
+.RS
+If ACPI is used and battery is charging, the time display will instead show
+a countdown (starting with a minus sign) of how many hours and minutes it is
+estimated to take until the battery is fully charged.
+.RE
+.TP
+.B power cord
+The small icon of a power cord plug, in the bottom left, tells if the
+laptop is plugged into wall power. If so, it will be lit.
+.TP
+.B charging indicator
+The lightning bolt icon, to the right of the plug, tells if the
+battery is being charged. If so it will be lit and will connect the
+plug to the battery.
+.TP
+.B battery icon
+The battery icon, to the right of the lighting bolt, shows the
+percentage of battery time. If the battery is removed the icon will be
+dimmed. If the computer is low on power the battery will turn yellow;
+if the computer is critically low on power and about to die because of
+it, it will turn red.
+.SH OPTIONS
+.TP
+.B \-h
+Display list of command-line options.
+.TP
+.B \-w secs
+Pause this many seconds between updates.
+.TP
+.B \-d display
+Use the designated X display.
+.TP
+.B \-g +x+y
+Specify geometry. This specifies position, not size.
+.TP
+.B \-b battnum
+Display the given battery. Only of use with the HAL or ACPI interfaces on
+systems with more than one battery. The default is to display the first
+battery found.
+.TP
+.B \-l percent
+Set the percentage at which the battery is considered to be running low. By
+default, this percentage is determined automaticall, and you shouldn't
+need to set it. If you set this, you should probably also set the \-c
+switch.
+.TP
+.B \-c percent
+Set the percentage at which the battery is considered to be critically low.
+By default, this percentage is determined automatically, and you shouldn't
+need to set it. If you set this, you should probably also set the \-l
+switch.
+.TP
+.B \-e
+wmbattery contains code for estimating the time remaining before discharge,
+and until full charge, and this code is used if no other source of this
+informaton is available. This switch makes wmbattery use its time 
+estimation code even if some other estimate is available.
+.TP
+.B \-s granularity
+Ignore fluctuations less than the specified granularity percent when
+estimating time. (Implies -e)
+.TP
+.B \-a file.au
+Play the specified au file (by sending it to /dev/audio) when the battery
+is low.
+.SH AUTHOR
+Joey Hess <joey at kitenet.net>
diff --git a/wmbattery.c b/wmbattery.c
new file mode 100644
index 0000000..454568e
--- /dev/null
+++ b/wmbattery.c
@@ -0,0 +1,629 @@
+#include "config.h"
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <X11/xpm.h>
+#include <X11/extensions/shape.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#include "wmbattery.h"
+#include "mask.xbm"
+#include "sonypi.h"
+#include "acpi.h"
+#ifdef HAL
+#include "simplehal.h"
+#endif
+
+Pixmap images[NUM_IMAGES];
+Window root, iconwin, win;
+int screen;
+XpmIcon icon;
+Display *display;
+GC NormalGC;
+int pos[2] = {0, 0};
+
+char *crit_audio_fn = NULL;
+char *crit_audio;
+int crit_audio_size;
+
+int battnum = 1;
+#ifdef HAL
+int use_simplehal = 0;
+#endif
+int use_sonypi = 0;
+int use_acpi = 0;
+int delay = 0;
+int always_estimate_remaining = 0;
+int granularity_estimate_remaining = 1;
+
+signed int low_pct = -1;
+signed int critical_pct = -1;
+
+void error(const char *fmt, ...) {
+	va_list arglist;
+  
+	va_start(arglist, fmt);
+	fprintf(stderr, "Error: ");
+	vfprintf(stderr, fmt, arglist);
+	fprintf(stderr, "\n");
+	va_end(arglist);
+
+	exit(1);
+}
+
+int apm_change(apm_info *cur) {
+	static int ac_line_status = 0, battery_status = 0, battery_flags = 0,
+		battery_percentage = 0, battery_time = 0, using_minutes = 0;
+
+	int i = cur->ac_line_status     == ac_line_status     &&
+		cur->battery_status     == battery_status     &&
+		cur->battery_flags      == battery_flags      &&
+		cur->battery_percentage == battery_percentage &&
+		cur->battery_time       == battery_time       &&
+		cur->using_minutes      == using_minutes;
+
+	ac_line_status = cur->ac_line_status;
+	battery_status = cur->battery_status;
+	battery_flags = cur->battery_flags;
+	battery_percentage = cur->battery_percentage;
+	battery_time = cur->battery_time;
+	using_minutes = cur->using_minutes;
+
+	return i;
+}
+
+/* Calculate battery estimate */
+void estimate_timeleft(apm_info *cur_info) {
+	/* Time of the last estimate */
+	static time_t estimate_time = 0;
+	/* Estimated time left */
+	static time_t estimate = 0;
+	/* Time when we last noticed a battery level change */
+	static time_t battery_change_time = 0;
+	/* The previous estimation we had before the battery level changed */
+	static time_t prev_estimate = 0;
+	/* Percentage at the last estimate */
+	static short percent = 0;
+	/* Where we charging or discharging the last time we were called? */
+	static short was_charging = 1;
+	/* Have we made a guess lately? */
+	static short guessed_lately = 0;
+
+	time_t t;
+	int interval;
+	short is_charging = cur_info->battery_flags & BATTERY_FLAGS_CHARGING;
+
+	errno = 0;
+	if (time(&t) == ((time_t)-1) && errno != 0)
+		goto estim_values;
+
+	if ((
+	     /* AC is on and battery is not charging anymore or ... */
+	     (cur_info->ac_line_status == AC_LINE_STATUS_ON) && !is_charging
+	     ) ||
+	    (
+	     /* ... the charging state has changed */
+	     is_charging ^ was_charging
+	     )) {
+		/* Reset counters */
+		battery_change_time = t;
+		estimate = -1;
+		guessed_lately = 0;
+		estimate_time = t;
+		prev_estimate = 0;
+		goto estim_values;
+	}
+
+	/* No change: decrease estimate */
+	if ((percent - cur_info->battery_percentage)
+	    / granularity_estimate_remaining == 0) {
+		estimate -= t - estimate_time;
+		estimate_time = t;
+		if (guessed_lately && estimate < 0)
+			estimate = 0;
+		goto estim_values;
+	}
+
+	/* The battery level changed: calculate estimate based
+	 * on change speed and previous estimate */
+	guessed_lately = 1;
+	estimate_time = t;
+	interval = estimate_time - battery_change_time;
+	prev_estimate = estimate;
+	battery_change_time = estimate_time;
+	estimate = (is_charging
+		    ? (cur_info->battery_percentage - 100)
+		    : cur_info->battery_percentage)
+		* interval / (percent - cur_info->battery_percentage);
+	if (prev_estimate > 0)
+		estimate = (estimate * 2 + prev_estimate) / 3;
+
+estim_values:
+	percent = cur_info->battery_percentage;
+	was_charging = is_charging;
+	cur_info->battery_time = estimate;
+	if (estimate < 0)
+		estimate = 0;
+	cur_info->using_minutes = 0;
+}
+
+/* Load up the images this program uses. */
+void load_images() {
+  	int x;
+	char fn[128]; /* enough? */
+
+  	for(x=0; x < NUM_IMAGES; x++) {
+         	sprintf(fn, "%s/%s.xpm", ICONDIR, image_info[x].filename);
+                if (XpmReadFileToPixmap(display, root, fn, &images[x], NULL, NULL)) {
+		  	/* Check in current direcotry for fallback. */
+		  	sprintf(fn, "%s.xpm", image_info[x].filename);
+		  	if (XpmReadFileToPixmap(display, root, fn, &images[x], NULL, NULL)) {
+			 	error("Failed to load %s\n",fn);
+		}
+	}
+    }
+}
+
+void load_audio() {
+	int fd;
+	struct stat s;
+
+	crit_audio = NULL;
+	if (crit_audio_fn == NULL) {
+		return;
+	}
+	fd = open(crit_audio_fn, 0);
+	if (fd == -1) {
+		error("unable to open audio file");
+	}
+	if (fstat(fd, &s) == 0) {
+		crit_audio_size = s.st_size;
+		crit_audio = malloc(crit_audio_size);
+		/* XXX: make this more robust? (loop?) */
+		if (read(fd, crit_audio, crit_audio_size) != crit_audio_size) {
+			free(crit_audio);
+			crit_audio = NULL;
+			error("unable to read audio file");
+		}
+	}
+	close(fd);
+}
+
+/* Returns the display to run on (or NULL for default). */
+char *parse_commandline(int argc, char *argv[]) {
+	int c=0;
+	char *ret=NULL;
+        char *s;
+	extern char *optarg;
+	
+  	while (c != -1) {
+  		c=getopt(argc, argv, "hd:g:f:b:w:c:l:es:a:");
+		switch (c) {
+		  case 'h':
+			printf("Usage: wmbattery [options]\n");
+              		printf("\t-d <display>\tselects target display\n");
+               		printf("\t-h\t\tdisplay this help\n");
+                        printf("\t-g +x+y\t\tposition of the window\n");
+			printf("\t-b num\t\tnumber of battery to display\n");
+			printf("\t-w secs\t\tseconds between updates\n");
+			printf("\t-l percent\tlow percentage\n");
+			printf("\t-c percent\tcritical percentage\n");
+			printf("\t-e\t\tuse own time estimates\n");
+			printf("\t-s granularity\tignore fluctuations less than granularity%% (implies -e)\n");
+			printf("\t-a file\t\twhen critical send file to /dev/audio\n");
+               		exit(0);
+		 	break;
+		  case 'd':
+		  	ret=strdup(optarg);
+                        break;
+		  case 'g':
+			s = strtok(optarg, "+");
+			if (s) {
+				pos[0]=atoi(s);
+				if ((s = strtok(NULL, "+")) != NULL) {
+					pos[1]=atoi(s);
+				}
+				else {
+					pos[0]=0;
+				}
+			}
+			break;
+		  case 'b':
+			battnum = atoi(optarg);
+			break;
+		  case 'w':
+			delay = atoi(optarg);
+			break;
+		  case 'l':
+			low_pct = atoi(optarg);
+			break;
+		  case 'c':
+			critical_pct = atoi(optarg);
+			break;
+		  case 'e':
+			always_estimate_remaining = 1;
+			break;
+		  case 's':
+			always_estimate_remaining = 1;
+			granularity_estimate_remaining = atoi(optarg);
+			break;
+		  case 'a':
+			crit_audio_fn = strdup(optarg);
+			break;
+		}
+	}
+
+	return ret;
+}
+
+/* Sets up the window and icon and all the nasty X stuff. */
+void make_window(char *display_name, int argc, char *argv[]) {
+	XClassHint classhint;
+	char *wname = argv[0];
+	XTextProperty name;
+	XGCValues gcv;
+	int dummy=0, borderwidth = 1;
+	XSizeHints sizehints;
+	XWMHints wmhints;
+	Pixel back_pix, fore_pix;
+	Pixmap pixmask;
+
+	if (!(display = XOpenDisplay(display_name)))
+		error("can't open display %s",XDisplayName(display_name));
+
+	screen=DefaultScreen(display);
+	root=RootWindow(display, screen);
+
+	/* Create window. */
+	sizehints.flags = USSize | USPosition;
+	sizehints.x = 0;
+	sizehints.y = 0;
+	XWMGeometry(display, screen, "", NULL, borderwidth,
+		    &sizehints, &sizehints.x, &sizehints.y,
+		    &sizehints.width, &sizehints.height, &dummy);
+
+	sizehints.width = 64;
+	sizehints.height = 64;
+	sizehints.x = pos[0];
+	sizehints.y = pos[1];
+	back_pix = WhitePixel(display, screen);
+	fore_pix = BlackPixel(display, screen);
+	win = XCreateSimpleWindow(display, root, sizehints.x, sizehints.y,
+				  sizehints.width, sizehints.height,
+				  borderwidth, fore_pix, back_pix);
+	iconwin = XCreateSimpleWindow(display, win, sizehints.x,
+				      sizehints.y, sizehints.width,
+				      sizehints.height, borderwidth,
+				      fore_pix, back_pix);
+
+	/* Activate hints */
+	XSetWMNormalHints(display, win, &sizehints);
+	classhint.res_name = wname;
+	classhint.res_class = wname;
+	XSetClassHint(display, win, &classhint);
+  
+	if (! XStringListToTextProperty(&wname, 1, &name))
+		error("Can't allocate window name.");
+
+	XSetWMName(display, win, &name);
+  
+	/* Create GC for drawing */
+	gcv.foreground = fore_pix;
+	gcv.background = back_pix;
+	gcv.graphics_exposures = 0;
+	NormalGC = XCreateGC(display, root, 
+			     GCForeground | GCBackground | GCGraphicsExposures,
+			     &gcv);
+
+	pixmask = XCreateBitmapFromData(display, win, mask_bits,
+					mask_width,mask_height);
+	XShapeCombineMask(display, win, ShapeBounding, 0, 0,
+			  pixmask, ShapeSet);
+	XShapeCombineMask(display, iconwin, ShapeBounding, 0, 0,
+			  pixmask, ShapeSet);
+	
+	wmhints.initial_state = WithdrawnState;
+	wmhints.icon_window = iconwin;
+	wmhints.icon_x = sizehints.x;
+	wmhints.icon_y = sizehints.y;
+	wmhints.window_group = win;
+	wmhints.flags = StateHint | IconWindowHint | 
+    			IconPositionHint | WindowGroupHint;
+  
+	XSetWMHints(display, win, &wmhints);
+	XSetCommand(display, win, argv, argc);
+
+	XSelectInput(display, iconwin, ExposureMask);
+	XSelectInput(display, win, ExposureMask);
+
+	XMapWindow(display, win);
+}
+
+void flush_expose(Window w) {
+	XEvent dummy;
+  
+	while (XCheckTypedWindowEvent(display, w, Expose, &dummy));
+}
+
+void redraw_window() {
+	XCopyArea(display, images[FACE], iconwin, NormalGC, 0, 0,
+		  image_info[FACE].width, image_info[FACE].height, 0,0);
+	flush_expose(iconwin);
+	XCopyArea(display, images[FACE], win, NormalGC, 0, 0, 
+		  image_info[FACE].width, image_info[FACE].height, 0,0);
+	flush_expose(win);
+}
+
+/*
+ * Display an image, using XCopyArea. Can display only part of an image,
+ * located anywhere.
+ */
+void copy_image(int image, int xoffset, int yoffset,
+                int width, int height, int x, int y) {
+	XCopyArea(display, images[image], images[FACE], NormalGC,
+	          xoffset, yoffset, width, height, x, y);
+}
+
+/*
+ * Display a letter in one of two fonts, at the specified x position.
+ * Note that 10 is passed for special characters `:' or `1' at the 
+ * end of the font. 
+ */
+void draw_letter(int letter, int font, int x) {
+	copy_image(font, image_info[font].charwidth * letter, 0,
+		   image_info[font].charwidth, image_info[font].height,
+		   x, image_info[font].y);
+}
+
+/* Display an image at its normal location. */
+void draw_image(int image) {
+  	copy_image(image, 0, 0, 
+		   image_info[image].width, image_info[image].height,
+		   image_info[image].x, image_info[image].y);
+}
+
+void recalc_window(apm_info cur_info) {
+	int time_left, hour_left, min_left, digit, x;
+	static int blinked = 0;
+	
+	/* Display if it's plugged in. */
+      	switch (cur_info.ac_line_status) {
+	  case AC_LINE_STATUS_ON:
+		draw_image(PLUGGED);
+		break;
+       	  default:
+		draw_image(UNPLUGGED);
+	}
+	
+      	/* Display the appropriate color battery. */
+      	switch (cur_info.battery_status) {
+	  case BATTERY_STATUS_HIGH:
+	  case BATTERY_STATUS_CHARGING:
+		draw_image(BATTERY_HIGH);
+		break;
+	  case BATTERY_STATUS_LOW:
+		draw_image(BATTERY_LOW);
+		break;
+	  case BATTERY_STATUS_CRITICAL: /* blinking red battery */
+		if (blinked)
+			draw_image(BATTERY_CRITICAL);
+		else
+			draw_image(BATTERY_BLINK);
+		blinked=!blinked;
+		break;
+	  default:
+		draw_image(BATTERY_NONE);
+      	}
+
+      	/* Show if the battery is charging. */
+  	if (cur_info.battery_flags & BATTERY_FLAGS_CHARGING) {
+		draw_image(CHARGING);
+	}
+  	else {
+		draw_image(NOCHARGING);
+      	}
+
+     	/*
+       	 * Display the percent left dial. This has the side effect of
+         * clearing the time left field. 
+         */
+  	x=DIAL_MULTIPLIER * cur_info.battery_percentage;
+      	if (x >= 0) {
+		/* Start by displaying bright on the dial. */
+		copy_image(DIAL_BRIGHT, 0, 0,
+			   x, image_info[DIAL_BRIGHT].height,
+			   image_info[DIAL_BRIGHT].x,
+			   image_info[DIAL_BRIGHT].y);
+      	}
+      	/* Now display dim on the remainder of the dial. */
+  	copy_image(DIAL_DIM, x, 0,
+		   image_info[DIAL_DIM].width - x,
+		   image_info[DIAL_DIM].height,
+		   image_info[DIAL_DIM].x + x,
+		   image_info[DIAL_DIM].y);
+  
+	/* Show percent remaining */
+      	if (cur_info.battery_percentage >= 0) {
+        	digit = cur_info.battery_percentage / 10;
+       		if (digit == 10) {
+		  	/* 11 is the `1' for the hundreds place. */
+	  		draw_letter(11,SMALLFONT,HUNDREDS_OFFSET);
+	  		digit=0;
+		}
+		draw_letter(digit,SMALLFONT,TENS_OFFSET);
+		digit = cur_info.battery_percentage % 10;
+		draw_letter(digit,SMALLFONT,ONES_OFFSET);
+      	}
+  	else {
+	  	/* There is no battery, so we need to dim out the
+		 * percent sign that is normally bright. */
+	  	draw_letter(10,SMALLFONT,PERCENT_OFFSET);
+	}
+
+      	/* Show time left */
+
+	/* A negative number means that it is unknown. Dim the field. */
+	if (cur_info.battery_time < 0) {
+		draw_letter(10, BIGFONT, COLON_OFFSET);
+		redraw_window();
+		return;
+	}
+
+        if (cur_info.using_minutes)
+        	time_left = cur_info.battery_time;
+        else
+        	time_left = cur_info.battery_time / 60; 
+        hour_left = time_left / 60;
+        min_left = time_left % 60;
+        digit = hour_left / 10;
+	draw_letter(digit,BIGFONT,HOURS_TENS_OFFSET);
+        digit = hour_left % 10;
+	draw_letter(digit,BIGFONT,HOURS_ONES_OFFSET);
+       	digit = min_left / 10;
+        draw_letter(digit,BIGFONT,MINUTES_TENS_OFFSET);
+        digit = min_left % 10;
+        draw_letter(digit,BIGFONT,MINUTES_ONES_OFFSET);
+      	
+	redraw_window();
+}
+
+void snd_crit() {
+	int audio, n;
+
+	if (crit_audio) {
+		audio = open("/dev/audio", O_WRONLY);
+		if (audio >= 0) {
+			n = write(audio, crit_audio, crit_audio_size);
+			if (n != crit_audio_size) {
+				fprintf(stderr, "write failed (%d/%d bytes)\n", n, crit_audio_size);
+			}
+			close(audio);
+		}
+	}
+}
+
+void alarmhandler(int sig) {
+	apm_info cur_info;
+	int old_status;
+
+	old_status = cur_info.battery_status;
+	if (use_acpi) {
+		if (acpi_read(battnum, &cur_info) != 0)
+			error("Cannot read ACPI information.");
+	}
+#ifdef HAL
+	else if (use_simplehal) {
+		if (simplehal_read(battnum, &cur_info) != 0)
+			error("Cannot read HAL information.");
+	}
+#endif
+	else if (! use_sonypi) {
+		if (apm_read(&cur_info) != 0)
+			error("Cannot read APM information.");
+	}
+	else {
+		if (sonypi_read(&cur_info) != 0)
+			error("Cannot read sonypi information.");
+	}
+	
+	/* Always calculate remaining lifetime? apm and acpi both use a
+	 * negative number here to indicate error, missing battery, or
+	 * cannot determine time. */
+	if (always_estimate_remaining || cur_info.battery_time < 0)
+		estimate_timeleft(&cur_info);
+	
+	/* Override the battery status? */
+	if ((low_pct > -1 || critical_pct > -1) && 
+	    cur_info.ac_line_status != AC_LINE_STATUS_ON) {
+		if (cur_info.battery_percentage <= critical_pct)
+			cur_info.battery_status = BATTERY_STATUS_CRITICAL;
+		else if (cur_info.battery_percentage <= low_pct)
+			cur_info.battery_status = BATTERY_STATUS_LOW;
+		else
+			cur_info.battery_status = BATTERY_STATUS_HIGH;
+	}
+	
+	/* If APM data changes redraw and wait for next update */
+	/* Always redraw if the status is critical, to make it blink. */
+	if (!apm_change(&cur_info) || cur_info.battery_status == BATTERY_STATUS_CRITICAL)
+		recalc_window(cur_info);
+
+	if ((old_status == BATTERY_STATUS_HIGH) &&
+	    (cur_info.battery_status == BATTERY_STATUS_LOW)) {
+		snd_crit();
+	}
+	else if (cur_info.battery_status == BATTERY_STATUS_CRITICAL) {
+		snd_crit();
+	}
+
+	alarm(delay);
+}
+
+void check_battery_num(int real, int requested) {
+	if (requested > real || requested < 1) {
+		error("There %s only %i batter%s, and you asked for number %i.",
+			real == 1 ? "is" : "are",
+			real,
+			real == 1 ? "y" : "ies",
+			requested);
+	}
+}
+
+int main(int argc, char *argv[]) {
+	make_window(parse_commandline(argc, argv), argc ,argv);
+
+	/*  Check for APM support (returns 0 on success). */
+	if (apm_exists() == 0) {
+		if (! delay)
+			delay = 1;
+	}
+#ifdef HAL
+	/* Check for hal support. */
+	else if (simplehal_supported()) {
+		use_simplehal = 1;
+		if (! delay)
+			delay = 2;
+	}
+#endif
+	/* Check for ACPI support. */
+	else if (acpi_supported() && acpi_batt_count > 0) {
+		check_battery_num(acpi_batt_count, battnum);
+		use_acpi = 1;
+		if (! delay)
+			delay = 3; /* slow interface! */
+	}
+	else if (sonypi_supported()) {
+		use_sonypi = 1;
+		low_pct = 10;
+		critical_pct = 5;
+		if (! delay)
+			delay = 1;
+	}
+	else {
+		error("No APM, ACPI, HAL or SPIC support detected.");
+	}
+		
+	load_images();
+        load_audio();
+
+	signal(SIGALRM, alarmhandler);
+	alarmhandler(SIGALRM);
+
+	while (1) {
+		XEvent ev;
+		XNextEvent(display, &ev);
+		if (ev.type == Expose)
+			redraw_window();
+	}
+}
diff --git a/wmbattery.h b/wmbattery.h
new file mode 100644
index 0000000..4936957
--- /dev/null
+++ b/wmbattery.h
@@ -0,0 +1,70 @@
+#include "apm.h"
+
+typedef struct {
+	Pixmap pixmap;
+	Pixmap mask;
+  	XpmAttributes attributes;
+} XpmIcon;
+
+typedef struct image_info_type {
+  	const char* filename;
+  	const int width;
+  	const int height;
+  	const int x;
+  	const int y;
+  	const int charwidth;
+} image_info_type;
+
+/* Assign reference numbers to all images that are loaded. */
+#define SMALLFONT 0
+#define BIGFONT 1
+#define BATTERY_HIGH 2
+#define BATTERY_LOW 3
+#define BATTERY_CRITICAL 4
+#define BATTERY_NONE 5
+#define BATTERY_BLINK 6
+#define UNPLUGGED 7
+#define PLUGGED 8
+#define NOCHARGING 9
+#define CHARGING 10
+#define DIAL_BRIGHT 11
+#define DIAL_DIM 12
+#define FACE 13
+
+#define NUM_IMAGES 14
+
+/*
+ * An array of the filenames of all images to load (minus .xpm extention),
+ * plus the size of the image, where to draw it on the icon, etc
+ */
+static struct image_info_type image_info[] = {
+  {"smallfont",7,67,0,45,6},
+  {"bigfont",9,73,0,23,7},
+  {"battery_high",25,13,33,42,0},
+  {"battery_medium",25,13,33,42,0},
+  {"battery_low",25,13,33,42,0},
+  {"battery_none",25,13,33,42,0},
+  {"battery_blink",25,13,33,42,0},
+  {"unplugged",10,8,6,45,0},
+  {"plugged",10,8,6,45,0},
+  {"nocharging",15,9,17,43,0},
+  {"charging",15,9,17,43,0},
+  {"dial_bright",56,31,4,4,0},
+  {"dial_dim",56,31,4,4,0},
+  {"face",64,64,0,0,0},
+};
+
+#define DIAL_MULTIPLIER 0.56
+
+/* Locations of letters in the percent remaining display. */
+#define HUNDREDS_OFFSET 35
+#define TENS_OFFSET 37
+#define ONES_OFFSET 43
+#define PERCENT_OFFSET 49
+
+/* Locations of letters in the time remaining display. */
+#define HOURS_TENS_OFFSET 15
+#define HOURS_ONES_OFFSET 23
+#define COLON_OFFSET 30
+#define MINUTES_TENS_OFFSET 34
+#define MINUTES_ONES_OFFSET 41

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wmaker/wmbattery.git



More information about the Pkg-wmaker-commits mailing list