Previously, wmmixer-alsa existed as an object in the repository named
wmmixer-alsa-0.6.  However, it was not a directory and contained no files.
This patch removes this object and adds the source to wmmixer-alsa.  It was
obtained by extracting wmmixer-alsa-0.6.tar.gz from the source rpm found at
http://ftp.cc.uoc.gr/mirrors/linux/pld/pool/w/wmmixer-alsa/.
---
 wmmixer-alsa-0.6                |   1 -
 wmmixer-alsa/COPYING            | 339 +++++++++++++++++++++++++
 wmmixer-alsa/Makefile           |   9 +
 wmmixer-alsa/README             |  12 +
 wmmixer-alsa/XPM/CVS/Entries    |   4 +
 wmmixer-alsa/XPM/CVS/Repository |   1 +
 wmmixer-alsa/XPM/CVS/Root       |   1 +
 wmmixer-alsa/XPM/icons.xpm      |  29 +++
 wmmixer-alsa/XPM/tile.xpm       | 121 +++++++++
 wmmixer-alsa/XPM/wmmixer.xpm    |  74 ++++++
 wmmixer-alsa/mixer.c            |  91 +++++++
 wmmixer-alsa/wmmixer-alsa.c     | 545 ++++++++++++++++++++++++++++++++++++++++
 wmmixer-alsa/wmmixer-alsa.h     | 112 +++++++++
 13 files changed, 1338 insertions(+), 1 deletion(-)
 delete mode 160000 wmmixer-alsa-0.6
 create mode 100644 wmmixer-alsa/COPYING
 create mode 100644 wmmixer-alsa/Makefile
 create mode 100644 wmmixer-alsa/README
 create mode 100644 wmmixer-alsa/XPM/CVS/Entries
 create mode 100644 wmmixer-alsa/XPM/CVS/Repository
 create mode 100644 wmmixer-alsa/XPM/CVS/Root
 create mode 100644 wmmixer-alsa/XPM/icons.xpm
 create mode 100644 wmmixer-alsa/XPM/tile.xpm
 create mode 100644 wmmixer-alsa/XPM/wmmixer.xpm
 create mode 100644 wmmixer-alsa/mixer.c
 create mode 100644 wmmixer-alsa/wmmixer-alsa.c
 create mode 100644 wmmixer-alsa/wmmixer-alsa.h

diff --git a/wmmixer-alsa-0.6 b/wmmixer-alsa-0.6
deleted file mode 160000
index 8c37204..0000000
--- a/wmmixer-alsa-0.6
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 8c3720406c3c24b8b1f25b84796c116b32f3a2ca
diff --git a/wmmixer-alsa/COPYING b/wmmixer-alsa/COPYING
new file mode 100644
index 0000000..a43ea21
--- /dev/null
+++ b/wmmixer-alsa/COPYING
@@ -0,0 +1,339 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, 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
+
+       Appendix: 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) 19yy  <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., 675 Mass Ave, Cambridge, MA 02139, 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) 19yy 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/wmmixer-alsa/Makefile b/wmmixer-alsa/Makefile
new file mode 100644
index 0000000..2149153
--- /dev/null
+++ b/wmmixer-alsa/Makefile
@@ -0,0 +1,9 @@
+CC=gcc
+CFLAGS= -I/usr/X11R6/include -g
+OBJS=wmmixer-alsa.o mixer.o
+
+all:   ${OBJS}
+       ${CC} -L/usr/X11R6/lib -g -lm -lXpm -lXext -lX11 -lasound ${OBJS} -o 
wmmixer-alsa
+
+clean:
+       rm -rf *.o *~ wmmixer-alsa
diff --git a/wmmixer-alsa/README b/wmmixer-alsa/README
new file mode 100644
index 0000000..7e74c57
--- /dev/null
+++ b/wmmixer-alsa/README
@@ -0,0 +1,12 @@
+wmmixer-alsa 0.6 by Martin Dahl <da...@vf.telia.no>
+
+A hacked version of wmmixer by Sam Hawker to make it use ALSA
+(Advanced Linux Sound Architecture) in stead of the OSS sound
+drivers in the linux kernel. To compile and run this program,
+you will need to get alsa-driver and alsa-lib from
+www.alsa-project.org !
+
+To compile the program, just do a 'make', and then copy the
+'wmmixer-alsa' program to your favourite location.
+
+See COPYING for licence details.
diff --git a/wmmixer-alsa/XPM/CVS/Entries b/wmmixer-alsa/XPM/CVS/Entries
new file mode 100644
index 0000000..7272672
--- /dev/null
+++ b/wmmixer-alsa/XPM/CVS/Entries
@@ -0,0 +1,4 @@
+/icons.xpm/1.1.1.1/Fri Jun 18 02:02:45 1999//
+/tile.xpm/1.1.1.1/Fri Jun 18 02:02:46 1999//
+/wmmixer.xpm/1.1.1.1/Fri Jun 18 02:02:46 1999//
+D
diff --git a/wmmixer-alsa/XPM/CVS/Repository b/wmmixer-alsa/XPM/CVS/Repository
new file mode 100644
index 0000000..16659a1
--- /dev/null
+++ b/wmmixer-alsa/XPM/CVS/Repository
@@ -0,0 +1 @@
+wmmixer-alsa/XPM
diff --git a/wmmixer-alsa/XPM/CVS/Root b/wmmixer-alsa/XPM/CVS/Root
new file mode 100644
index 0000000..b401703
--- /dev/null
+++ b/wmmixer-alsa/XPM/CVS/Root
@@ -0,0 +1 @@
+:pserver:da...@cvs.bohemians.org:/home/cvsroot
diff --git a/wmmixer-alsa/XPM/icons.xpm b/wmmixer-alsa/XPM/icons.xpm
new file mode 100644
index 0000000..d34aac7
--- /dev/null
+++ b/wmmixer-alsa/XPM/icons.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char * icons_xpm[] = {
+"220 22 4 1",
+"      c #282828 s back_color",
+".     c #00ffff s led_color_high",
+"X     c #007b7b s led_color_low",
+"o     c #ffffff",
+"                                                                              
                                                                                
                                                              ",
+"                                                                              
                                                                                
                                                              ",
+"                                                                              
                                                                                
                            ..                                ",
+"                          ....                                                
                                     X..                                        
  XXXXXX                   .  .            ..                 ",
+"                         .    .                                           
......             X......X             X..X.                    ..             
     ........X                X.  .X          .  .                ",
+"                         .    .                                         
..XXX.....          X............X.       ..X.X.                  .. .          
      ..X   X....               X.  .X             .                ",
+"                 X.     .      .                                       
..XXXX......        X.......    . . .      .X.X..                 . . .       . 
      ...     .....  ..           .  .             .            X.   ",
+"               X...     .      .               ...............         
...XXX....o.        .X............X.        .X.. .               .X.  XX       
.     X..X      X...X ..            ..             .           X...   ",
+"             X.....    .        .              .X.X.X.X X.X.X.X       
.XX.XXX...o...       . X......X               ..XX .             . X.   .  .    
.     X...X      ...X              X.X                       X.....   ",
+"           X.......    .        .              .X.X.X.X X.X.X.X       
.XXXXX...o....       .                          .XX .               ..X .   .   
 .     ....      ...X             ....X            .       X.......   ",
+"         X.........    ....................    .X.X.X.X X.X.X.X       .XXXX.  
.XXXX.       X.                          .XX .              .X. X . . .  .     
X..X      ...X ..         X.X ..                  X.........   ",
+"       X...........              .        .    .X X X X X X X.X       .XXXX.  
.XXXX.        X.                          .XX .             .X. .   .    .      
        X...X ..        ..X ....               X...........   ",
+"     X.............              .        .    .X X X X X X X.X       
....o...XXXXX.         .                           .XX .            ..  .   .   
 .              ....           X.X . .  .            X.............   ",
+"   X...............               .      .     ...............X       
...o...XX..XX.         .                            .XX.         . X.   .  .    
.              ....            X.  .  . .          X...............   ",
+"  .................               .      .      XXXXXXXXXXXXXXX        
.o....XXX...          .                             ...          .X.  XX       
.            X....             X.     . .         .................   ",
+"                                   .    .                              
......XXXX..         ..                                .          . . .       . 
          X....X               X.   X.X.                             ",
+"                                   .    .                               
.....XXX..         ..                          X...   .X          .. .          
        ....                   X......                              ",
+"                                    ....                                  
......          ..                           .   ...X            ..             
      ..                          .X                              ",
+"                                                                              
            .                                                                   
                           ...X                               ",
+"                                                                              
                                                                                
                                                              ",
+"                                                                              
                                                                                
                                                              ",
+"                                                                              
                                                                                
                                                              "};
diff --git a/wmmixer-alsa/XPM/tile.xpm b/wmmixer-alsa/XPM/tile.xpm
new file mode 100644
index 0000000..e65c234
--- /dev/null
+++ b/wmmixer-alsa/XPM/tile.xpm
@@ -0,0 +1,121 @@
+/* XPM */
+static char *tile_xpm[] = {
+"64 64 54 1",
+"      c #F3CEF3CEF3CE",
+".     c #000000000000",
+"X     c #514461856185",
+"o     c #A289A289B2CA",
+"O     c #A289A289A289",
+"+     c #A2899248B2CA",
+"@     c #9248A289A289",
+"#     c #A2899248A289",
+"$     c #92489248A289",
+"%     c #924892489248",
+"&     c #92488207A289",
+"*     c #820792489248",
+"=     c #924882079248",
+"-     c #820782079248",
+";     c #820782078207",
+":     c #820771C69248",
+">     c #618551446185",
+",     c #9248A289B2CA",
+"<     c #92489248B2CA",
+"1     c #82079248A289",
+"2     c #82078207A289",
+"3     c #71C682079248",
+"4     c #71C682078207",
+"5     c #514451446185",
+"6     c #514451445144",
+"7     c #820771C68207",
+"8     c #410351445144",
+"9     c #514441035144",
+"0     c #71C671C69248",
+"q     c #71C671C68207",
+"w     c #71C671C671C6",
+"e     c #410341035144",
+"r     c #71C661858207",
+"t     c #618571C68207",
+"y     c #410351444103",
+"u     c #410341034103",
+"i     c #618571C671C6",
+"p     c #410330C24103",
+"a     c #30C241034103",
+"s     c #71C6618571C6",
+"d     c #6185618571C6",
+"f     c #618561858207",
+"g     c #30C230C230C2",
+"h     c #618561856185",
+"j     c #30C230C24103",
+"k     c #5144618571C6",
+"l     c #30C2410330C2",
+"z     c #6185514471C6",
+"x     c #208130C230C2",
+"c     c #30C2208130C2",
+"v     c #5144514471C6",
+"b     c #2081208130C2",
+"n     c #208120812081",
+"m     c #410330C25144",
+"                                                               .",
+"                                                              X.",
+"  oOoO+O+O+O+@#$+@#$#$#$$$#$$%&%&%&%&*&*&*=-=*=-=-=--;---;:;:;>.",
+"  oo@o,o@o@o@+@+@<@$@$@$@$@$1$$$*$*$*&*&*2*&*2*-*-*-----3-3-4-X.",
+"  oO+OoO#O+@#@#@#$#@#$#%#$$%$%$%&%&*=%&*=*=*=-=-=--;-;-;:;:;:;5.",
+"  ,ooo@+@+@+@+@<@#@<@$$$$$$$$$*$1$*&*&*&*&*2*---*-----3---4:4:6.",
+"  +O+O+O+@#$#@#$#$#$$%$$$%&%&%&%&*=*&*=-=*=---=--;---;:;:4:;:45.",
+"  @o@o@o@+@+@<@$@$@$$$@$1$1$*$*$*&*&*2*=*2*-*-*-----4-3-4:4-4:6.",
+"  +O#O+@#@#@#$#$#$#%#%$%&%$%&%&*=*&*=*=*=-=-=--;-;-;:;:;:;:4745.",
+"  @+@+@+@+@<@#@$@$$$$$$$$$*$*$*&*&*&*&*2*---*-----3---4:4:4:4:8.",
+"  #O+@#$#@#$#$#$$%$$$%&%&%&%&*=*&*=-=-=---=--;:;-;:;:4:4:474:49.",
+"  @o@<@+@<@$@$@$$$$$1$1$*$*$*&*&*2*=*2*-*-*-----4-4-4:4:4:4:408.",
+"  +@#@#@#$#$#$$%#%$%&%$%&%&*=*&*=*=*=-=-=--;-;-;:;:;:;:474747q9.",
+"  @+@+@<@$$$@$$$$$1$$$*&*$*&*&*&*&*2*---------3-3-4:4:4:4:404q8.",
+"  #$#@#$#$#$$%$$$%&%&%&%&*=-&*=-=-=---=--;:;:;:;:4:4:474:47q7q9.",
+"  @#@<@$@$@$$$$$*$1$*$*$*&*&*2*-*2*-*-*-3---4-4-4:4:4:4:404q4q8.",
+"  #@#$#$#$$%$%$%&%$%&%&*=*=*=-=*=-=;=--;-;-;:;:47;:474747q7q7q9.",
+"  @<@$$$@$$$$$1$$$*&*&*&*&*&*=*2*---------4-3-4:4:4:4:404qq04q8.",
+"  #$#$#$$%$%$%&%&%&%&*=-&*=-=-=------;:;:;:;:4:4:47q747qqq7qqq9.",
+"  @$@$@$$$$$*$1$*$*$*&*&*2*-*-*---*-3-3-4-4-4:4:4:4:404q4q4qqq8.",
+"  #$#$$%$%$%&%&%&%&*=*=*=-=-=-=;=--;:;-;:;:474:474747q7q7qqwqw9.",
+"  $$@$$$$$*$$$*&*&*&*&*2*=*2*---------4-3-4:4:4:4:404qqq4qqqqqe.",
+"  #$$%$%$%&%&*&%&*=-&*=-=-=------;:;:;:;:4:4:47q7q7qqq7qqwrqqw9.",
+"  @$$$$$*$1$*&*$*2*&*2*-*-*-----3-3-4-4-4:4:404:404q4q4qqqqqtqy.",
+"  $%$%$%&%&%=%&*=*=*=-=-=--;=--;:;-;:;:474:474747q7q7qqwqwqwrwe.",
+"  $$$$*$1$*&*&*&*&*2*--2*-----3---4:3-4:4:4:4:404qqqqqqqqqtqtqu.",
+"  &%$%&%&*&*&*=-=*=-=-=--;---;:;:;:;:4:4:47q7q7qqq7qqwrqrwrwrip.",
+"  $$*$*$*&*&*2*&*2*-*-*-----3-3-4-4-4:4:404q404q4q4qtqqqiqtqiru.",
+"  $%&%&*=%&*=*=*=-=-=--;-;-;:;-;:;:474:47q747q7q7qqwqwqwrwrirwu.",
+"  *$1$*&*&*&*&*2*---*-----3---4:4:4:4:4:4:404qqqqqqqqqtqtqirira.",
+"  &%&*=*&*=-=*=-=-=--;---;:;:;:;:4:4:47q7q7qqqqqqwrqrwrwriririp.",
+"  *$*&*&*2*&*2*-*-*-----3-3-4-4-4:4:404q4q4qqq4qtqtqiqiqiriqira.",
+"  &*=*&*=*=*=-=-=--;-;-;:;:;:;:474:47q7q7q7q7qqwrwqwrwrirwrisip.",
+"  *&*&*&*&*2*---*-----3---4:4:4:4:404:404qqqqqqqqqtqtqiriririra.",
+"  =*&*=-=*=---=--;---;:;:4:;:474:47q7q7qqqqqqwrwrwrwriririsdrdp.",
+"  *&*2*=*2*-*-*-----4-3-4:4-4:4:404q4q4qqqqqtqtqiqiqiriqifirifa.",
+"  &*=*=*=-=-=--;-;-;:;:;:;:474747q7q7qqq7qqwrwqwrwrirwrisisisdp.",
+"  *&*&*2*---*-----3-3-4:4:4:4:404qq04qqqqqtqqqirtqiririririfida.",
+"  =-=-=---=--;:;-;:;:4:4:474:47q7q7qqqqqqwrwrwrwriririsdrdsdddp.",
+"  *=*2*-*-*-----4-4-4:4:4:4:404q4q4qqqqqtqtqiqiqiriqifififidida.",
+"  =*=-=-=--;-;-;:;:4:;:474747q7q7qqwqwqwrwqwrwrirwrisdsisdsdsdp.",
+"  *2*---------4-3-4:4:4:4:404qq04qqqqqtqqqiririririririfidddddg.",
+"  =---=--;:;:;:;:4:4:474:47q7q7qqqqqqwrwrwrwriririsdsdsddddddhj.",
+"  *---*-3---4-4-4:4:4:4:404q4q4qqqqqtqtqiqiqiririfififidddidkdl.",
+"  =;=--;:;-;:;:474:474747q7q7qqwqwqwrwrwrwrirwrisdsdsdsdsddhzhj.",
+"  --------4-3-4:4:4:4:404qq04qqqqqtqqqiririririfirifidddddddddx.",
+"  ---;:;:;:;:4:4:47q747qqq7qqwqqqwrwrirwriririsdsdsddddddhzhzhc.",
+"  --3-3-4-4-4:4:4:4:404q4q4qqqqqtqtqiriqiririfififidddddkdkdXdx.",
+"  -;:;-;:;:474:474747q7q7qqwqwqwrwrwrwrisisisdsdsdddsddhzhdhzhg.",
+"  ----4-3-4:4:4:4:404qqq4qqqqqtqtqiriririrififdfidddddkdddkzkdx.",
+"  :;:;:;:4:4:47q7q7qqq7qqwrqqwrwriririririsdsdsddddddhzhzhzhzXc.",
+"  3-4-4-4:4:404:404q4q4qqqqqtqtqiriqiririfidididddddkdkdXdXdXzx.",
+"  -;:;:474:47q747q7q7qqwqwqwrwrirwrisisisdsdsddddddhzhdhzhzXzhc.",
+"  4:4-4:4:4:4:404qqqqqqqqqtqtqiriririrififdfidddddkdddkzkdXzXzx.",
+"  :;:4:4:47q7q7qqq7qqwrqrwrwriririsirisdsdsddddddhzhzhzhzXzXzXc.",
+"  4-4:4:404q404qqq4qtqqqiqtqiriqiririfidididddddkdkdXdXdXzXzXvx.",
+"  :474:47q7q7q7q7qqwrwqwrwrirwrisisisdsdsddddddhzhzhzhzXzhzX>5c.",
+"  4:4:4:4:404qqqqqqqqqtqtqiririririfiddfidddddkdddXzkdXzXzXvXzx.",
+"  :4:47q7q7qqqqqqwrwrwrwriririsdrisdddsddddddhzhzXzhzXzXzX>5>5c.",
+"  4:404q4q4qqqqqtqtqiqiqiriqiririfidididddddkdkdXzXdXzXzXvXvXvx.",
+"  :47q7q7q7q7qqwrwqwrwrirwrisisisdsdsddhdddhzhzhzhzXzXzX>5>5>5b.",
+"  404:404qqqqqqqqqiqtqiririririfidddidddddkdkdXzkzXzXzXvXv5vX5n.",
+"  >65656569698989y9e9u9ueumueupupapaplpgjgjgjgcgcgcgcxcbcncnbnb.",
+" ..............................................................."};
diff --git a/wmmixer-alsa/XPM/wmmixer.xpm b/wmmixer-alsa/XPM/wmmixer.xpm
new file mode 100644
index 0000000..537436c
--- /dev/null
+++ b/wmmixer-alsa/XPM/wmmixer.xpm
@@ -0,0 +1,74 @@
+/* XPM */
+static char * wmmixer_xpm[] = {
+"64 64 7 1",
+"      c None",
+".     c #000000000000",
+"X     c #AEBAAAAAAEBA",
+"o     c #28A228A228A2 s back_color",
+"O     c #208120812081",
+"+     c #F7DEF3CEFFFF",
+"@     c #861782078E38",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"    .........................X     ........................X    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .OooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    .ooooooooooooooooooooooooX     .oooooooooooooooooooooooX    ",
+"    XXXXXXXXXXXXXXXXXXXXXXXXXX     .oooooooooooooooooooooooX    ",
+"                                   .oooooooooooooooooooooooX    ",
+"                                   .oooooooooooooooooooooooX    ",
+"                                   .oooooooooooooooooooooooX    ",
+"                                   .oooooooooooooooooooooooX    ",
+"    ..........................     .oooooooooooooooooooooooX    ",
+"    .+++++++++++@+++++++++++@X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXXXX.+XXXXXXXXXX.X     .OooooooooooooooooooooooX    ",
+"    .+XXXXXX.XXX.+XXX.XXXXXX.X     .OooooooooooooooooooooooX    ",
+"    .+XXXXX..XXX.+XXX..XXXXX.X     .OooooooooooooooooooooooX    ",
+"    .+XXXX...XXX.+XXX...XXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXX....XXX.+XXX....XXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXX...XXX.+XXX...XXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXX..XXX.+XXX..XXXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXX.XXX.+XXX.XXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXXXX.+XXXXXXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .@...........@...........X     .oooooooooooooooooooooooX    ",
+"    XXXXXXXXXXXXXXXXXXXXXXXXXX     .oooooooooooooooooooooooX    ",
+"                                   .oooooooooooooooooooooooX    ",
+"    ..........................     .oooooooooooooooooooooooX    ",
+"    .+++++++++++++++++++++++@X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXXXXXXXXXXXXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXXXXXXX.XXXXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXXX...X.XXXXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXX..X...XXXXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXX.XXX..XXXXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXX..X...XXXXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXXX...X.XXXXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXXXXXXX.XXXXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .+XXXXXXXXXXXXXXXXXXXXXX.X     .oooooooooooooooooooooooX    ",
+"    .@.......................X     .oooooooooooooooooooooooX    ",
+"    XXXXXXXXXXXXXXXXXXXXXXXXXX     XXXXXXXXXXXXXXXXXXXXXXXXX    ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                "};
diff --git a/wmmixer-alsa/mixer.c b/wmmixer-alsa/mixer.c
new file mode 100644
index 0000000..d454b50
--- /dev/null
+++ b/wmmixer-alsa/mixer.c
@@ -0,0 +1,91 @@
+#include "wmmixer-alsa.h"
+
+void init_mixer(void)
+{
+       int err;
+       if((err=snd_mixer_open(&mixer_handle,CARD_NUM,MIXER_NUM))<0)
+       {
+               fprintf(stderr,"Mixer open failed: %s\n",snd_strerror(err));
+               return;
+       }
+       init_elements();
+       return;
+}
+
+void init_elements(void)
+{
+       int err,i;
+       count=0;
+       memset(&elements,0,sizeof(elements));
+       if((err=snd_mixer_elements(mixer_handle,&elements))<0)
+       {
+               fprintf(stderr,"Elements error: %s\n",snd_strerror(err));
+               return;
+       }
+       elements.pelements=(snd_mixer_eid_t 
*)malloc(elements.elements_over*sizeof(snd_mixer_eid_t));
+       if(!elements.pelements)
+       {
+               fprintf(stderr,"Elements error: Not enough memory\n");
+               return;
+       }
+       elements.elements_size=elements.elements_over;
+       elements.elements_over=elements.elements=0;
+       if((err=snd_mixer_elements(mixer_handle,&elements))<0)
+       {
+               fprintf(stderr,"Elements error: %s\n",snd_strerror(err));
+               return;
+       }
+       for(i=0;i<elements.elements;i++)
+       {
+               elementinfo *e;
+               if(elements.pelements[i].type!=SND_MIXER_ETYPE_VOLUME1)
+                       continue;
+               if(snd_mixer_element_has_control(&elements.pelements[i])!=1)
+                       continue;
+               if(snd_mixer_element_has_info(&elements.pelements[i])!=1)
+                       continue;
+               e=add_element();
+               e->element.eid=elements.pelements[i];
+               if((err=snd_mixer_element_build(mixer_handle,&e->element))<0)
+               {
+                       fprintf(stderr,"Element error: %s\n",snd_strerror(err));
+                       return;
+               }
+               e->info.eid=elements.pelements[i];
+               if((err=snd_mixer_element_info_build(mixer_handle,&e->info))<0)
+               {
+                       fprintf(stderr,"Element info error: 
%s\n",snd_strerror(err));
+                       return;
+               }
+               count++;
+       }
+       free((void *)elements.pelements);
+       return;
+}
+
+elementinfo *add_element(void)
+{
+       if(!element)
+       {
+               element=(elementinfo *)malloc(sizeof(elementinfo));
+               element->next=NULL;
+               element->prev=NULL;
+               memset(&element->info,0,sizeof(element->info));
+               memset(&element->element,0,sizeof(element->element));
+               return element;
+       }
+       else
+       {
+               elementinfo *e;
+               e=element;
+               while(e->next)
+                       e=e->next;
+               e->next=(elementinfo *)malloc(sizeof(elementinfo));
+               e->next->prev=e;
+               e=e->next;
+               e->next=NULL;
+               memset(&e->info,0,sizeof(e->info));
+               memset(&e->element,0,sizeof(e->element));
+               return e;
+       }
+}
diff --git a/wmmixer-alsa/wmmixer-alsa.c b/wmmixer-alsa/wmmixer-alsa.c
new file mode 100644
index 0000000..13dba79
--- /dev/null
+++ b/wmmixer-alsa/wmmixer-alsa.c
@@ -0,0 +1,545 @@
+#include "wmmixer-alsa.h"
+
+int main(int argc, char **argv)
+{
+       XGCValues gcv;
+       unsigned long gcm;
+       int exact,left,right,device_index,i;
+       XpmAttributes xpmattr;
+       XpmColorSymbol xpmcsym[4];
+       elementinfo *e;
+
+       scanArgs(argc, argv);
+       initXWin(argc, argv);
+       exact=left=right=device_index=-1;
+
+       init_mixer();
+       cure=element;
+       e=element;
+       while(e)
+       {
+               if(!strcasecmp(e->info.eid.name,"Master Volume"))
+                       e->icon=0;
+               else if(!strcasecmp(e->info.eid.name,"PCM Volume"))
+                       e->icon=1;
+               else if(!strcasecmp(e->info.eid.name,"MIC Volume"))
+                       e->icon=5;
+               else if(!strcasecmp(e->info.eid.name,"Line Volume"))
+                       e->icon=4;
+               else if(!strcasecmp(e->info.eid.name,"CD Volume"))
+                       e->icon=3;
+               else if(!strcasecmp(e->info.eid.name,"Synth Volume"))
+                       e->icon=2;
+               else if(!strcasecmp(e->info.eid.name,"PC Speaker Volume"))
+                       e->icon=6;
+               /*
+                * bass = 7
+                * treble = 8
+                */
+               else
+                       e->icon=9;
+               e=e->next;
+       }
+
+       gcm=GCGraphicsExposures;
+       gcv.graphics_exposures=0;
+       gc_gc=XCreateGC(d_display, w_root, gcm, &gcv);
+
+       color[0]=mixColor(ledcolor, 0, backcolor, 100);
+       color[1]=mixColor(ledcolor, 100, backcolor, 0);
+       color[2]=mixColor(ledcolor, 60, backcolor, 40);
+       color[3]=mixColor(ledcolor, 25, backcolor, 75);
+
+       xpmcsym[0].name="back_color";
+       xpmcsym[0].value=NULL;;
+       xpmcsym[0].pixel=color[0];
+       xpmcsym[1].name="led_color_high";
+       xpmcsym[1].value=NULL;;
+       xpmcsym[1].pixel=color[1];
+       xpmcsym[2].name="led_color_med";
+       xpmcsym[2].value=NULL;;
+       xpmcsym[2].pixel=color[2];
+       xpmcsym[3].name="led_color_low";
+       xpmcsym[3].value=NULL;;
+       xpmcsym[3].pixel=color[3];
+       xpmattr.numsymbols=4;
+       xpmattr.colorsymbols=xpmcsym;
+       xpmattr.exactColors=0;
+       xpmattr.closeness=40000;
+       xpmattr.valuemask=XpmColorSymbols | XpmExactColors | XpmCloseness;
+       XpmCreatePixmapFromData(d_display, w_root, wmmixer_xpm, &pm_main, 
&pm_mask, &xpmattr);
+       XpmCreatePixmapFromData(d_display, w_root, tile_xpm, &pm_tile, NULL, 
&xpmattr);
+       XpmCreatePixmapFromData(d_display, w_root, icons_xpm, &pm_icon, NULL, 
&xpmattr);
+       pm_disp=XCreatePixmap(d_display, w_root, 64, 64, 
DefaultDepth(d_display, DefaultScreen(d_display)));
+
+       if(wmaker || ushape || astep)
+               XShapeCombineMask(d_display, w_activewin, ShapeBounding, 
winsize/2-32, winsize/2-32, pm_mask, ShapeSet);
+       else
+               XCopyArea(d_display, pm_tile, pm_disp, gc_gc, 0, 0, 64, 64, 0, 
0);
+
+       XSetClipMask(d_display, gc_gc, pm_mask);
+       XCopyArea(d_display, pm_main, pm_disp, gc_gc, 0, 0, 64, 64, 0, 0);
+       XSetClipMask(d_display, gc_gc, None);
+
+       if(count==0)
+               fprintf(stderr,"%s : Sorry, no supported channels found.\n", 
NAME);
+       else
+       {
+               int done=0;
+               XEvent xev;
+
+               checkVol();
+               XSelectInput(d_display, w_activewin, ExposureMask | 
ButtonPressMask | ButtonReleaseMask | ButtonMotionMask);
+               XMapWindow(d_display, w_main);
+
+               while(!done)
+               {
+                       while(XPending(d_display))
+                       {
+                               XNextEvent(d_display, &xev);
+                               switch(xev.type)
+                               {
+                                       case Expose:
+                                               repaint();
+                                               break;
+                                       case ButtonPress:
+                                               pressEvent(&xev.xbutton);
+                                               break;
+                                       case ButtonRelease:
+                                               releaseEvent(&xev.xbutton);
+                                               break;
+                                       case MotionNotify:
+                                               motionEvent(&xev.xmotion);
+                                               break;
+                                       case ClientMessage:
+                                               
if(xev.xclient.data.l[0]==deleteWin)
+                                                       done=1;
+                                               break;
+                               }
+                       }
+
+                       if(btnstate & (BTNPREV | BTNNEXT))
+                       {
+                               rpttimer++;
+                               if(rpttimer>=RPTINTERVAL)
+                               {
+                                       if(btnstate & BTNNEXT)
+                                       {
+                                               cure=cure->next;
+                                               if(!cure)
+                                                       cure=element;
+                                       }
+                                       else
+                                       {
+                                               cure=cure->prev;
+                                               if(!cure)
+                                               {
+                                                       elementinfo *e;
+                                                       e=element;
+                                                       while(e->next)
+                                                               e=e->next;
+                                                       cure=e;
+                                               }
+                                       }
+                                       checkVol();
+                                       rpttimer=0;
+                               }
+                       }
+                       else
+                               checkVol();
+                       XFlush(d_display);
+                       usleep(50000);
+               }
+       }
+       XFreeGC(d_display, gc_gc);
+       XFreePixmap(d_display, pm_main);
+       XFreePixmap(d_display, pm_tile);
+       XFreePixmap(d_display, pm_disp);
+       XFreePixmap(d_display, pm_mask);
+       XFreePixmap(d_display, pm_icon);
+       freeXWin();
+       return 0;
+}
+
+void initXWin(int argc, char **argv)
+{
+       int pos;
+       XWMHints wmhints;
+       XSizeHints shints;
+
+       winsize=astep ? ASTEPSIZE : NORMSIZE;
+
+       if((d_display=XOpenDisplay(display))==NULL)
+       {
+               fprintf(stderr,"%s : Unable to open X display '%s'.\n", NAME, 
XDisplayName(display));
+               exit(1);
+       }
+       _XA_GNUSTEP_WM_FUNC=XInternAtom(d_display, "_GNUSTEP_WM_FUNCTION", 0);
+       deleteWin=XInternAtom(d_display, "WM_DELETE_WINDOW", 0);
+
+       w_root=DefaultRootWindow(d_display);
+
+       shints.x=0;
+       shints.y=0;
+       shints.flags=0;
+       pos=(XWMGeometry(d_display, DefaultScreen(d_display), position, NULL, 
0, &shints, &shints.x, &shints.y, &shints.width, &shints.height, 
&shints.win_gravity) & (XValue | YValue));
+       shints.min_width=winsize;
+       shints.min_height=winsize;
+       shints.max_width=winsize;
+       shints.max_height=winsize;
+       shints.base_width=winsize;
+       shints.base_height=winsize;
+       shints.flags=PMinSize | PMaxSize | PBaseSize;
+
+       createWin(&w_main, shints.x, shints.y);
+
+       if(wmaker || astep || pos)
+               shints.flags |= USPosition;
+       if(wmaker)
+       {
+               wmhints.initial_state=WithdrawnState;
+               wmhints.flags=WindowGroupHint | StateHint | IconWindowHint;
+               createWin(&w_icon, shints.x, shints.y);
+               w_activewin=w_icon;
+               wmhints.icon_window=w_icon;
+       }
+       else
+       {
+               wmhints.initial_state=NormalState;
+               wmhints.flags=WindowGroupHint | StateHint;
+               w_activewin=w_main;
+       }
+       wmhints.window_group=w_main;
+       XSetWMHints(d_display, w_main, &wmhints);
+       XSetWMNormalHints(d_display, w_main, &shints);
+       XSetCommand(d_display, w_main, argv, argc);
+       XStoreName(d_display, w_main, NAME);
+       XSetIconName(d_display, w_main, NAME);
+       XSetWMProtocols(d_display, w_activewin, &deleteWin, 1);
+}
+
+void freeXWin()
+{
+       XDestroyWindow(d_display, w_main);
+       if(wmaker)
+               XDestroyWindow(d_display, w_icon);
+       XCloseDisplay(d_display);
+}
+
+void createWin(Window *win, int x, int y)
+{
+       XClassHint classHint;
+       *win=XCreateSimpleWindow(d_display, w_root, x, y, winsize, winsize, 0, 
0, 0);
+       classHint.res_name=NAME;
+       classHint.res_class=CLASS;
+       XSetClassHint(d_display, *win, &classHint);
+}
+
+unsigned long mixColor(char *colorname1, int prop1, char *colorname2, int 
prop2){
+       XColor color, color1, color2;
+       XWindowAttributes winattr;
+       XGetWindowAttributes(d_display, w_root, &winattr);
+       XParseColor(d_display, winattr.colormap, colorname1, &color1);
+       XParseColor(d_display, winattr.colormap, colorname2, &color2);
+       color.pixel=0;
+       color.red=(color1.red*prop1+color2.red*prop2)/(prop1+prop2);
+       color.green=(color1.green*prop1+color2.green*prop2)/(prop1+prop2);
+       color.blue=(color1.blue*prop1+color2.blue*prop2)/(prop1+prop2);
+       color.flags=DoRed | DoGreen | DoBlue;
+       XAllocColor(d_display, winattr.colormap, &color);
+       return color.pixel;
+}
+
+void show_params(void)
+{
+       fprintf(stdout,"wmmixer-alsa %s\t\tby Sam Hawker\n"
+                       "\t\t\tAdded support for ALSA by\n"
+                       "\t\t\tMartin Dahl <da...@vf.telia.no>\n\n"
+                       "Usage: wmmixer-alsa [options]\n\n"
+                       "\t-h\t\tDisplay this help screen\n"
+                       "\t-w\t\tUse WithdrawnState\n"
+                       "\t-s\t\tShaped window\n"
+                       "\t-a\t\tUse smaller window\n"
+                       "\t-l <color>\t\tColor for led display\n"
+                       "\t-b <color>\t\tColor for background\n"
+                       "\t-p <position>\t\tWindow position\n"
+                       "\t-d <display>\t\tTarget display\n",VERSION);
+       exit(0);
+}
+
+void scanArgs(int argc, char **argv)
+{
+       int x;
+
+       memset(backcolor,0,32);
+       memset(ledcolor,0,32);
+       memset(display,0,32);
+       memset(position,0,32);
+       strncpy(ledcolor,LEDCOLOR,32);
+       strncpy(backcolor,BACKCOLOR,32);
+       strcpy(display,"");
+       strcpy(position,"");
+       wmaker=ushape=astep=0;
+       btnstate=rpttimer=0;
+       dragging=count=0;
+
+       for(x=1;x<argc;x++)
+       {
+               if(argv[x][0]!='-') show_params();
+               else switch(argv[x][1])
+               {
+                       case 'w':
+                               wmaker=1;
+                               break;
+                       case 's':
+                               ushape=1;
+                               break;
+                       case 'a':
+                               astep=1;
+                               break;
+                       case 'l':
+                               strncpy(ledcolor,argv[x+1],32);
+                               x++;
+                               break;
+                       case 'b':
+                               strncpy(backcolor,argv[x+1],32);
+                               x++;
+                               break;
+                       case 'p':
+                               strncpy(position,argv[x+1],32);
+                               x++;
+                               break;
+                       case 'd':
+                               strncpy(display,argv[x+1],32);
+                               x++;
+                               break;
+                       default:
+                               show_params();
+                               break;
+               }
+       }
+       return;
+}
+
+void checkVol(void)
+{
+       int nl=0,nr=0;
+       
nl=convert_range(cure->element.data.volume1.pvoices[0],cure->info.data.volume1.prange[0].min,cure->info.data.volume1.prange[0].max,0,100);
+       
nr=convert_range(cure->element.data.volume1.pvoices[1],cure->info.data.volume1.prange[1].min,cure->info.data.volume1.prange[1].max,0,100);
+
+       if(1)
+       {
+               curleft=nl;
+               curright=nr;
+       }
+       else
+       {
+               if(nl!=curleft||nr!=curright)
+               {
+                       if(nl!=curleft)
+                       {
+                               curleft=nl;
+                               drawLeft();
+                       }
+                       if(nr!=curright)
+                       {
+                               curright=nr;
+                               drawRight();
+                       }
+               }
+       }
+       update();
+       repaint();
+}
+
+void setVol(int left, int right)
+{
+       int err;
+       callbacks();
+       
cure->element.data.volume1.pvoices[0]=convert_range(left,0,100,cure->info.data.volume1.prange[0].min,cure->info.data.volume1.prange[0].max);
+       
if(cure->element.data.volume1.pvoices[0]>cure->info.data.volume1.prange[0].max)
+               
cure->element.data.volume1.pvoices[0]=cure->info.data.volume1.prange[0].max;
+       
if(cure->element.data.volume1.pvoices[0]<cure->info.data.volume1.prange[0].min)
+               
cure->element.data.volume1.pvoices[0]=cure->info.data.volume1.prange[0].min;
+       
cure->element.data.volume1.pvoices[1]=convert_range(right,0,100,cure->info.data.volume1.prange[1].min,cure->info.data.volume1.prange[1].max);
+       
if(cure->element.data.volume1.pvoices[1]>cure->info.data.volume1.prange[1].max)
+               
cure->element.data.volume1.pvoices[1]=cure->info.data.volume1.prange[1].max;
+       if((err=snd_mixer_element_write(mixer_handle,&cure->element))<0)
+               fprintf(stderr,"Mixer element write error: 
%s\n",snd_strerror(err));
+       return;
+}
+
+void callbacks(void)
+{
+       int err;
+       snd_mixer_callbacks_t callbacks;
+       memset(&callbacks,0,sizeof(callbacks));
+       callbacks.rebuild=NULL;
+       callbacks.element=NULL;
+       callbacks.group=NULL;
+       if((err=snd_mixer_read(mixer_handle,&callbacks))<0)
+       {
+               fprintf(stderr,"Callbacks error: %s\n",snd_strerror(err));
+               return;
+       }
+       return;
+}
+
+int convert_range(int val, int omin, int omax, int nmin, int nmax)
+{
+       int orange=omax-omin, nrange=nmax-nmin;
+       if(orange==0)
+               return 0;
+       return 
rint((((double)nrange*((double)val-(double)omin))+((double)orange/2.0))/(double)orange+(double)nmin);
+}
+
+void pressEvent(XButtonEvent *xev)
+{
+       int x=xev->x-(winsize/2-32);
+       int y=xev->y-(winsize/2-32);
+       if(x>=5 && y>=33 && x<=16 && y<=43)
+       {
+               cure=cure->prev;
+               if(!cure)
+               {
+                       elementinfo *e;
+                       e=element;
+                       while(e->next)
+                               e=e->next;
+                       cure=e;
+               }
+               btnstate |= BTNPREV;
+               rpttimer=0;
+               drawBtns(BTNPREV);
+               checkVol();
+               return;
+       }
+       if(x>=17 && y>=33 && x<=28 && y<=43)
+       {
+               cure=cure->next;
+               if(!cure)
+                       cure=element;
+               btnstate|=BTNNEXT;
+               rpttimer=0;
+               drawBtns(BTNNEXT);
+               checkVol();
+               return;
+       }
+       if(x>=37 && x<=56 && y>=8 && y<=56)
+       {
+               int v=((60-y)*100)/(2*25);
+               dragging=1;
+               if(x<=50)
+                       setVol(v,curright);
+               if(x>=45)
+                       setVol(curleft,v);
+               checkVol();
+               return;
+       }
+/*     if(x>=5 && y>=47 && x<=28 && y<=57)
+       {
+               int nl,nr,flags;
+               mixer.DeviceSet(channel[curchannel]);
+               mixer.Read(&nl,&nr,&flags);
+               if(flags & SND_MIXER_DFLG_MUTE)
+               {
+                       btnstate &= ~BTNREC;
+                       flags &= ~SND_MIXER_DFLG_MUTE;
+               }
+               else
+               {
+                       btnstate |= BTNREC;
+                       flags |= SND_MIXER_DFLG_MUTE;
+               }
+               mixer.Write(nl,nr,flags);
+               checkVol();
+               return;
+       }*/
+}
+
+void releaseEvent(XButtonEvent *xev)
+{
+       dragging=0;
+       btnstate &= ~(BTNPREV | BTNNEXT);
+       drawBtns(BTNPREV | BTNNEXT);
+       repaint();
+}
+
+void motionEvent(XMotionEvent *xev)
+{
+       int x=xev->x-(winsize/2-32);
+       int y=xev->y-(winsize/2-32);
+       if(x>=37 && x<=56 && y>=8 && dragging)
+       {
+               int v=((60-y)*100)/(2*25);
+               if(v<0)
+                       v=0;
+               if(x<=50)
+                       setVol(v,curright);
+               if(x>=45)
+                       setVol(curleft,v);
+               checkVol();
+       }
+}
+
+void repaint()
+{
+       XEvent xev;
+       XCopyArea(d_display, pm_disp, w_activewin, gc_gc, 0, 0, 64, 64, 
winsize/2-32, winsize/2-32);
+       while(XCheckTypedEvent(d_display, Expose, &xev));
+}
+
+void update()
+{
+       XCopyArea(d_display, pm_icon, pm_disp, gc_gc, cure->icon*22, 0, 22, 22, 
6, 5);
+       drawLeft();
+       drawRight();
+       drawBtns(BTNREC);
+}
+
+void drawLeft()
+{
+       int i;
+       XSetForeground(d_display, gc_gc, color[1]);
+       for(i=0;i<25;i++)
+       {
+               if(i==(curleft*25)/100)
+                       XSetForeground(d_display, gc_gc, color[3]);
+               XFillRectangle(d_display, pm_disp, gc_gc, 37, 55-2*i, 9, 1);
+       }
+}
+
+void drawRight()
+{
+       int i;
+       XSetForeground(d_display, gc_gc, color[1]);
+       for(i=0;i<25;i++)
+       {
+               if(i==(curright*25)/100)
+                       XSetForeground(d_display, gc_gc, color[3]);
+               XFillRectangle(d_display, pm_disp, gc_gc, 48, 55-2*i, 9, 1);
+       }
+}
+
+void drawBtns(int btns)
+{
+       if(btns & BTNPREV)
+               drawBtn(5, 33, 12, 11, (btnstate & BTNPREV));
+       if(btns & BTNNEXT)
+               drawBtn(17, 33, 12, 11, (btnstate & BTNNEXT));
+       if(btns & BTNREC)
+               drawBtn(5, 47, 24, 11, (btnstate & BTNREC));
+}
+
+void drawBtn(int x, int y, int w, int h, int down)
+{
+       if(!down)
+               XCopyArea(d_display, pm_main, pm_disp, gc_gc, x, y, w, h, x, y);
+       else
+       {
+               XCopyArea(d_display, pm_main, pm_disp, gc_gc, x, y, 1, h-1, 
x+w-1, y+1);
+               XCopyArea(d_display, pm_main, pm_disp, gc_gc, x+w-1, y+1, 1, 
h-1, x, y);
+               XCopyArea(d_display, pm_main, pm_disp, gc_gc, x, y, w-1, 1, 
x+1, y+h-1);
+               XCopyArea(d_display, pm_main, pm_disp, gc_gc, x+1, y+h-1, w-1, 
1, x, y);
+       }
+}
diff --git a/wmmixer-alsa/wmmixer-alsa.h b/wmmixer-alsa/wmmixer-alsa.h
new file mode 100644
index 0000000..ec11894
--- /dev/null
+++ b/wmmixer-alsa/wmmixer-alsa.h
@@ -0,0 +1,112 @@
+#define NORMSIZE    64
+#define ASTEPSIZE   56
+#define NAME        "wmmixer"
+#define CLASS       "WMMixer"
+
+#define BACKCOLOR   "#282828"
+#define LEDCOLOR    "LightSeaGreen"
+
+#define CARD_NUM 0
+#define MIXER_NUM 0
+
+#define VERSION "0.6"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <math.h>
+
+#include <sys/asoundlib.h>
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xproto.h>
+#include <X11/xpm.h>
+#include <X11/extensions/shape.h>
+
+Pixmap pm_main;
+Pixmap pm_tile;
+Pixmap pm_disp;
+Pixmap pm_mask;
+Pixmap pm_icon;
+
+#include "XPM/wmmixer.xpm"
+#include "XPM/tile.xpm"
+#include "XPM/icons.xpm"
+
+int wmaker;
+int ushape;
+int astep;
+char display[32];
+char position[32];
+int winsize;
+
+char backcolor[32];
+char ledcolor[32];
+
+Atom _XA_GNUSTEP_WM_FUNC;
+Atom deleteWin;
+Display *d_display;
+Window w_icon;
+Window w_main;
+Window w_root;
+Window w_activewin;
+
+GC gc_gc;
+unsigned long color[4];
+
+snd_mixer_t *mixer_handle;
+snd_mixer_elements_t elements;
+
+typedef struct elementinfoStruct {
+       snd_mixer_element_info_t info;
+       snd_mixer_element_t element;
+       int icon;
+       struct elementinfoStruct *next;
+       struct elementinfoStruct *prev;
+} elementinfo;
+
+elementinfo *element;
+elementinfo *cure;
+
+int curchannel;
+int curleft;
+int curright;
+
+int btnstate;
+#define BTNNEXT  1
+#define BTNPREV  2
+#define BTNREC   4
+#define RPTINTERVAL   5
+
+int rpttimer;
+int dragging;
+int count;
+int channel[80];
+
+void initXWin(int argc, char **argv);
+void freeXWin();
+void createWin(Window *win, int x, int y);
+unsigned long getColor(char *colorname);
+unsigned long mixColor(char *colorname1, int prop1, char *colorname2, int 
prop2);
+void scanArgs(int argc, char **argv);
+
+void checkVol(void);
+void setVol(int left, int right);
+void callbacks(void);
+int convert_range(int val, int omin, int omax, int nmin, int nmax);
+void pressEvent(XButtonEvent *xev);
+void releaseEvent(XButtonEvent *xev);
+void motionEvent(XMotionEvent *xev);
+void repaint();
+void update();
+void drawLeft();
+void drawRight();
+void drawBtns(int btns);
+void drawBtn(int x, int y, int w, int h, int down);
+
+void init_mixer(void);
+void init_elements(void);
+elementinfo *add_element(void);
-- 
1.9.1


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to