From 8d75611daf58818356e007a49e6e671689a89851 Mon Sep 17 00:00:00 2001 From: Doug Torrance Date: Sat, 3 Dec 2016 16:49:49 -0500 Subject: [PATCH] wmappkill: Add version 0.2 to repository. From http://www.sourcefiles.org/Utilities/GUI/wmappkill-0.2.tar.gz --- wmappkill/COPYING | 340 ++++++++++++++++++++++ wmappkill/ChangeLog | 10 + wmappkill/INSTALL | 12 + wmappkill/Makefile | 20 ++ wmappkill/README | 21 ++ wmappkill/fond.xbm | 47 ++++ wmappkill/wmAppKill.c | 611 ++++++++++++++++++++++++++++++++++++++++ wmappkill/wmAppKill.h | 54 ++++ wmappkill/wmAppKill.xpm | 375 ++++++++++++++++++++++++ 9 files changed, 1490 insertions(+) create mode 100644 wmappkill/COPYING create mode 100644 wmappkill/ChangeLog create mode 100644 wmappkill/INSTALL create mode 100644 wmappkill/Makefile create mode 100644 wmappkill/README create mode 100644 wmappkill/fond.xbm create mode 100644 wmappkill/wmAppKill.c create mode 100644 wmappkill/wmAppKill.h create mode 100644 wmappkill/wmAppKill.xpm diff --git a/wmappkill/COPYING b/wmappkill/COPYING new file mode 100644 index 0000000..a3f6b12 --- /dev/null +++ b/wmappkill/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA + 02111-1307, 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. + + + Copyright (C) 19yy + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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. + + , 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/wmappkill/ChangeLog b/wmappkill/ChangeLog new file mode 100644 index 0000000..3a3edf1 --- /dev/null +++ b/wmappkill/ChangeLog @@ -0,0 +1,10 @@ + +wmAppKill - Changelog + +- 12/27/2000 - v0.2 +added support for mouse wheel (thanks to Mathieu) +some code cleaning + +- 09/28/2000 - v0.1 +initial release + diff --git a/wmappkill/INSTALL b/wmappkill/INSTALL new file mode 100644 index 0000000..921542a --- /dev/null +++ b/wmappkill/INSTALL @@ -0,0 +1,12 @@ + +wmAppKill requires the libGtop. +Download it at: http://www.home-of-linux.org/gnome/libgtop/ + +To install wmAppKill : + +1. tar xvfz wmAppKill-x.x.tar.gz +2. make +3. make install (you must be root) + + + diff --git a/wmappkill/Makefile b/wmappkill/Makefile new file mode 100644 index 0000000..318b058 --- /dev/null +++ b/wmappkill/Makefile @@ -0,0 +1,20 @@ +GTOP_LIBS = -lgtop -lgtop_sysdeps -lgtop_common -lXau +GCCOPTS = -O2 -Wall -g +CFLAGS= -Wall +LDLIBS = -lX11 -lXpm -lXext +LDFLAGS= -L/usr/X/lib -L/usr/X11R6/lib -L/usr/X11/lib -L/usr/local/lib/X11 + + +all : wmAppKill + +wmAppKill : wmAppKill.c + gcc ${GCCOPTS} wmAppKill.c -o wmAppKill ${GTOP_LIBS} ${LDFLAGS} ${LDLIBS} + +install: wmAppKill + install -m 755 wmAppKill /usr/bin/wmAppKill + +clean: + $(RM) *.o core tst *~ \#* + + + diff --git a/wmappkill/README b/wmappkill/README new file mode 100644 index 0000000..0d36903 --- /dev/null +++ b/wmappkill/README @@ -0,0 +1,21 @@ + +wmAppKill v0.2 +-------------- + +wmAppKill is a Window Maker dock applet that lists all your running processes. +You can kill any of them by doubleclicking on their names. + +You can specify wich process will be the oldest one of the list. +The one by default is "wmaker". +Type "wmAppKill -h" to get command line options. + +Please send comments, bugs, modifications to : rozange@club-internet.fr + +Future releases will be holded at: +http://internettrash.com/users/beuz/wmappkill.html + +Hope you'll enjoy it... + +You might want to check this other cool dockapp from which i started : +wmNetscapeKiller at http://pblumo.free.fr/wmNetscapeKiller + diff --git a/wmappkill/fond.xbm b/wmappkill/fond.xbm new file mode 100644 index 0000000..541007a --- /dev/null +++ b/wmappkill/fond.xbm @@ -0,0 +1,47 @@ +/* Created with The GIMP */ +#define fond_width 64 +#define fond_height 64 +static char fond_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, 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, + 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, 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, 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 }; diff --git a/wmappkill/wmAppKill.c b/wmappkill/wmAppKill.c new file mode 100644 index 0000000..bd2cfd3 --- /dev/null +++ b/wmappkill/wmAppKill.c @@ -0,0 +1,611 @@ + +/* + * wmAppKill v0.2 - S.Rozange + * + * 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, 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 (see the file COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA + * + */ + + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "fond.xbm" +#include "wmAppKill.xpm" +#include "wmAppKill.h" + +Display *dpy; /* xlib global vars */ +GC gc; +Window win; +Window iconWin; +Pixmap XPM; +int screen; + +_zone *fZone = NULL; +_desc *pList = NULL; /* double linked list */ +_desc *posProc = NULL; /* lower proc showed on the dock */ +pid_t tabNoProc[NB_LINE]; /* array containing each line's pid */ +pid_t lastProcPid; /* oldest proc before refreshment */ +char *procBaseName = PROC_DEF; /* procBase is NULL if we want all the proc to be listed */ +int procBasePos = 0; /* procbase's pos in linked list */ +pid_t procBasePid = 1; /* procbase's pid */ +unsigned int gNbProc = 0; /* proc number starting from procBase */ +unsigned int gNbProcTotal = 0; /* total proc number */ +struct timeval timev; /* to detect double-click */ + +void ZoneCreate(int x, int y, int width, int height, char no) +{ + _zone *last; + + if (!fZone) { + fZone = (_zone *)malloc(sizeof(_zone)); + last = fZone; + } else { + for (last = fZone; last -> next; last = last -> next); + last -> next = (_zone *)malloc(sizeof(_zone)); + last = last -> next; + } + + last -> x = x; + last -> y = y; + last -> width = width; + last -> height = height; + last -> no = no; + last -> next = NULL; +} + +char CheckZone(void) +{ + int x, y,popo; + unsigned int mask; + Window root_ret, child_ret; + _zone *curseur = fZone; + + XQueryPointer(dpy, iconWin, &root_ret, &child_ret, &popo, &popo, &x, &y, &mask); /* mouse position */ + + do { + if ((x >= curseur -> x) && (x <= curseur -> x + curseur -> width) && (y >= curseur -> y) && (y <= curseur -> y + curseur -> height)) + return curseur -> no; + + } + while ((curseur = curseur -> next)); + + return 0; +} + +void GarbageCollector(_desc *garb) +{ + _desc *next; + + while (garb) { + next = garb -> next; + free(garb); + garb = next; + } +} + +int CheckProc(pid_t pid) +{ + glibtop_proclist bof; + unsigned int *n; + + if ((n = glibtop_get_proclist (&bof, GLIBTOP_KERN_PROC_PID , (int64_t)pid)) == NULL) { + glibtop_free(n); + return -1; + } + + glibtop_free(n); + return 0; +} + +_desc *GetProcList(void) /* create a double linked list */ +{ + glibtop_proclist buf; + unsigned int *n; + unsigned int nbPr; + int i; + _desc *lastOne; + _desc *glump; + _desc *res; + + if ((n = glibtop_get_proclist (&buf, GLIBTOP_KERN_PROC_UID, (int64_t)getuid())) == NULL) { + fprintf(stderr, "Problem using libgtop\n"); + exit(1); + }; + + nbPr = (int)buf.number; + + glump = (_desc *)malloc(sizeof(_desc)); + res = glump; + lastOne = NULL; + + for (i = nbPr; i; i--){ + char *bof; + glibtop_proc_state buf; + glump -> previous = lastOne; + glump -> next = (_desc *)malloc(sizeof(_desc)); + + glibtop_get_proc_state(&buf, glump -> pid = n[i - 1]); + strcpy(glump -> name, bof = buf.cmd); + if (strlen(glump -> name) > MAX_CHAR) + glump -> name[MAX_CHAR] = 0; + + lastOne = glump; + glump = glump -> next; + + if (procBaseName && !strcmp(bof, procBaseName)) { + procBasePos = i - 1; + procBasePid = n[i - 1]; + break; + } + } + + lastOne -> next = NULL; + lastProcPid = n[nbPr - 1]; + glibtop_free(n); + + if (procBaseName && i) gNbProc = nbPr - i + 1; /* procBase has been found */ + else { /* procBaseName is null or hasn't been found */ + procBaseName = NULL; + procBasePos = 0; + procBasePid = n[0]; + gNbProc = nbPr; + } + + gNbProcTotal = nbPr; + + return res; +} + +int CheckProcToRemove(unsigned int *procList, unsigned int procListSize) +{ + _desc *curseur = pList, *temp; + int nbProcRemoved = 0, i; + + while (curseur) { + for (i = procListSize; i; i--) + if (curseur -> pid == procList[i - 1]) break; + + temp = curseur; + curseur = curseur -> next; + + if (!i) { /* we didn't find it in proclist, let's remove it */ + RemoveProc(temp); + gNbProc--; + nbProcRemoved++; + } + } + + return nbProcRemoved; +} + +int CheckProcToAdd(int pos, unsigned int *procList, unsigned int procListSize) +{ + _desc *glump; + int i, compteur = 0; + glibtop_proc_state buf; + + for (i = pos; i < procListSize ; i++){ + + compteur++; + glump = (_desc *)malloc(sizeof(_desc)); + usleep(20000); /* libgtop seems to need a little bit of time */ + if (CheckProc(procList[i])) continue; /* checking if the process isn't already dead */ + + glibtop_get_proc_state(&buf, glump -> pid = procList[i]); + strcpy(glump -> name, buf.cmd); + if (strlen(glump -> name) > MAX_CHAR) + glump -> name[MAX_CHAR] = 0; + + pList -> previous = glump; + glump -> next = pList; + glump -> previous = NULL; + if (posProc == pList) posProc = glump; + pList = glump; + gNbProc++; + gNbProcTotal++; + + lastProcPid = glump -> pid; + } + + return compteur; +} + +int CheckProcChange(void) +{ + glibtop_proclist buf; + unsigned int *n; + unsigned int nbPr; + int diffNbProc; + + if ((n = glibtop_get_proclist (&buf, GLIBTOP_KERN_PROC_UID, (int64_t)getuid())) == NULL) return -1; + nbPr = (int)buf.number; + + if ((nbPr == gNbProcTotal) && (n[nbPr - 1] == lastProcPid)) return 0; /* nothing changed */ + + if (procBaseName && (n[procBasePos] != procBasePid)) /* some proc killed before the baseproc (=oldest proc) */ + { + if (CheckProc(procBasePid)) { /* baseproc doesn't exist anymore */ + GarbageCollector(pList); + pList = GetProcList(); /* so we create a whole new list */ + posProc = pList; + return 1; + } + else + while (n[--procBasePos] != procBasePid); /* here we find what's the new pos. of baseproc */ + } + + + diffNbProc = (nbPr - procBasePos) - gNbProc; /* nb of changes after baseproc */ + + if (diffNbProc == 0 && (n[nbPr - 1] == lastProcPid)){ /* only changes before baseproc */ + gNbProcTotal = nbPr; + glibtop_free(n); + return 0; + } + + if (diffNbProc > 0 && n[nbPr - diffNbProc - 1] == lastProcPid) /* only proc to add */ + CheckProcToAdd(nbPr - diffNbProc, n, nbPr); + + else { /* to remove [and to add] */ + int nb; + nb = CheckProcToRemove(n, nbPr); + if (nb != -diffNbProc) + CheckProcToAdd(nbPr - diffNbProc - 1, n, nbPr); + } + + glibtop_free(n); + return 1; +} + +void RemoveProc(_desc *cible) +{ + _desc *temp1, *temp2; + + _desc *curseur; + int i; + + temp1 = cible -> previous; + temp2 = cible -> next; + + for (curseur = cible, i = 0; curseur && i != NB_LINE + 1; curseur = curseur -> next, ++i); + + if (!(gNbProc - 1 < NB_LINE) && (i == 2 || i == 3)) { /* the killed proc is near the start of the list */ + for (--i, curseur = posProc; i && curseur -> previous; curseur = curseur -> previous, --i); + posProc = curseur; + } + else if ((cible == posProc) && (cible -> previous)) { + posProc = cible -> previous; + } + else if ((cible == posProc) && (cible -> next)) { + posProc = cible -> next; + } + + if (temp1) temp1 -> next = temp2; + else { + pList = temp2; + temp2 -> previous = NULL; + gNbProcTotal--; + lastProcPid = temp2 -> pid; + free(cible); + return; + } + + if (temp2) temp2 -> previous = temp1; + else + temp1 -> next = NULL; + + free(cible); + gNbProcTotal--; + +} + +void ShowString (int x, int y, char *doudou) +{ + int i = 0; + char c; + + while ((c = tolower(doudou[i++]))){ + if (c >= 'a' && c <= 'z') { + XCopyArea(dpy,XPM, win,gc, 1 + (c - 'a') * 6, 10, 5, 8, x, y) ; + XCopyArea(dpy,XPM, iconWin,gc, 1 + (c - 'a') * 6, 10, 5, 8, x, y) ; + x += 6; + } + } +} + +void DoExp(){ + + XClearWindow(dpy, win); + XClearWindow(dpy, iconWin); + + XCopyArea(dpy, XPM ,win, gc, 1 + (26) * 6, 10, 6, 8, 5, 51); + XCopyArea(dpy, XPM, iconWin, gc, 1 + (26) * 6, 10, 6, 8, 5, 51); + XCopyArea(dpy, XPM, win, gc, 1 + (27) * 6, 10, 6, 8, 53, 51); + XCopyArea(dpy, XPM, iconWin, gc, 1 + (27) * 6, 10, 6, 8, 53, 51); + + XCopyArea(dpy, XPM, win, gc, 106, 0, 28, 8, 17, 50); + XCopyArea(dpy, XPM, iconWin, gc, 106, 0, 28, 8, 17, 50); + + DoExpose(); +} + +void DoExpose() { + + int i; + _desc *curseur; + + for (i = NB_LINE; i; i--){ + XCopyArea(dpy, XPM, win, gc, 2, 22, 53, 9, X_PROC + 1, Y_PROC + ((i - 1) * 10)); + XCopyArea(dpy, XPM, iconWin, gc, 2, 22, 53, 9, X_PROC + 1, Y_PROC + ((i - 1) * 10)); + } + + if (gNbProc < NB_LINE) { + int y; + i = gNbProc; + for (y = NB_LINE; y != gNbProc; y--) tabNoProc[y - 1] = -1; + } + else i = NB_LINE; + + for (curseur = posProc; i; curseur = curseur -> next, i--) + { + ShowString(X_PROC + 1, Y_PROC + (i - 1) * 10, curseur -> name); + tabNoProc[i - 1] = curseur -> pid; + } +} + +void DoClick(XEvent ev) +{ + unsigned char doubleClick = 0; + static unsigned char firstClick = 0; + _desc *curseur; + char zone, i; + + zone = CheckZone(); + + if (ev.xbutton.button == CLICK_TWO) { + DoExpose() ; + } + + /* Mouse wheel patch by Mathieu Cuny */ + + if (ev.xbutton.button == WHEEL_UP && gNbProc > NB_LINE) { + for (i = NB_LINE, curseur = posProc; i; curseur = curseur -> next, i--); + if (curseur) posProc = posProc -> next; + DoExpose(); + } + + if (ev.xbutton.button == WHEEL_DOWN && posProc -> previous && gNbProc > NB_LINE) { + posProc = posProc -> previous; + DoExpose(); + } + + /* Mouse wheel patch end */ + + if (ev.xbutton.button == CLICK_ONE) { + + struct timeval temp; + long long nms1; + + gettimeofday(&temp, NULL); + nms1 = temp.tv_sec - timev.tv_sec; /* nb sec since last click */ + + if ((!nms1 || nms1 == 1)){ + long long yop = (nms1 * 1000000L) + (temp.tv_usec - timev.tv_usec); /* nb mlsec since last click */ + if (firstClick && (yop < DOUBLE_CLICK_DELAY)){ /* we got double click */ + doubleClick = 1; + firstClick = 0; + } else firstClick = 1; + } else firstClick = 1; + + timev = temp; + + if (zone == UP && !doubleClick && gNbProc > NB_LINE) + { + for (i = NB_LINE, curseur = posProc; i; curseur = curseur -> next, i--); + if (curseur) posProc = posProc -> next; + DoExpose(); + } + + else if (zone == DOWN && posProc -> previous && !doubleClick && gNbProc > NB_LINE) + { + posProc = posProc -> previous; + DoExpose(); + } + + else if (zone == UP && doubleClick && gNbProc > NB_LINE) + { + + for (curseur = pList; curseur -> next; curseur = curseur -> next); /* curseur = end of list */ + + for (i = NB_LINE - 1; i; curseur = curseur -> previous, i--); + posProc = curseur; + DoExpose(); + } + + else if (zone == DOWN && doubleClick && gNbProc > NB_LINE) + { + posProc = pList; + DoExpose(); + } + + else if (zone > 0 && zone <= NB_LINE && doubleClick && tabNoProc[zone - 1] != -1) + { + kill(tabNoProc[zone - 1], SIGKILL); /* let's kill the mofo */ + waitpid(tabNoProc[zone - 1], NULL, 0); + } + + if (doubleClick) doubleClick = 0; + + } +} + +void DoEvents() { + + unsigned long long compteur = 0; + + XEvent ev ; + + for (;;){ + if (!compteur){ + if (CheckProcChange()) DoExpose(); + compteur = UPDATE_NB * DELAY; + } + while(XPending(dpy)){ + XNextEvent(dpy,&ev); + switch(ev.type) { + case Expose : DoExp(); break; + case ButtonPress : DoClick(ev); break; + } + } + usleep(DELAY); + compteur -= DELAY; + } +} + +void PrintUsage(void) +{ + printf("usage: wmAppKill [-a] [-n ] [-h]\n"); + printf("\t-a\t\tSelect all processes\n"); + printf("\t-n \tDo not select processes older than (default: wmaker)\n"); + printf("\t-h\t\tDisplay help screen\n"); +} + +void GetArg(int argc, char *argv[]) +{ + if (argc == 1) return; + + else if (argc == 3 && !strcmp(argv[1], "-n") && argv[2][0] != '-') + procBaseName = strdup(argv[2]); + + else if (argc == 2 && !strcmp(argv[1], "-a")) + procBaseName = NULL; + + else if (argc == 2 && !strcmp(argv[1], "-h")) + { + PrintUsage(); + exit(1); + } + else { + PrintUsage(); + exit(1); + } +} + +void CreateDock(int argc, char *argv[]) /* this part comes from http://www.linuxmag-france.org/ */ +{ + Window root; + XWMHints wmHints; + XSizeHints sizeHints; + XClassHint classHint; + Pixmap pixmask; + unsigned long p_blanc; + unsigned long p_noir; + unsigned int borderWidth = 2; + char *wname = argv[0] ; + + dpy = XOpenDisplay(NULL) ; + + if(dpy == NULL) + { + fprintf(stderr, "Can't open display\n") ; + exit(1) ; + } + + root = RootWindow(dpy,screen); + p_blanc = WhitePixel(dpy,screen) ; + p_noir = BlackPixel(dpy,screen) ; + gc = XDefaultGC(dpy,screen) ; + XSetForeground(dpy, gc, p_noir); + XSetBackground(dpy, gc,p_noir); + + sizeHints.x = 0 ; + sizeHints.y = 0 ; + sizeHints.width = 64 ; + sizeHints.height = 64 ; + + win = XCreateSimpleWindow(dpy,root,sizeHints.x,sizeHints.y , sizeHints.width, sizeHints.height, borderWidth, p_noir,p_noir) ; + iconWin = XCreateSimpleWindow(dpy,root,sizeHints.x,sizeHints.y,sizeHints.width, sizeHints.height, borderWidth, p_noir,p_noir ) ; + + sizeHints.flags = USSize | USPosition ; + XSetWMNormalHints(dpy,win,&sizeHints) ; + 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(dpy, win, &wmHints) ; + classHint.res_name = wname ; + classHint.res_class = wname ; + + XSetClassHint(dpy, win, &classHint) ; + XSetCommand(dpy,win, argv, argc) ; + + pixmask = XCreateBitmapFromData(dpy,win,fond_bits, fond_width, fond_height) ; + XShapeCombineMask(dpy,win,ShapeBounding,0,0,pixmask,ShapeSet) ; + XShapeCombineMask(dpy,iconWin,ShapeBounding, 0, 0, pixmask, ShapeSet) ; + XpmCreatePixmapFromData(dpy,root,wmAppKill_xpm, &XPM, NULL,NULL) ; + + XSelectInput(dpy,win, ExposureMask | ButtonPressMask) ; + XSelectInput(dpy,iconWin, ExposureMask | ButtonPressMask) ; + + XMapWindow(dpy,win) ; +} + +int main(int argc, char *argv[]) +{ + int i; + + GetArg(argc, argv); + glibtop_init(); + CreateDock(argc, argv); + gettimeofday(&timev, NULL); + + pList = GetProcList(); + posProc = pList; + + ZoneCreate(4, 50, 8, 8, UP); + ZoneCreate(54, 50, 8, 8, DOWN); + + for (i = NB_LINE; i; i--) + ZoneCreate(X_PROC + 1, Y_PROC + (i - 1) * 10 + 2, 48, 7, i); + + DoEvents(); + + return 0; +} + diff --git a/wmappkill/wmAppKill.h b/wmappkill/wmAppKill.h new file mode 100644 index 0000000..f5aa38c --- /dev/null +++ b/wmappkill/wmAppKill.h @@ -0,0 +1,54 @@ +#define PROC_DEF "wmaker" + +#define MAX_CHAR 8 +#define NB_LINE 4 + +#define CLICK_ONE 1 +#define CLICK_TWO 3 + +#define WHEEL_UP 4 +#define WHEEL_DOWN 5 + +#define X_PROC 6 +#define Y_PROC 7 + +#define DOWN 7 /* minus */ +#define UP 8 /* plus */ + +#define DOUBLE_CLICK_DELAY 170000L +#define DELAY 10000 +#define UPDATE_NB 60 /* checking delay = DELAY * UPDATE_NB (ms) */ + +typedef struct _desc{ + char name[40]; + pid_t pid; + struct _desc *previous; + struct _desc *next; +} _desc; + +typedef struct _zone{ + int x; + int y; + int width; + int height; + char no; + struct _zone *next; +} _zone; + +void ZoneCreate(int x, int y, int width, int height, char no); +void GarbageCollector(_desc *garb); +char CheckZone(void); +int CheckProc(pid_t pid); +_desc *GetProcList(void); +int CheckProcToRemove(unsigned int *procList, unsigned int procListSize); +int CheckProcToAdd(int pos, unsigned int *procList, unsigned int procListSize); +int CheckProcChange(void); +void RemoveProc(_desc *cible); +void ShowString (int x, int y, char *doudou); +void DoExp(); +void DoExpose(); +void DoClick(XEvent ev); +void DoEvents(); +void PrintUsage(void); +void GetArg(int argc, char *argv[]); +void CreateDock(int argc, char *argv[]); diff --git a/wmappkill/wmAppKill.xpm b/wmappkill/wmAppKill.xpm new file mode 100644 index 0000000..b77c304 --- /dev/null +++ b/wmappkill/wmAppKill.xpm @@ -0,0 +1,375 @@ +/* XPM */ +static char * wmAppKill_xpm[] = { +"178 38 334 2", +" c None", +". c #202020", +"+ c #0000FF", +"@ c #09070C", +"# c #08060B", +"$ c #010004", +"% c #07050A", +"& c #030106", +"* c #060409", +"= c #040207", +"- c #010005", +"; c #05040C", +"> c #000005", +", c #000004", +"' c #09090B", +") c #000000", +"! c #010101", +"~ c #000002", +"{ c #07060C", +"] c #0D0C14", +"^ c #000007", +"/ c #20B2AE", +"( c #004941", +"_ c #007D71", +": c #010002", +"< c #050306", +"[ c #0B090E", +"} c #020003", +"| c #050308", +"1 c #0C0A0F", +"2 c #09080E", +"3 c #060606", +"4 c #020200", +"5 c #030301", +"6 c #060604", +"7 c #040404", +"8 c #030207", +"9 c #010006", +"0 c #0B0A0F", +"a c #070709", +"b c #B60418", +"c c #00EB00", +"d c #283C38", +"e c #050304", +"f c #060407", +"g c #A3A1A2", +"h c #636164", +"i c #333132", +"j c #FCFAFD", +"k c #727071", +"l c #2A282B", +"m c #DFDDDE", +"n c #080607", +"o c #030102", +"p c #0A0809", +"q c #C0BFBD", +"r c #7B7A76", +"s c #010000", +"t c #070602", +"u c #B7B6B4", +"v c #424043", +"w c #ABA9AE", +"x c #A09EA3", +"y c #F7F3FF", +"z c #060405", +"A c #767475", +"B c #9D9B9C", +"C c #5F5D5E", +"D c #E0DEDF", +"E c #A7A5A6", +"F c #696768", +"G c #ABA9AA", +"H c #151314", +"I c #2D2B2C", +"J c #292728", +"K c #252324", +"L c #0B090A", +"M c #3D3B3C", +"N c #1D1B1E", +"O c #121011", +"P c #EAE9E5", +"Q c #D0CFCA", +"R c #080702", +"S c #CAC9C5", +"T c #413F40", +"U c #838184", +"V c #B9B7BC", +"W c #050402", +"X c #71E371", +"Y c #010100", +"Z c #2B2B29", +"` c #DBDBD9", +" . c #A3A3A1", +".. c #888886", +"+. c #D2D2D0", +"@. c #969694", +"#. c #80807E", +"$. c #444442", +"%. c #D5D5D3", +"&. c #737371", +"*. c #F2F2F0", +"=. c #90908E", +"-. c #BABABA", +";. c #B0AEB1", +">. c #040203", +",. c #686765", +"'. c #9D9C98", +"). c #EAE9E4", +"!. c #212119", +"~. c #B9B8B4", +"{. c #939192", +"]. c #FFFEFF", +"^. c #2F2D30", +"/. c #090806", +"(. c #0C0C0A", +"_. c #FFFFFD", +":. c #D7D7D5", +"<. c #EDEDEB", +"[. c #DFDFDD", +"}. c #3E3E3C", +"|. c #393937", +"1. c #CACAC8", +"2. c #B7B7B5", +"3. c #454543", +"4. c #3B3B3B", +"5. c #BEBCBF", +"6. c #B2B1AF", +"7. c #767571", +"8. c #A9A8A3", +"9. c #75756D", +"0. c #030200", +"a. c #C2C1BD", +"b. c #EDECEA", +"c. c #A2A0A1", +"d. c #7E7C7F", +"e. c #050505", +"f. c #BDBDBD", +"g. c #F0F0F0", +"h. c #B2B2B2", +"i. c #FEFEFE", +"j. c #444444", +"k. c #B6B6B6", +"l. c #020202", +"m. c #C0C0C0", +"n. c #3A3A3A", +"o. c #464646", +"p. c #BBB9BC", +"q. c #1B191A", +"r. c #E7E6E4", +"s. c #C5C4C0", +"t. c #C7C6C1", +"u. c #D2D1CC", +"v. c #C4C3BF", +"w. c #4D4C4A", +"x. c #141213", +"y. c #DDDBDE", +"z. c #151316", +"A. c #0B0B0B", +"B. c #090909", +"C. c #8F8F8F", +"D. c #AFAFAF", +"E. c #7C7C7C", +"F. c #D0D0D0", +"G. c #3D3D3D", +"H. c #C6C6C6", +"I. c #BEBEBE", +"J. c #3C3C3E", +"K. c #C4C2C5", +"L. c #666467", +"M. c #959394", +"N. c #E3E2DD", +"O. c #23221E", +"P. c #BDBCBA", +"Q. c #383637", +"R. c #080609", +"S. c #7A787D", +"T. c #949297", +"U. c #040205", +"V. c #060608", +"W. c #19191B", +"X. c #2A2A2C", +"Y. c #0F0F11", +"Z. c #303032", +"`. c #0B0B0D", +" + c #161618", +".+ c #232325", +"++ c #2E2E30", +"@+ c #1A1A1C", +"#+ c #171719", +"$+ c #27262B", +"%+ c #1F1E23", +"&+ c #222222", +"*+ c #030400", +"=+ c #2C2D28", +"-+ c #151513", +";+ c #2E2E2C", +">+ c #212123", +",+ c #020106", +"'+ c #111015", +")+ c #3E3D42", +"!+ c #C7C5C8", +"~+ c #107D79", +"{+ c #188A86", +"]+ c #9C9AA8", +"^+ c #9F9EAC", +"/+ c #9C9EAB", +"(+ c #9A9EA9", +"_+ c #989CA8", +":+ c #979BA7", +"<+ c #989AA7", +"[+ c #9799A6", +"}+ c #9698A5", +"|+ c #9695A3", +"1+ c #9A99A9", +"2+ c #9693A4", +"3+ c #9390A1", +"4+ c #918E9F", +"5+ c #9491A2", +"6+ c #9894A5", +"7+ c #9897A5", +"8+ c #9294A0", +"9+ c #898B97", +"0+ c #9799A5", +"a+ c #8F919D", +"b+ c #8E909C", +"c+ c #8B8D99", +"d+ c #848692", +"e+ c #90929E", +"f+ c #81838F", +"g+ c #8D8F9B", +"h+ c #868894", +"i+ c #8B8B97", +"j+ c #7E7E8A", +"k+ c #8A8997", +"l+ c #81818D", +"m+ c #888894", +"n+ c #81818B", +"o+ c #82828E", +"p+ c #82828C", +"q+ c #80808A", +"r+ c #7F7F89", +"s+ c #7E7E88", +"t+ c #A3A1AF", +"u+ c #9A99A7", +"v+ c #9D9FAB", +"w+ c #9CA0A9", +"x+ c #9B9FAA", +"y+ c #999BA7", +"z+ c #989AA6", +"A+ c #9999A5", +"B+ c #9896A4", +"C+ c #9795A3", +"D+ c #9694A2", +"E+ c #9692A1", +"F+ c #9593A1", +"G+ c #9392A0", +"H+ c #9193A0", +"I+ c #90929F", +"J+ c #8F919E", +"K+ c #8E909D", +"L+ c #8D8F9C", +"M+ c #8C8E9B", +"N+ c #8B8D9A", +"O+ c #8A8C99", +"P+ c #898B98", +"Q+ c #8A8A96", +"R+ c #8A8A94", +"S+ c #898995", +"T+ c #888892", +"U+ c #878791", +"V+ c #868690", +"W+ c #86868E", +"X+ c #84848E", +"Y+ c #84848C", +"Z+ c #83838B", +"`+ c #82828A", +" @ c #818189", +".@ c #00FF00", +"+@ c #04FA00", +"@@ c #08F600", +"#@ c #0DF200", +"$@ c #11ED00", +"%@ c #16E900", +"&@ c #1AE500", +"*@ c #1FE000", +"=@ c #23DC00", +"-@ c #28D800", +";@ c #2CD300", +">@ c #31CF00", +",@ c #35CB00", +"'@ c #3AC600", +")@ c #3EC200", +"!@ c #42BE00", +"~@ c #47BA00", +"{@ c #4BB500", +"]@ c #50B100", +"^@ c #54AD00", +"/@ c #59A800", +"(@ c #5DA400", +"_@ c #62A000", +":@ c #669B00", +"<@ c #6B9700", +"[@ c #6F9300", +"}@ c #748E00", +"|@ c #788A00", +"1@ c #7D8600", +"2@ c #818200", +"3@ c #867D00", +"4@ c #8A7900", +"5@ c #8E7500", +"6@ c #937000", +"7@ c #976C00", +"8@ c #9C6800", +"9@ c #A06300", +"0@ c #A55F00", +"a@ c #A95B00", +"b@ c #AE5600", +"c@ c #B25200", +"d@ c #B74E00", +"e@ c #BB4900", +"f@ c #C04500", +"g@ c #C44100", +"h@ c #C93C00", +"i@ c #CD3800", +"j@ c #D23400", +"k@ c #D62F00", +"l@ c #DB2B00", +"m@ c #DF2700", +"n@ c #E42200", +"o@ c #E81E00", +"p@ c #ED1A00", +"q@ c #F11500", +"r@ c #F61100", +"s@ c #FA0D00", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + @ # $ % $ & * $ = * $ & $ $ - ; > , ' ) ) ! ~ > { ] ^ > , + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . / / / . . . ( ( ( _ . _ / / / _ . _ / / / _ . _ ( ( ( _ . _ / / / _ . _ / / / _ . _ / / / _ . _ / / / _ . _ / / / _ . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + : $ < = : % : * : [ } | : 1 * > 2 ~ 3 4 5 6 7 8 9 > > 0 a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". / . . . / . ( . . . / . ( . . . / . ( . . . / . / . . . / . / . . . ( . / . . . ( . ( . . . / . / . . . / . / . . . / . . . . . . . . . . . . / . . . . . . + + . b b . + + . c c . + + . d d . + + + + + + + + + e f g h i j k l m : n : o : : $ @ p q r s t u v $ w x < s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". / . . . / . ( . . . / . ( . . . / . ( . . . / . / . . . / . / . . . ( . / . . . ( . ( . . . / . / . . . / . / . . . / . . / . . . . / . . . . / . . . . . . + + b y b b + + c y c c + + d d d d + + + + + + + + + s z A B C D E F G H I J K L M N : O P Q R s S T U V : s W + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". _ ( ( ( _ . . ( ( ( _ . _ / / / _ . . / / / _ . _ / / / _ . _ / / / _ . _ / / / _ . . ( ( ( _ . ( / / / ( . _ / / / _ . . _ . . . . _ . . . / . . . . . . . + + b b b b + + c c c c + + d d d d + + + . / ( X + + Y ) Z ` ...+.@.#.$.%.&.*.=.-.;.>.,.'.).!.s ~.{.].^.} s /.+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". / . . . / . ( . . . / . / . . . ( . ( . . . / . ( . . . / . ( . . . / . / . . . / . ( . . . / . / . . . / . ( . . . / . . . . . . . . . . . / . . . . . . . + + . b b . + + . c c . + + . d d . + + + + + + + + + (.) 4 _.:.Z <.[.}.|.1.) 2.3.4.5.n 6.7.8.9.0.a.b.c.d.: n s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". / . . . / . ( . . . / . / . . . ( . ( . . . / . ( . . . / . ( . . . / . / . . . / . ( . . . / . / . . . / . ( . . . / . . / . . . . / . . / . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + ) ) e.f.g.) h.i.3 j.k.l.m.n.o.p.q.r.s.t.u.s v.w.x.y.z.s s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . / / / . . . ( ( ( / . _ / / / _ . _ / / / _ . . ( ( ( _ . _ / / / _ . _ / / / _ . . ( ( ( _ . _ / / / _ . _ / / / _ . . _ . . . . _ . . / . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + A.B.! C.D.l.E.F.) G.H.B.I.G.J.K.L.M.0.s N.O.P.Q.R.S.T.U.p + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + ~ V.~ W.X.~ Y.Z.`. +.+~ ++@+#+$+%+&+6 *+=+-+;+>+,+'+)+Y.) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / . . . + + + ", +". ( / / / ( . _ / / / . . _ / / / _ . _ / / / . . _ / / / _ . _ / / / _ . _ / / / _ . _ ( ( ( _ . . ( / ( . . . ( ( ( _ . _ ( ( ( _ . _ ( ( ( . . / ( ( ( / . _ / / / . . _ / / / _ . _ / / / _ . _ / / / _ . _ / / / _ . _ / / / _ . _ / / / _ . _ ( ( ( _ . _ ( ( ( _ . _ ( ( ( _ . _ ( ( ( _ . _ ( ( ( _ . _ / / / _ . . . _ _ . . . . . . . . . . . . . . + + + ", +". / . . . / . / . . . / . / . . . ( . / . . . / . / . . . ( . / . . . ( . / . . . ( . / . . . / . ( . / . ( . ( . . . / . / . . . / . / . . . ( . / / . / / . / . . . / . / . . . / . / . . . / . / . . . / . / . . . / . / . . . ( . ( . / . ( . / . . . / . / . . . / . / . . . / . / . . . / . / . . . / . ( . . . / . . . _ _ . . . . . . . . ( / / / ( . + + + ", +". / . . . / . / . . . / . / . . . ( . / . . . / . / . . . ( . / . . . ( . / . . . ( . / . . . / . ( . / . ( . ( . . . / . / . . / ( . / . . . ( . / . / . / . / . . . / . / . . . / . / . . . / . / . . . / . / . . . / . / . . . ( . ( . / . ( . / . . . / . / . . . / . / . . . / . ( / . / ( . / . . . / . ( . . / ( . _ _ _ _ _ _ _ _ _ _ _ _ / . . . / . + + + ", +". _ / / / _ . _ / / / . . _ ( ( ( . . _ ( ( ( _ . _ / / / . . _ / / / . . _ ( / / _ . _ / / / _ . . ( / ( . . . ( ( ( _ . _ / / ( . . _ ( ( ( . . _ ( ( ( _ . _ ( ( ( _ . _ ( ( ( _ . _ / / / _ . _ / ( ( _ . _ / / / . . _ / / / _ . . ( _ ( . . _ ( ( ( _ . _ ( ( ( _ . _ ( ( ( _ . . ( / ( . . _ / / / _ . . ( / ( . . _ _ _ _ _ _ _ _ _ _ _ _ / . . . / . + + + ", +". / . . . / . / . . . / . / . . . ( . / . . . / . / . . . ( . / . . . ( . / . . . / . / . . . / . ( . / . ( . ( . . . / . / . . / ( . / . . . ( . / . . . / . / . . . / . / . . . / . / . . . ( . / . / . / . / . . . / . ( . . . / . ( . / . ( . / . . . / . / . . . / . / . / . / . ( / . / ( . ( . . . / . ( / . . ( . . . _ _ . . . . . . . . _ / / / _ . + + + ", +". / . . . / . / . . . / . / . . . ( . / . . . / . / . . . ( . / . . . ( . / . . . / . / . . . / . ( . / . ( . ( . . . / . / . . . / . / . . . ( . / . . . / . / . . . / . / . . . / . / . . . ( . / . . / / . / . . . / . ( . . . / . ( . / . ( . / . . . / . / . . . / . / / . / / . / . . . / . ( . . . / . / . . . ( . . . _ _ . . . . . . . . / . . . / . + + + ", +". _ ( ( ( _ . _ / / / . . _ / / / _ . / / / / . . _ / / / _ . / ( ( ( . . _ / / / _ . _ ( ( ( _ . . ( / ( ( . _ / / / _ . _ ( ( ( _ . _ / / / ( . _ ( ( ( _ . / ( ( ( / . _ / / / _ . _ ( ( ( . . _ / / / _ . _ ( ( ( _ . _ / / / _ . . ( _ ( . . ( / / / / . . / / / . . / ( ( ( / . _ ( ( ( / _ _ / / / _ . _ / / / _ . . . . . . . . . . . . . _ . . . _ . + + + ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + ", +"+ + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !++ + + . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + !+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!+!++ + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + !++ + + . + + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . . + + . . . / / / / . . . ( ( ( ( ~+. ~+/ / / / {+. ~+/ / / / ~+. ~+( ( ( ( ~+. ~+/ / / / ~+. ~+/ / / / {+. ~+/ / / / ~+. ~+/ / / / {+. ~+/ / / / {+. . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . . . + + . . / . . . . / . ( . . . . / . ( . . . . / . ( . . . . / . / . . . . / . / . . . . ( . / . . . . ( . ( . . . . / . / . . . . / . / . . . . / . . / . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . . . + + . . / . . . . / . ( . . . . / . ( . . . . / . ( . . . . / . / . . . . / . / . . . . ( . / . . . . ( . ( . . . . / . / . . . . / . / . . . . / . . / . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . . + + . . / . . . . / . ( . . . . / . ( . . . . / . ( . . . . / . / . . . . / . / . . . . ( . / . . . . ( . ( . . . . / . / . . . . / . / . . . . / . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . . . + + . . ~+( ( ( ( ~+. . ( ( ( ( ~+. ~+/ / / / ~+. ~+/ / / / ~+. ~+/ / / / ~+. ~+/ / / / ~+. ~+/ / / / ~+. . ( ( ( ( ~+. ~+/ / / / ~+. ~+/ / / / ~+. . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . ( . . . ( . . . + + . . / . . . . / . ( . . . . / . / . . . . ( . ( . . . . / . ( . . . . / . ( . . . . / . / . . . . / . ( . . . . / . / . . . . / . ( . . . . / . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . ( ( ( . . . . + + . . / . . . . / . ( . . . . / . / . . . . ( . ( . . . . / . ( . . . . / . ( . . . . / . / . . . . / . ( . . . . / . / . . . . / . ( . . . . / . . / . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + . . / . . . . / . ( . . . . / . / . . . . ( . ( . . . . / . ( . . . . / . ( . . . . / . / . . . . / . ( . . . . / . / . . . . / . ( . . . . / . . / . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + . . . / / / / . . . ( ( ( ( ~+. ~+/ / / / ~+. ~+/ / / / ~+. . ( ( ( ( ~+. ~+/ / / / ~+. ~+/ / / / ~+. . ( ( ( ( ~+. ~+/ / / / ~+. ~+/ / / / ~+. . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . . ]+^+/+(+_+:+<+<+[+}+|+1+2+3+4+5+6+2+7+8+9+0+9+a+b+c+8+d+e+f+c+g+h+d+i+j+k+l+i+m+j+n+o+p+n+q+r+s+ . . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . . t+u+v+w+x+(+y+z+z+0+A+7+B+B+C+D+E+F+G+H+H+I+J+K+K+K+L+L+M+N+O+P+P+9+Q+R+S+T+T+U+V+W+X+Y+Z+`+ @ @ . . + + .@+@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", +"+ + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !++ + + . + + .@+@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "};