wmmenu: Add version 1.2 to repository.
Obtained from [1] at the request of Nerijus Baliunas [2]. [1] https://web.archive.org/web/20110720231607/http://www.fcoutant.freesurf.fr/download/wmmenu-1.2.tar.gz [2] http://lists.windowmaker.org/dev/msg07991.html
This commit is contained in:
parent
da9608cbd8
commit
ef546fc369
340
wmmenu/COPYING
Normal file
340
wmmenu/COPYING
Normal file
|
@ -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
|
||||
|
||||
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., 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.
|
||||
|
||||
<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.
|
70
wmmenu/Makefile
Normal file
70
wmmenu/Makefile
Normal file
|
@ -0,0 +1,70 @@
|
|||
prefix = /usr/local
|
||||
BINDIR = $(prefix)/bin
|
||||
MANDIR = $(prefix)/man
|
||||
ETCDIR = $(prefix)/etc
|
||||
|
||||
# comment out both lines to get the old, Xpm-only, version
|
||||
GDKPIXBUF = 1
|
||||
#GDKPIXBUF2 = 1
|
||||
|
||||
XROOT = /usr/X11R6
|
||||
DAROOT = /usr/local
|
||||
|
||||
# If you want to use gdk-pixbuf, pass GDKPIXBUF=1 to make command
|
||||
ifdef GDKPIXBUF
|
||||
PIXBUF_DEF = -DWITH_GDKPIXBUF
|
||||
PIXBUF_INC := $(shell gdk-pixbuf-config --cflags)
|
||||
PIXBUF_LIB := -rdynamic -L$(shell gdk-pixbuf-config --prefix)/lib -lgdk_pixbuf_xlib
|
||||
endif
|
||||
|
||||
# If you want to use gdk-pixbuf-2.0, pass GDKPIXBUF2=1 to make command
|
||||
ifdef GDKPIXBUF2
|
||||
PIXBUF_CFG = /opt/gtk2/bin/pkg-config gdk-pixbuf-xlib-2.0
|
||||
PIXBUF_DEF = -DWITH_GDKPIXBUF
|
||||
PIXBUF_INC := $(shell $(PIXBUF_CFG) --cflags)
|
||||
PIXBUF_LIB := -rdynamic -L$(shell $(PIXBUF_CFG) --variable=prefix)/lib -lgdk_pixbuf_xlib-2.0
|
||||
endif
|
||||
|
||||
CC = gcc #-g
|
||||
CFLAGS = -pipe $(CPPFLAGS) -O2
|
||||
CPPFLAGS = -MMD -ansi -pedantic -Wall $(INCDIRS) $(DEFINES)
|
||||
INCDIRS = -I$(DAROOT)/include -I$(XROOT)/include $(PIXBUF_INC)
|
||||
DEFINES = -DETCDIR='"$(ETCDIR)"' $(PIXBUF_DEF)
|
||||
LDFLAGS = -s
|
||||
LIBDIRS = -L$(DAROOT)/lib -L$(XROOT)/lib $(PIXBUF_LIB)
|
||||
LDLIBS = -ldockapp -lXpm -lXext -lX11 -lm
|
||||
|
||||
MKDIRHIER = mkdir -p
|
||||
MAN1DIR = $(MANDIR)/man1
|
||||
|
||||
SRCS1 = \
|
||||
wmmenu.c options.c error.c menu.c utils.c pixmaps.c \
|
||||
xobjects.c buttonbar.c events.c
|
||||
|
||||
OBJS1 = $(SRCS1:.c=.o)
|
||||
PRGS = wmmenu
|
||||
MAN1 = $(PRGS:%=%.1)
|
||||
|
||||
RM = rm -f
|
||||
INSTBIN = install -c
|
||||
INSTMAN = install -c
|
||||
|
||||
all : $(PRGS)
|
||||
|
||||
.c.o :
|
||||
$(CC) $(CFLAGS) -c $<
|
||||
|
||||
wmmenu : $(OBJS1)
|
||||
$(CC) $(LDFLAGS) -o $@ $(OBJS1) $(LIBDIRS) $(LDLIBS)
|
||||
|
||||
install : $(PRGS) $(MAN1)
|
||||
$(MKDIRHIER) $(BINDIR)
|
||||
$(INSTBIN) $(PRGS) $(BINDIR)
|
||||
$(MKDIRHIER) $(MAN1DIR)
|
||||
$(INSTMAN) $(MAN1) $(MAN1DIR)
|
||||
|
||||
clean :
|
||||
$(RM) *.o *.d core tags $(PRGS)
|
||||
|
||||
# dependencies -- do not change lines below
|
||||
-include *.d
|
331
wmmenu/README
Normal file
331
wmmenu/README
Normal file
|
@ -0,0 +1,331 @@
|
|||
WHAT IS IT
|
||||
----------
|
||||
|
||||
This is a "dock application" for Windowmaker, that provides a button bar to
|
||||
launch applications from.
|
||||
|
||||
The bar opens automatically when either the mouse enters the button or you
|
||||
click on it (this is configurable).
|
||||
|
||||
Multiple instances of the program can run at the same time: each one provides
|
||||
a menu that it reads from a separate file, so you can have as many different
|
||||
menus as you want (you can also display the same menu more than once if you
|
||||
want; dunno what it's useful for...).
|
||||
|
||||
REQUIREMENTS
|
||||
------------
|
||||
|
||||
Xlib, Xpm, libdockapp.
|
||||
|
||||
By default only XPM format icons can be loaded. If you have
|
||||
gdk-pixbuf (>= 0.9.0) installed, you can build wmmenu with it and all
|
||||
image types supported by gdk-pixbuf will be loadable by wmmenu.
|
||||
|
||||
NB:
|
||||
- gdk-pixbuf 0.8.0 might work, but I didn't check
|
||||
- the new gdk-pixbuf (2.0) provided with Gtk+ 2.0 is currently
|
||||
broken: the Xlib part doesn't seem to be able to compile
|
||||
without Gdk any more, making it useless. I have included
|
||||
Makefile definitions so that you can check by yourself (please
|
||||
complain to the maintainer(s) of gdk-pixbuf-xlib).
|
||||
|
||||
LIBDOCKAPP WARNING
|
||||
------------------
|
||||
|
||||
There is a bug in libdockapp-0.4.0: it does not setup the dockapp's title
|
||||
correctly, and wmmenu appears as being named "DockApp". This prevents
|
||||
using several wmmenus in WMaker's dock.
|
||||
|
||||
To correct this, apply the following one-change patch:
|
||||
|
||||
========================================================================
|
||||
diff -ru libdockapp-0.4.0.orig/src/damain.c libdockapp-0.4.0/src/damain.c
|
||||
--- libdockapp-0.4.0.orig/src/damain.c Mon Feb 14 11:08:04 2000
|
||||
+++ libdockapp-0.4.0/src/damain.c Sat May 4 13:59:30 2002
|
||||
@@ -67,7 +67,7 @@
|
||||
/* Set ClassHint */
|
||||
if (!(classHint = XAllocClassHint()))
|
||||
printf("%s: can't allocate memory for class hints!\n", progName), exit(1);
|
||||
- classHint->res_class = "DockApp";
|
||||
+ classHint->res_class = name;
|
||||
classHint->res_name = name;
|
||||
|
||||
XSetClassHint(DADisplay, DALeader, classHint);
|
||||
========================================================================
|
||||
|
||||
I also found my Debian package "libdockapp-dev" version 0.61.1-5 to have a
|
||||
bug regarding timers: If you use the hide_timeout option, you should
|
||||
definitely recompile your own version.
|
||||
|
||||
QUICKSTART
|
||||
----------
|
||||
|
||||
1. Make a ".wmmenu" directory in your home directory:
|
||||
|
||||
mkdir ~/.wmmenu
|
||||
|
||||
2. You have to make at least one file containing the menu definition. It's
|
||||
also strongly advised to make a second file named "defaults", to contain
|
||||
general settings such as pixmaps paths.
|
||||
The syntax of those files is quite easy (and is detailed below) but as a
|
||||
start point you can copy the example files and edit them:
|
||||
|
||||
[from the sources main directory]
|
||||
cp example/[ad]* ~/.wmmenu
|
||||
vi ~/.wmmenu/*
|
||||
|
||||
The menu would then be named "apps".
|
||||
|
||||
3. The file in ~/.wmmenu you have put a menu definition in, must have its
|
||||
name (relative to ~/.wmmenu) passed as argument to wmmenu like this:
|
||||
|
||||
wmmenu -m apps
|
||||
|
||||
USAGE
|
||||
-----
|
||||
|
||||
wmmenu [<options>...]
|
||||
|
||||
-h
|
||||
show help message
|
||||
-m MENUNAME (mandatory)
|
||||
set the name of the menu file to load from ~/.wmmenu
|
||||
-g WxH
|
||||
set width and height of tile
|
||||
-t XPMFILE
|
||||
set the pixmap used as tile
|
||||
-l XPMFILE
|
||||
set the pixmap used as highlight to track pointer
|
||||
-O oldleaving
|
||||
use old behavior for hiding the button bar: hide only when
|
||||
leaving the bar, not when leaving the tile.
|
||||
-O click
|
||||
activate the button bar only when clicking on the tile, not
|
||||
when the mouse moves in and out.
|
||||
-O noautoscale
|
||||
disable automatic scaling of pixmaps, that makes them fit
|
||||
inside specified tile size.
|
||||
-O behind
|
||||
draw highlight pixmap behind icon, not above.
|
||||
-O hide=N
|
||||
set the time delay necessary for the bar to close after the
|
||||
cursor has left wmmenu. N is specified as a strictly positive
|
||||
integer in milliseconds. 1 is used by default.
|
||||
-r ROWS
|
||||
arrange icons in the bar on multiple rows (specified as the
|
||||
number ROWS). The default is one. Icons are arranged leftmost
|
||||
from upper left corner.
|
||||
|
||||
The tile is used in conjunction with transparent pixmaps as a background. When
|
||||
drawing the button bar, for each button, the tile is drawn first, then the
|
||||
specified icon is drawn over it.
|
||||
|
||||
The tile also determines the width and height of the button bar, as each
|
||||
button pixmap is cut to the size of the tile if it's bigger, or centered over
|
||||
it if it's smaller. The height of the bar is the height of the tile, and the
|
||||
width of the bar is the width of the tile multiplied by the number of entries
|
||||
specified for the displayed menu.
|
||||
|
||||
I have included a facility to arbitrarily set tile geometry independently of
|
||||
the pixmap tile's size, but not sure it's useful.
|
||||
|
||||
|
||||
When run, wmmenu first reads a file named "defaults" in ~/.wmmenu, from which
|
||||
it gets settings common to all menus, currently the pixmap path and tile
|
||||
and highlight pixmap names. The pixmap path is used to set a list of paths
|
||||
from which to search pixmap file names; At each place a pixmap file name is
|
||||
requested, you can then use the file name without it's directory prepended
|
||||
(leaving only the "basename").
|
||||
|
||||
The syntax of this file is roughly the following: comments start with # and
|
||||
end at the end of the line they start on. Blank lines are allowed and always
|
||||
meaningless. Other lines are variable setting and take the form
|
||||
<variable><blanks><value> where <blanks> does NOT contain newlines (all this
|
||||
must be on the same line). <variable> can be:
|
||||
. xpmpath <value> is a colon-separated list of path indicating where to
|
||||
search for pixmap files (i.e. /some/path1:/some/path2).
|
||||
. tile <value> is the file name of the pixmap to use as tile; Or
|
||||
use !<cmd> to specify a command to execute, that will
|
||||
return the name of the pixmap file name.
|
||||
. highlight <value> is the file name of the pixmap to use for pointer
|
||||
tracking
|
||||
|
||||
Multiple xpmpath definitions can occur and are merged together. A default
|
||||
path of ~/.wmmenu is always prepended to the path list.
|
||||
|
||||
|
||||
Then wmmenu reads the file specified by "-m" option from ~/.wmmenu directory.
|
||||
This file specifies a list of buttons for the resulting menu, with the pixmap
|
||||
to be used for the button and the command to be run when the corresponding
|
||||
button is pressed.
|
||||
|
||||
The syntax is the following: the file is a suite of lines. Each line can be:
|
||||
. blank, it is ignored
|
||||
. a comment: it starts with # and is ignored too
|
||||
. a menu entry: the line is written as "<pixmap>"<blanks><command>.
|
||||
|
||||
For each menu entry <pixmap> specifies the file name of the pixmap to be used
|
||||
for the button, and <command> specifies a shell command to be run when the
|
||||
button is pressed. <pixmap> can specify an absolute file name as well as a
|
||||
path-less name, in which case it is searched in the pixmap path specified in
|
||||
the "defaults" file. <command> usually has & at the end because wmmenu runs it
|
||||
synchronously (it waits for its termination); since this is run by the shell
|
||||
you can also use redirections and all sort of things if you want to. You are
|
||||
free to embed blanks in <command> as well as <pixmap>, since the syntax has
|
||||
been done to allow it; you can also use double-quotes in <command>, though
|
||||
obviously you cannot use them for the name of the pixmap file.
|
||||
|
||||
Finally the first entry defined is not used as a command button but for wmmenu
|
||||
itself. The <pixmap> of this first entry is used as dockapp icon, and in the
|
||||
future it's <command> will be used as title appearing in WindowMaker's dockapp
|
||||
balloon.
|
||||
|
||||
STATUS
|
||||
------
|
||||
|
||||
1.2 2002/05/04
|
||||
|
||||
(Thanks to Daniel Déchelotte for many bug fixes, patches and
|
||||
suggestions)
|
||||
|
||||
New behaviour:
|
||||
- also show the bar when entering the dockapp's tile. Hide it
|
||||
after cursor has left all wmmenu windows (bar, icon or tile).
|
||||
- as a side effect, "oldleaving" option has been removed.
|
||||
|
||||
Corrections:
|
||||
- remove flicker when cursor goes from icon/tile to bar and
|
||||
vice-versa.
|
||||
- forgot to remove highlight pixmap when cursor leaves bar with
|
||||
"-O click" behaviour.
|
||||
- fixed "garbaged" highlight effects after menu file changes
|
||||
- don't paint highlight pixmap on empty bar slots (those can occur
|
||||
when spreading menu entries over several rows).
|
||||
- don't crash when WM terminates (or changes). Gracefully handles
|
||||
dock-less WM. (useful when I try new WMs)
|
||||
- some updates to README (and warnings about libdockapp)
|
||||
|
||||
1.1 2002/04/14
|
||||
|
||||
New feature:
|
||||
- the tile can now be specified by the value returned by an
|
||||
external command. A sample script, extract_icon_back, is
|
||||
provided to get the icon pixmap used by WindowMaker.
|
||||
NB: this command is only used once at startup.
|
||||
|
||||
Correction:
|
||||
- default tile pixmap is now also used when no tile pixmap is
|
||||
specified at all (or an empty one).
|
||||
|
||||
1.0 2002/03/23
|
||||
|
||||
New feature: if you want to use a highlight pixmap that's designed
|
||||
to cover most of tile's surface, current highlighting is not
|
||||
adequate, because the highlight pixmap is drawn OVER other pixmaps.
|
||||
A new drawing mechanism has been added to draw it BEHIND other menu
|
||||
icons.
|
||||
|
||||
Added option "-O behind" to trigger this behaviour.
|
||||
Also added "highlight_behind" directive in the defaults file, which
|
||||
also triggers this behaviour.
|
||||
Updated the sample defaults file.
|
||||
Updated man page to reflect changes (have a look at it for details).
|
||||
|
||||
Corrections:
|
||||
- Disable autoscaling of the dockapp icon (didn't scale to the
|
||||
appropriate size), until someone tells me how wmmenu/libdockapp
|
||||
is supposed to work in case it's too big.
|
||||
(reported by Daniel Déchelotte)
|
||||
|
||||
NB: gdk-pixbuf 2.0 (provided with Gtk+ 2.0) is currently not
|
||||
compatible with wmmenu (see REQUIREMENTS section).
|
||||
|
||||
0.9 2001/10/20
|
||||
|
||||
When using the gdk-pixbuf enabled version, pixmaps larger than tile
|
||||
(either the tile pixmap itself, or the size specified on command
|
||||
line) are automatically scaled to fit within the requested size.
|
||||
This affects the dock icon, tile, highlight and application icons.
|
||||
If you like pixmaps overriding each other (gasp!), this can be
|
||||
disabled with "-O noautoscale".
|
||||
|
||||
Through the "highlight" feature you can set a pixmap, that is drawn
|
||||
over the menu item currently designated by the pointer, and that
|
||||
follows it. This allows one to know for sure, which item will be
|
||||
launched if clicked. A pixmap "target-white.xpm" is provided as a
|
||||
sample: try adding its path after "-l" option on your wmmenu's
|
||||
command line.
|
||||
|
||||
Pixmap file names and xpmpath elements accept "~/" at their
|
||||
beginning, to refer to your home directory (this was suggested a
|
||||
long time ago).
|
||||
|
||||
I have written a man page (thanks to manedit).
|
||||
|
||||
0.8 2001/06/16
|
||||
|
||||
Speedup startup by providing a different color allocation routine
|
||||
to gdk-pixbuf. (Startup speedup is observed with gdk-pixbuf;
|
||||
Patch from Lukasz Pankowski)
|
||||
|
||||
0.7 2001/04/21
|
||||
|
||||
Integrated "multi-rows" patch from Lukasz Pankowski: icons can be
|
||||
arranged in multiple rows on the button bar. For this you have to
|
||||
specify "-r ROWS" on command line.
|
||||
|
||||
0.6 2001/03/24
|
||||
|
||||
Added click-only behavior with "-O click" option.
|
||||
(Thanks to Matthew Gabeler-Lee for his patch)
|
||||
|
||||
0.5 2001/02/03
|
||||
|
||||
The button bar is now hidden when the cursor leaves the dockapp
|
||||
tile, and not only when it leaves the button bar (behavior
|
||||
suggested by Guido Falsi).
|
||||
|
||||
I added an option the get the previous behavior. Please report
|
||||
whether you need it, else it will disappear in next releases since
|
||||
I consider the new behavior to be more user firendly.
|
||||
|
||||
0.4 2000/12/30
|
||||
|
||||
Simplify gdk-pixbuf selection as build option in Makefile.
|
||||
|
||||
New feature: automatic menu reloading on menu file change.
|
||||
Default icons are used for app and tile when specified pixmap is not
|
||||
found or not loadable (helps to not exit prematurely when doing
|
||||
changes).
|
||||
|
||||
0.3 2000/11/01
|
||||
|
||||
Optionally (choice made at compile-time) use gdk-pixbuf(-xlib) to load
|
||||
images. This provides loading ability for many image types: BMP, GIF,
|
||||
ICO, JPEG, PNG, PNM, RAS, TIFF and XPM (on my host at least). Don't
|
||||
forget that transparency is not available with BMP, PNM and (?) RAS.
|
||||
|
||||
Caveat: may not work very well on pseudo-color displays (not tested)
|
||||
because of bad (blind) color allocation strategy. This was already
|
||||
the case with libXpm, so it's not a so great change.
|
||||
|
||||
0.2 2000/08/05
|
||||
|
||||
install target in Makefile.
|
||||
Accept multiple xpmpath specifications in defaults file, they are
|
||||
appended to each other.
|
||||
More documentation (and more explicit on usage).
|
||||
Missing Xext link library on some systems.
|
||||
|
||||
0.1 2000/06/25
|
||||
|
||||
First public release.
|
||||
|
||||
COPYRIGHT
|
||||
---------
|
||||
|
||||
This software is copyright (c)2000 F.COUTANT, and is placed under the GNU
|
||||
General Public License (GPL), which is given in the file COPYING.
|
||||
|
||||
E-mail: fcoutant@freesurf.fr
|
||||
|
10
wmmenu/TODO
Normal file
10
wmmenu/TODO
Normal file
|
@ -0,0 +1,10 @@
|
|||
* Horizontal/Vertical bar on option
|
||||
* Animations !
|
||||
* Solidify parsers
|
||||
|
||||
External suggestions
|
||||
--------------------
|
||||
|
||||
From: Benoît Smith <bensmith@club-internet.fr>
|
||||
- drop app into the bar directly like in the dock
|
||||
|
241
wmmenu/buttonbar.c
Normal file
241
wmmenu/buttonbar.c
Normal file
|
@ -0,0 +1,241 @@
|
|||
#include <assert.h>
|
||||
|
||||
#include <dockapp.h>
|
||||
|
||||
#include "buttonbar.h"
|
||||
#include "xobjects.h"
|
||||
#include "pixmaps.h"
|
||||
#include "options.h"
|
||||
#include "menu.h"
|
||||
|
||||
/* item number for last known highlight position */
|
||||
static int OldPos = -1 ;
|
||||
/* Graphic context used to draw highlight */
|
||||
static GC HighlightGC = 0 ;
|
||||
/* position where bar will be shown next time */
|
||||
static int BarX=0, BarY=0 ;
|
||||
|
||||
extern void ButtonBar_Build (void)
|
||||
{
|
||||
int i, n ;
|
||||
int h, j, w ;
|
||||
int width, height ;
|
||||
GC imgOp ;
|
||||
GC maskOp ;
|
||||
XGCValues gc ;
|
||||
Pixmap image, mask ;
|
||||
int x, y ;
|
||||
int x0, y0 ;
|
||||
XSetWindowAttributes wa ;
|
||||
|
||||
n = Menu_GetNbEntries () ;
|
||||
assert (n > 0) ;
|
||||
h = Menu_GetNbRows () ;
|
||||
w = Menu_GetNbColumns () ;
|
||||
width = TileXSize * w ;
|
||||
height = TileYSize * h ;
|
||||
|
||||
|
||||
ButtonBarWindow = XCreateSimpleWindow (
|
||||
DADisplay, DefaultRootWindow (DADisplay), 0, 0, width, height, 0,
|
||||
BlackPixel (DADisplay, DefaultScreen (DADisplay)),
|
||||
BlackPixel (DADisplay, DefaultScreen (DADisplay))) ;
|
||||
ButtonBarImage = XCreatePixmap (DADisplay, ButtonBarWindow,
|
||||
width, height, DADepth) ;
|
||||
imgOp = XCreateGC (DADisplay, ButtonBarWindow, 0, & gc) ;
|
||||
|
||||
HighlightBehindMask = XCreatePixmap (DADisplay, ButtonBarWindow,
|
||||
width, height, 1) ;
|
||||
maskOp = XCreateGC (DADisplay, HighlightBehindMask, 0, & gc) ;
|
||||
|
||||
/* first apply tile to whole bar */
|
||||
for (i=0; i<w; i++)
|
||||
for (j=0; j<h; j++)
|
||||
XCopyArea (DADisplay, TileImage, ButtonBarImage, imgOp, 0, 0,
|
||||
TileXSize, TileYSize, TileXSize*i, TileYSize*j) ;
|
||||
|
||||
/* initialize "behind" mask to all 1's */
|
||||
XSetFunction (DADisplay, maskOp, GXset) ;
|
||||
XFillRectangle (DADisplay, HighlightBehindMask, maskOp,
|
||||
0, 0, width, height) ;
|
||||
/* and copy behind mask cells from highlight mask */
|
||||
if (HighlightMask != 0)
|
||||
{
|
||||
XSetFunction (DADisplay, maskOp, GXcopy) ;
|
||||
for (i=0; i<w; i++)
|
||||
for (j=0; j<h; j++)
|
||||
XCopyArea (DADisplay, HighlightMask, HighlightBehindMask,
|
||||
maskOp,
|
||||
0, 0, TileXSize, TileYSize, TileXSize*i, TileYSize*j) ;
|
||||
}
|
||||
|
||||
/* then apply each pixmap of menu entry */
|
||||
/* and build a global invert mask for highlight "behind" */
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
Pixmaps_FindLoad (Menu_GetEntryPixmap (i),
|
||||
& image, & mask, & width, & height) ;
|
||||
|
||||
/* center pixmap within its cell */
|
||||
x = (width >= TileXSize ? 0 : (TileXSize-width)/2) ;
|
||||
y = (height >= TileYSize ? 0 : (TileYSize-height)/2) ;
|
||||
|
||||
/* use GC to draw with pixmap's mask in the right cell */
|
||||
x0 = TileXSize*(i/h) ;
|
||||
y0 = TileYSize*(i%h) ;
|
||||
gc.clip_x_origin = x0 + x ;
|
||||
gc.clip_y_origin = y0 + y ;
|
||||
gc.clip_mask = mask ; /* may be None */
|
||||
XChangeGC (DADisplay, imgOp,
|
||||
GCClipXOrigin | GCClipYOrigin | GCClipMask, & gc) ;
|
||||
XCopyArea (DADisplay, image, ButtonBarImage, imgOp, 0, 0,
|
||||
width, height, gc.clip_x_origin, gc.clip_y_origin) ;
|
||||
|
||||
/* update highlight behind mask: cell &= ~iconmask */
|
||||
if (HighlightBehind && mask != None)
|
||||
{
|
||||
/* use "andInverted" (dst &= ~src) */
|
||||
XSetFunction (DADisplay, maskOp, GXandInverted) ;
|
||||
XCopyArea (DADisplay, mask, HighlightBehindMask, maskOp,
|
||||
0, 0, width, height, gc.clip_x_origin, gc.clip_y_origin) ;
|
||||
}
|
||||
/* or highlight behind cell &= 0 if no mask */
|
||||
else
|
||||
if (HighlightBehind && mask == None)
|
||||
{
|
||||
XSetFunction (DADisplay, maskOp, GXclear) ;
|
||||
XFillRectangle (DADisplay, HighlightBehindMask, maskOp,
|
||||
gc.clip_x_origin, gc.clip_y_origin, width, height) ;
|
||||
}
|
||||
|
||||
XFreePixmap (DADisplay, image) ;
|
||||
if (mask != 0) XFreePixmap (DADisplay, mask) ;
|
||||
}
|
||||
|
||||
XFreeGC (DADisplay, imgOp) ;
|
||||
XFreeGC (DADisplay, maskOp) ;
|
||||
|
||||
wa.background_pixmap = ButtonBarImage ;
|
||||
wa.event_mask = ButtonPressMask | ButtonReleaseMask ;
|
||||
if (! ClickOnly) wa.event_mask |= EnterWindowMask | LeaveWindowMask ;
|
||||
if (HighlightImage != 0) wa.event_mask |= PointerMotionMask ;
|
||||
wa.override_redirect = True ;
|
||||
XChangeWindowAttributes (DADisplay, ButtonBarWindow,
|
||||
CWBackPixmap | CWEventMask | CWOverrideRedirect, & wa) ;
|
||||
}
|
||||
|
||||
extern void ButtonBar_SetPositionFromDockApp (int dockx, int docky,
|
||||
int dockw, int dockh)
|
||||
{
|
||||
int xMid, scrWidth, h, scrHeight ;
|
||||
int x, y ;
|
||||
|
||||
/* compute y */
|
||||
scrHeight = DisplayHeight (DADisplay, DefaultScreen (DADisplay)) ;
|
||||
y = docky ;
|
||||
h = TileYSize * Menu_GetNbRows () ;
|
||||
if (y + h >= scrHeight)
|
||||
{
|
||||
y = scrHeight - h ;
|
||||
}
|
||||
|
||||
/* compute x */
|
||||
scrWidth = DisplayWidth (DADisplay, DefaultScreen (DADisplay)) ;
|
||||
xMid = dockx + dockw/2 ;
|
||||
if (xMid*2 < scrWidth)
|
||||
{
|
||||
/* we are rather on left, expand to right */
|
||||
x = dockx + dockw ;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* we are rather on right, expand to left */
|
||||
x = dockx - TileXSize * Menu_GetNbColumns () ;
|
||||
}
|
||||
|
||||
BarX = x ;
|
||||
BarY = y ;
|
||||
}
|
||||
|
||||
extern void ButtonBar_Show (void)
|
||||
{
|
||||
XMoveWindow (DADisplay, ButtonBarWindow, BarX, BarY) ;
|
||||
XMapRaised (DADisplay, ButtonBarWindow) ;
|
||||
}
|
||||
|
||||
static void BuildHighlightGC (void)
|
||||
{
|
||||
XGCValues gc ;
|
||||
gc.clip_mask = HighlightBehindMask ;
|
||||
HighlightGC = XCreateGC (DADisplay, DAWindow,
|
||||
GCClipMask, & gc) ;
|
||||
}
|
||||
|
||||
extern void ButtonBar_Highlight (int col, int row)
|
||||
{
|
||||
int h ;
|
||||
int newPos ;
|
||||
|
||||
if (HighlightImage == 0) return ;
|
||||
|
||||
h = Menu_GetNbRows () ;
|
||||
newPos = col*h + row ;
|
||||
|
||||
if (newPos != OldPos)
|
||||
{
|
||||
int x, y ;
|
||||
XGCValues gc ;
|
||||
|
||||
/* first clear old highlight position */
|
||||
ButtonBar_Unhighlight () ;
|
||||
|
||||
/* don't draw highlight on empty slots */
|
||||
if (newPos >= Menu_GetNbEntries ()) return ;
|
||||
|
||||
/* compute new draw position */
|
||||
x = col * TileXSize ;
|
||||
y = row * TileYSize ;
|
||||
/* and draw it */
|
||||
if (HighlightGC == 0) BuildHighlightGC () ;
|
||||
gc.clip_x_origin = HighlightBehind ? 0 : x ;
|
||||
gc.clip_y_origin = HighlightBehind ? 0 : y ;
|
||||
XChangeGC (DADisplay, HighlightGC,
|
||||
GCClipXOrigin | GCClipYOrigin, & gc) ;
|
||||
XCopyArea (DADisplay, HighlightImage, ButtonBarWindow,
|
||||
HighlightGC, 0, 0, TileXSize, TileYSize, x, y) ;
|
||||
|
||||
OldPos = newPos ;
|
||||
}
|
||||
}
|
||||
|
||||
extern void ButtonBar_Unhighlight (void)
|
||||
{
|
||||
int x, y, h ;
|
||||
|
||||
if (HighlightImage == 0 || OldPos < 0) return ;
|
||||
|
||||
h = Menu_GetNbRows () ;
|
||||
x = (OldPos / h) * TileXSize ;
|
||||
y = (OldPos % h) * TileYSize ;
|
||||
XClearArea (DADisplay, ButtonBarWindow,
|
||||
x, y, TileXSize, TileYSize, False) ;
|
||||
OldPos = -1 ;
|
||||
}
|
||||
|
||||
extern void ButtonBar_Hide (void)
|
||||
{
|
||||
XUnmapWindow (DADisplay, ButtonBarWindow) ;
|
||||
OldPos = -1 ;
|
||||
}
|
||||
|
||||
extern void ButtonBar_Rebuild (void)
|
||||
{
|
||||
XDestroyWindow (DADisplay, ButtonBarWindow) ;
|
||||
if (HighlightGC != 0)
|
||||
{
|
||||
XFreeGC (DADisplay, HighlightGC) ;
|
||||
HighlightGC = 0 ;
|
||||
}
|
||||
OldPos = -1 ;
|
||||
ButtonBar_Build () ;
|
||||
}
|
12
wmmenu/buttonbar.h
Normal file
12
wmmenu/buttonbar.h
Normal file
|
@ -0,0 +1,12 @@
|
|||
#ifndef buttonbar_h_
|
||||
#define buttonbar_h_
|
||||
|
||||
extern void ButtonBar_Build (void) ;
|
||||
extern void ButtonBar_SetPositionFromDockApp (int x, int y, int w, int h) ;
|
||||
extern void ButtonBar_Show (void) ;
|
||||
extern void ButtonBar_Highlight (int col, int row) ;
|
||||
extern void ButtonBar_Unhighlight (void) ;
|
||||
extern void ButtonBar_Hide (void) ;
|
||||
extern void ButtonBar_Rebuild (void) ;
|
||||
|
||||
#endif /* buttonbar_h_ */
|
302
wmmenu/defaultIcon.xpm
Normal file
302
wmmenu/defaultIcon.xpm
Normal file
|
@ -0,0 +1,302 @@
|
|||
/* XPM */
|
||||
static char *defaultIcon_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 43 48 247 2",
|
||||
/* colors */
|
||||
".. c #040204",
|
||||
".# c #44863c",
|
||||
".a c #34420c",
|
||||
".b c #58c404",
|
||||
".c c #746a0c",
|
||||
".d c #0f2217",
|
||||
".e c #476a3f",
|
||||
".f c #343204",
|
||||
".g c #aecc04",
|
||||
".h c #344454",
|
||||
".i c #a08a04",
|
||||
".j c #1c223c",
|
||||
".k c #c4c6ac",
|
||||
".l c #54591b",
|
||||
".m c #9c9c9e",
|
||||
".n c #3c562c",
|
||||
".o c #4caa24",
|
||||
".p c #446e4c",
|
||||
".q c #2c3516",
|
||||
".r c #3c433a",
|
||||
".s c #8ac604",
|
||||
".t c #3c5460",
|
||||
".u c #0c131a",
|
||||
".v c #74881c",
|
||||
".w c #343949",
|
||||
".x c #242304",
|
||||
".y c #eac404",
|
||||
".z c #dce6ec",
|
||||
".A c #243245",
|
||||
".B c #acaeac",
|
||||
".C c #141304",
|
||||
".D c #c1a604",
|
||||
".E c #7c838c",
|
||||
".F c #5c6254",
|
||||
".G c #444649",
|
||||
".H c #447c44",
|
||||
".I c #7ce404",
|
||||
".J c #0c2226",
|
||||
".K c #543e34",
|
||||
".L c #545655",
|
||||
".M c #646e7c",
|
||||
".N c #c8ce04",
|
||||
".O c #3c427c",
|
||||
".P c #ccd2d8",
|
||||
".Q c #5cda04",
|
||||
".R c #141524",
|
||||
".S c #8c929c",
|
||||
".T c #44490d",
|
||||
".U c #846654",
|
||||
".V c #b4ba9c",
|
||||
".W c #343c68",
|
||||
".X c #e0d804",
|
||||
".Y c #243254",
|
||||
".Z c #5c636c",
|
||||
".0 c #242627",
|
||||
".1 c #1c2531",
|
||||
".2 c #444a54",
|
||||
".3 c #1c2b3d",
|
||||
".4 c #9cc204",
|
||||
".5 c #f4f4f4",
|
||||
".6 c #040a0b",
|
||||
".7 c #6c8514",
|
||||
".8 c #3c4a34",
|
||||
".9 c #647e14",
|
||||
"#. c #848b91",
|
||||
"## c #ac8664",
|
||||
"#a c #bcc2cc",
|
||||
"#b c #9ca6ac",
|
||||
"#c c #3c5248",
|
||||
"#d c #445878",
|
||||
"#e c #1a1b04",
|
||||
"#f c #484e10",
|
||||
"#g c #b0df04",
|
||||
"#h c #b49604",
|
||||
"#i c #363e46",
|
||||
"#j c #444d34",
|
||||
"#k c #545a61",
|
||||
"#l c #c8db04",
|
||||
"#m c #60e904",
|
||||
"#n c #a47e64",
|
||||
"#o c #6c6a6c",
|
||||
"#p c #040a14",
|
||||
"#q c #69c304",
|
||||
"#r c #69630c",
|
||||
"#s c #7ca21c",
|
||||
"#t c #2c3a1c",
|
||||
"#u c #ececed",
|
||||
"#v c #d4dadc",
|
||||
"#w c #747981",
|
||||
"#x c #b4bbbf",
|
||||
"#y c #383e28",
|
||||
"#z c #fcd404",
|
||||
"#A c #646a6f",
|
||||
"#B c #242c2c",
|
||||
"#C c #2c2e4f",
|
||||
"#D c #70e904",
|
||||
"#E c #84770c",
|
||||
"#F c #3c4d59",
|
||||
"#G c #9e9e06",
|
||||
"#H c #544a44",
|
||||
"#I c #9ca2a8",
|
||||
"#J c #34464c",
|
||||
"#K c #8ecb04",
|
||||
"#L c #445e64",
|
||||
"#M c #041c15",
|
||||
"#N c #bcb6b4",
|
||||
"#O c #a0dd04",
|
||||
"#P c #343e11",
|
||||
"#Q c #141c25",
|
||||
"#R c #1c2a33",
|
||||
"#S c #dabb04",
|
||||
"#T c #64921c",
|
||||
"#U c #747e84",
|
||||
"#V c #3c4722",
|
||||
"#W c #4c545d",
|
||||
"#X c #f5cb04",
|
||||
"#Y c #2c364c",
|
||||
"#Z c #acb0b5",
|
||||
"#0 c #142a34",
|
||||
"#1 c #949ca0",
|
||||
"#2 c #2c3a5e",
|
||||
"#3 c #646664",
|
||||
"#4 c #242c3f",
|
||||
"#5 c #6c7a24",
|
||||
"#6 c #919e0c",
|
||||
"#7 c #69b904",
|
||||
"#8 c #747637",
|
||||
"#9 c #948a04",
|
||||
"a. c #499a21",
|
||||
"a# c #52d104",
|
||||
"aa c #64d604",
|
||||
"ab c #545644",
|
||||
"ac c #5c622c",
|
||||
"ad c #a4d004",
|
||||
"ae c #8ca60c",
|
||||
"af c #5cb604",
|
||||
"ag c #1b2d14",
|
||||
"ah c #444a8c",
|
||||
"ai c #342a24",
|
||||
"aj c #54782c",
|
||||
"ak c #c4ccd0",
|
||||
"al c #3c5e3c",
|
||||
"am c #646a2c",
|
||||
"an c #dcce04",
|
||||
"ao c #bcb204",
|
||||
"ap c #c4a204",
|
||||
"aq c #2c2c04",
|
||||
"ar c #645e0c",
|
||||
"as c #5c7830",
|
||||
"at c #4c522c",
|
||||
"au c #ac9604",
|
||||
"av c #fcfafb",
|
||||
"aw c #1c2204",
|
||||
"ax c #ac9204",
|
||||
"ay c #446667",
|
||||
"az c #d4d604",
|
||||
"aA c #ecd404",
|
||||
"aB c #bcdd04",
|
||||
"aC c #3c4374",
|
||||
"aD c #384d4a",
|
||||
"aE c #4c5a3c",
|
||||
"aF c #6c7684",
|
||||
"aG c #6c8a14",
|
||||
"aH c #2c322f",
|
||||
"aI c #94c404",
|
||||
"aJ c #cca904",
|
||||
"aK c #d4da04",
|
||||
"aL c #e4bd04",
|
||||
"aM c #748e0c",
|
||||
"aN c #646a54",
|
||||
"aO c #545e3c",
|
||||
"aP c #74d604",
|
||||
"aQ c #ccb204",
|
||||
"aR c #39393b",
|
||||
"aS c #181c1c",
|
||||
"aT c #474b4c",
|
||||
"aU c #242e18",
|
||||
"aV c #ccceb4",
|
||||
"aW c #484e55",
|
||||
"aX c #8c7e04",
|
||||
"aY c #b4b6b6",
|
||||
"aZ c #5e7e2c",
|
||||
"a0 c #7c720c",
|
||||
"a1 c #b4d204",
|
||||
"a2 c #c7d604",
|
||||
"a3 c #a4ca04",
|
||||
"a4 c #dbb604",
|
||||
"a5 c #445e6c",
|
||||
"a6 c #444e20",
|
||||
"a7 c #373e59",
|
||||
"a8 c #62ee04",
|
||||
"a9 c #74aa1c",
|
||||
"b. c #383e3c",
|
||||
"b# c #a3e204",
|
||||
"ba c #4cd604",
|
||||
"bb c #9fd604",
|
||||
"bc c #343234",
|
||||
"bd c #648a2c",
|
||||
"be c #141519",
|
||||
"bf c #2c3b34",
|
||||
"bg c #3c4264",
|
||||
"bh c #5c560c",
|
||||
"bi c #e4e4e4",
|
||||
"bj c #b4b29c",
|
||||
"bk c #84868d",
|
||||
"bl c #14252f",
|
||||
"bm c #6c7278",
|
||||
"bn c #3c3a04",
|
||||
"bo c #949699",
|
||||
"bp c #3c3e71",
|
||||
"bq c #8c8e9a",
|
||||
"br c #a4a7a6",
|
||||
"bs c #5c5d60",
|
||||
"bt c #dcdede",
|
||||
"bu c #bcbcbc",
|
||||
"bv c #1c1e33",
|
||||
"bw c #445d41",
|
||||
"bx c #7cea04",
|
||||
"by c #64625c",
|
||||
"bz c #a4a2a3",
|
||||
"bA c #3c3e06",
|
||||
"bB c #7c7e85",
|
||||
"bC c #5c5e4c",
|
||||
"bD c #3c440a",
|
||||
"bE c #24253e",
|
||||
"bF c #cccab0",
|
||||
"bG c #445a28",
|
||||
"bH c #445264",
|
||||
"bI c #444683",
|
||||
"bJ c #d4d3d4",
|
||||
"bK c #4c4a0f",
|
||||
"bL c #bcbea4",
|
||||
"bM c #2c3658",
|
||||
"bN c #0c0c08",
|
||||
"bO c #c4c4c4",
|
||||
"bP c #4c4e3c",
|
||||
"bQ c #0c0d14",
|
||||
"bR c #f4eeec",
|
||||
"bS c #2c2c32",
|
||||
"bT c #8c7a04",
|
||||
"bU c #3c4349",
|
||||
"bV c #0c1e1a",
|
||||
"bW c #6c9520",
|
||||
"bX c #4c4b8e",
|
||||
"bY c #cccdcc",
|
||||
"bZ c #6c6e34",
|
||||
"b0 c #647a2c",
|
||||
/* pixels */
|
||||
".....................6bN.x#M#M#M#M#M#M#M#M#M#M#M#M#M#M#M.6bNbN........................",
|
||||
"...................C#P#M#M#MbVagagagagagagagagagagagbVbVbV.J.q#e.C....................",
|
||||
"...............Caw.a#M#MaU.q#P.Da4a4a4a4a4a4a4a4a4aJ.T#t.q.Jbl.J#V#e..................",
|
||||
"............#ebD#M#M#M.q#h#SaL#X#z#z#z#z#z#z#z#z#z#X.y#S.D#V#ybl#0#V#e................",
|
||||
"...........CbD#M#M.q.T#h#X#z#z#z#X#X.y#X.y#X#X#X#z#z#zaAaA#S#G#V.3.3a6aw..............",
|
||||
"..........bD#M#M.q.iaL#X#z#X#Xa4aXbTbTbTbTbTbTapaLaA#zaAaA.Xan#G.8.3.A#faw............",
|
||||
"........#ebD#M#t.i.y#z#z#zaLbTar#M#M#M#M#M#MbVbKa0aQanaA.X.X.X.N#G#j.A.Y.T............",
|
||||
"#8#8#8bZac#MbV#raL#z#z#z.y.cbV#M#M#MaSaSblbV#MbV.J#9an.X.X.X.Xaz.N#6#j.Yatbh.l.l.l.l.l",
|
||||
"#u#ubiaYaD#M#Pax#X#z#z#za4ag#M#Mbl.1bc.raTaT#i#0.J#faoan.XaK#l#l#l.g#5bMbM.M.m#Z#Z#Zbs",
|
||||
".zbibt.S#M#MaraL#z#z#z#za4ag#MbVbS.G#3bkbobzbqbUblbl#GazazaKaK#la2a1.7bMbM#AaYbtbibi#W",
|
||||
"bt#v.MaT#M#Pau#X#z#z#z#z#X#EbVbVbS.LbB.m.B#xaYbkbfbl#Gaz#laK#l#l#la1aeaEbMbs#Zbi.5.5#W",
|
||||
"#vbY.AblbV#fa4#X#z#z#z#z#XaQbV#Mbc#3bq.m#Z#xbu#Z#Fbl#6.N#l#l#laBaBaBadb0.WaWbzbiavav#W",
|
||||
"#vbY.L#i#Maw#E#X#z#z#z#z#za4bV#MbN.1.0#BbSaHbcaH#R#R#6a2#l#laBaB#g#gadb0#2bEbmbY.5.5aW",
|
||||
".PbJ.ZaT#M#Mar.y#z#z#z#z#zapbVbV.6#Q.1#B.3#4#R.jbl.3#6#l#laBaB#g#g#gaIas.W.RbybObiavaW",
|
||||
"akbJ#3.Lbf#Mbha4#X#z#z#XaJ.q#M#MbN#Q.3.A.A.A#4#R.3.3#6a1aB#g#g#g#gbbbW.W.W#Q#3bObR.5aT",
|
||||
"bObJbybybU#M.d#raJa4a4ap#t#M#M#M#p#Q#4.A.A#4.3bl.3.3ae#gaB#g#g#g#Obbbd.Wbp.RbsbO#u.5aW",
|
||||
"#abJ#3.Z.rbV#M#M#M#M#M#M#MbV#MbNbQ.1#C#Y#4.1#0.3.AaM.g#g#g#g#gb#b#.sajbpbE.6#3bO#u.5aT",
|
||||
"#xbJ#3bybsaR#MbV#MbV#MbV#M#M.6ai.K.U###n#H.3#0aH.v.g#g#g#g#gb##O.sasbp.WbEbN#obJbR.5aT",
|
||||
"#xbJ#3by#3.r.u#4.j#QbQbQbNbQbQbNbQ.ube#Qbl.3.AaGa3#g#g#g#gb#b#.sajbg.W.WbE.6bBbtbR.5.2",
|
||||
"#Z.P#3by#3.rbl.A#4#R.j#Q.R#Q#Q.u.u#Q#Q.3#0bf.7a3#g#g#gb#b##O.saZ.Wbp.WbEbebN#.#u.5.5.2",
|
||||
"#ZbJ#3by#3bU#Q#Y.A.A#4#4.3#4.3#Q#Q#Qbl#0bf.9a3#g#g#gb##Obb.saZ.hbp#2.jbQ.0bQ.mbR.5.5.G",
|
||||
"brbJ#3by#o.r#Q.A#Y.A.A#Y.A.A#C#Q#Q#Qblbf.9a3#g#gb##Obb#KbWaj.Wbp.Wbv#paSaRbebz.5.5.5.G",
|
||||
"#bbJ.Z#3by.G#Q#Y#4#Y.A#Y.A#Y.A#Q#Qbl.3bG.4#g#g#Obb#K#Taj.h.W.W#2.j#pbQ.0aTaSbr.5.5.5.G",
|
||||
"#IbJby#3#3b.#Q#Y.A.A#Y.A#Y.A#Y#Q#Q.3bfaGad#g#OadbWaj.h#2.W.W.jbvbQ.u.RaRbC.0bz.5.5avbU",
|
||||
"#1bJ#3by#3.G#Q.A.A#Y.A#Y.A#Y.A#Q#Q.3.naI#gb#bb#T#JbM.W.Wbvbv#p.u.ubv.1.2by.0bz.5.5.5.G",
|
||||
".SbJ#3#3#3b.#Q.A#Y.A#Y.A#Y.A#Y#Q#Q.3bGaIb#b##K.ebM.Wbv#Q.6#p.R#Q.j.3#4.2#3.0bz.5.5.5bU",
|
||||
".SbJ#3by#3.G#Q#Y#4#Y.A#Y.A#Y#4#Q#Q.3aD#s#K#Ka9bw.W#Q#p..#pbQ.1#4#4.A.A.2#3.0bz.5.5.5.G",
|
||||
"#.bJ#3#3#3b.#Q#Y.A.A#Y.A#Y.A#Y#Q.R.A#YaDbGbw#c.W.W.u..bQ.u#Q.A.A.A.A#C.2#3.0bz.5.5.5bU",
|
||||
"bkbJ#3by#3.G#Q.A.A#Y.A#Y.A#Y.A#Q#Q.Y.A.YbMbM#2.W.WbQ#pbQ.R#Q.A.A#Y.A.AbM.w.RbzbR.5.5.G",
|
||||
".EbJ#3by#ob.#Q.A#Y.A#Y.AbM.A#Y#Q.Rbv.WbMbMbM.W.Wbv.6bQ.u#QbvbM.A.A.A#Y.A#Ybebz.5bR.5bU",
|
||||
"#UbJ#3.Zby.G#Q#Y.A#Y.A#Y.A#Y.A#Q#Q.Y.YbMbMbM.W.W.WbQbQ.R#Q#Q#Y#4#Y.A.A#4.A.ubzbRbR.5.G",
|
||||
"#wbJ#3by#3b.#Q#Y.A.A#Y.A#Y.A#Y.R.AbMbMbMbM.W.W.Wbpbp#Q.R#Q#Q#Y.A.A.A.A#Y.Abe.m.5#u.5.2",
|
||||
"#wbJ#3#3#3.G#Q#Y#Y#Y#Y#Y#Y#Y.A.1bMbMal#7#q#qaf.e.Obp.O#4.A.A#Y.A.A#C.A.A.A.ubz#ubR.5aT",
|
||||
"aFbJ#3by#3b.bc#3by#3#3#3#3#3.LbM.YaD#7.Ibx.I#D.b.p.ObI#4.A.A#Y.A.A#4#Y.A#Y.ubz#u#u.5aW",
|
||||
"#wbJ#3#3#3.G#B.L#H.L.L.L.L.LaTbM#2.eaP.Ibx#D#D#D.b#LbIbIbv.1#4.j#4.3.1bE.1bQbz#u.5bRaW",
|
||||
"#w.P.L#k.LaRbQbQbQbQbe.R.0bS.0bMaD#7.I#D#D#D#D#ma##LbIahaSbcaRaRaRaRaRaRaRaRaY.5.5.5.G",
|
||||
"#wbY.A.A#Y.A.A#Ya7#FbH#k.Z.M.ZbMaD#q#D#D#Da8a8a8a#aybXbX#obY.5avavavavavavavavavavavbU",
|
||||
"#wbJaF.MbmbmaFaFaFbB.E#.bq.SbB#2.ha.aa#D#Da8#m#ma#ayahbpbs#Nbi.5bR.5.5.5.5.5.5bR.5.5bU",
|
||||
"#wbibibibibibibibibibibibibibu.W.W#Fa..Q#ma8#mbaa.#dbXbS.Lbr#vbibibibibibibibibibibibU",
|
||||
"#W.Sbqbqbqbqbqbqbq.Sbq.S.SbqbB.Y.Wbp#Fa.baa#.o.##dbXbXaS.w#3bkbqbq#.bqbq#.bqbq#.bqbq.w",
|
||||
".T.T.T.T.T.T.T.TaO#k#W#W#WbH.2#ia7.WaC.t.H.Ha5bIahbX#CbQbQ#Q.1.1.1.1#V.T.T.T.T.T.T.T#f",
|
||||
"................ambB#wbs#A.Zbs#k.Ga7.ObpbIbIbIbX#C.j#p#p.u#Q#Q#Q.J#Q.T................",
|
||||
"................aq.T.TbD#o.Zbs#kaW.Ga7.w#CbE.j.jbQ#pbNbQ.u#Q#BbAbnbnaq................",
|
||||
"........................aN.Z#k.GaW.GbU.wbS.1#QbQbQbQbQ.RbV#QaU........................",
|
||||
"........................aq.f.fbA#w.M#k.G#Y.1aS.u.R.ubVbnaqaqaq........................",
|
||||
"..............................#ebkbm#kaTaR.1#Q#QbV#Q#Q.C..............................",
|
||||
".......faV.kaVbF.kaVbF.k.kbL.VbjaY.B#I#1bq.EbB#wbm#A.ZaN.FaOabbP#j.r#y#taH#y#jaq......",
|
||||
"......bDbibibibibibibibibibibibibtbJbYbY#abuaY.Bbz.mbobq#.bB#wbm#A.Z#k#WaTaTbU.f......"
|
||||
};
|
197
wmmenu/defaultTile.xpm
Normal file
197
wmmenu/defaultTile.xpm
Normal file
|
@ -0,0 +1,197 @@
|
|||
/* XPM */
|
||||
static char * defaultTile_xpm[] = {
|
||||
"64 64 130 2",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #A7A7A7A7B2B2",
|
||||
"X c #A6A6A6A6B2B2",
|
||||
"o c #A6A6A6A6B1B1",
|
||||
"O c #A5A5A5A5B0B0",
|
||||
"+ c #A4A4A4A4B0B0",
|
||||
"@ c #A4A4A4A4AFAF",
|
||||
"# c #A3A3A3A3AFAF",
|
||||
"$ c #A3A3A3A3AEAE",
|
||||
"% c #A2A2A2A2AEAE",
|
||||
"& c #A1A1A1A1ADAD",
|
||||
"* c #A1A1A1A1ACAC",
|
||||
"= c #A0A0A0A0ACAC",
|
||||
"- c #9F9F9F9FABAB",
|
||||
"; c #9E9E9E9EAAAA",
|
||||
": c #9D9D9D9DAAAA",
|
||||
"> c #9D9D9D9DA9A9",
|
||||
", c #9C9C9C9CA8A8",
|
||||
"< c #9B9B9B9BA7A7",
|
||||
"1 c #9A9A9A9AA7A7",
|
||||
"2 c #9A9A9A9AA6A6",
|
||||
"3 c #99999999A5A5",
|
||||
"4 c #98989898A5A5",
|
||||
"5 c #98989898A4A4",
|
||||
"6 c #97979797A4A4",
|
||||
"7 c #97979797A3A3",
|
||||
"8 c #96969696A3A3",
|
||||
"9 c #95959595A2A2",
|
||||
"0 c #95959595A1A1",
|
||||
"q c #94949494A1A1",
|
||||
"w c #93939393A0A0",
|
||||
"e c #929292929F9F",
|
||||
"r c #919191919F9F",
|
||||
"t c #919191919E9E",
|
||||
"y c #909090909D9D",
|
||||
"u c #8F8F8F8F9C9C",
|
||||
"i c #8E8E8E8E9C9C",
|
||||
"p c #8E8E8E8E9B9B",
|
||||
"a c #8D8D8D8D9A9A",
|
||||
"s c #8C8C8C8C9A9A",
|
||||
"d c #8C8C8C8C9999",
|
||||
"f c #8B8B8B8B9999",
|
||||
"g c #8A8A8A8A9898",
|
||||
"h c #898989899797",
|
||||
"j c #898989899696",
|
||||
"k c #888888889696",
|
||||
"l c #878787879595",
|
||||
"z c #868686869494",
|
||||
"x c #858585859494",
|
||||
"c c #858585859393",
|
||||
"v c #848484849292",
|
||||
"b c #838383839191",
|
||||
"n c #828282829191",
|
||||
"m c #828282829090",
|
||||
"M c #818181819090",
|
||||
"N c #474747475555",
|
||||
"B c #808080808F8F",
|
||||
"V c #808080808E8E",
|
||||
"C c #7F7F7F7F8E8E",
|
||||
"Z c #7E7E7E7E8D8D",
|
||||
"A c #7D7D7D7D8C8C",
|
||||
"S c #A2A2A2A2ADAD",
|
||||
"D c #9B9B9B9BA8A8",
|
||||
"F c #8F8F8F8F9D9D",
|
||||
"G c #838383839292",
|
||||
"H c #818181818F8F",
|
||||
"J c #7C7C7C7C8B8B",
|
||||
"K c #7B7B7B7B8A8A",
|
||||
"L c #7A7A7A7A8989",
|
||||
"P c #797979798888",
|
||||
"I c #787878788787",
|
||||
"U c #96969696A2A2",
|
||||
"Y c #8D8D8D8D9B9B",
|
||||
"T c #8A8A8A8A9797",
|
||||
"R c #7E7E7E7E8C8C",
|
||||
"E c #777777778787",
|
||||
"W c #777777778686",
|
||||
"Q c #767676768686",
|
||||
"! c #757575758585",
|
||||
"~ c #757575758484",
|
||||
"^ c #747474748484",
|
||||
"/ c #747474748383",
|
||||
"( c #7A7A7A7A8A8A",
|
||||
") c #767676768585",
|
||||
"_ c #737373738383",
|
||||
"` c #727272728282",
|
||||
"' c #727272728181",
|
||||
"] c #717171718181",
|
||||
"[ c #707070708080",
|
||||
"{ c #6F6F6F6F7F7F",
|
||||
"} c #6E6E6E6E7F7F",
|
||||
"| c #8B8B8B8B9898",
|
||||
" . c #848484849393",
|
||||
".. c #7F7F7F7F8D8D",
|
||||
"X. c #787878788888",
|
||||
"o. c #737373738282",
|
||||
"O. c #6E6E6E6E7E7E",
|
||||
"+. c #6D6D6D6D7D7D",
|
||||
"@. c #6C6C6C6C7D7D",
|
||||
"#. c #6C6C6C6C7C7C",
|
||||
"$. c #6B6B6B6B7C7C",
|
||||
"%. c #6B6B6B6B7B7B",
|
||||
"&. c #6A6A6A6A7A7A",
|
||||
"*. c #696969697A7A",
|
||||
"=. c #888888889595",
|
||||
"-. c #6A6A6A6A7B7B",
|
||||
";. c #696969697979",
|
||||
":. c #686868687979",
|
||||
">. c #676767677878",
|
||||
",. c #676767677777",
|
||||
"<. c #666666667777",
|
||||
"1. c #656565657676",
|
||||
"2. c #646464647575",
|
||||
"3. c #636363637474",
|
||||
"4. c #626262627373",
|
||||
"5. c #616161617272",
|
||||
"6. c #606060607272",
|
||||
"7. c #606060607171",
|
||||
"8. c #5F5F5F5F7070",
|
||||
"9. c #797979798989",
|
||||
"0. c #6D6D6D6D7E7E",
|
||||
"q. c #686868687878",
|
||||
"w. c #616161617373",
|
||||
"e. c #5E5E5E5E7070",
|
||||
"r. c #5E5E5E5E6F6F",
|
||||
"t. c #5D5D5D5D6F6F",
|
||||
"y. c #5C5C5C5C6E6E",
|
||||
"u. c #5C5C5C5C6D6D",
|
||||
"i. c #5B5B5B5B6D6D",
|
||||
"p. c #000000000000",
|
||||
" ",
|
||||
" . . X o O + @ # $ % & * = - ; ; : > , < < 1 2 3 4 5 6 7 8 9 0 q w e e r t y u u i p a s d f g h h j k l z z x c v b b n m M N ",
|
||||
" . X o O + @ # $ % & * = - ; ; : > , < < 1 2 3 4 5 6 7 8 9 0 q w e e r t y u u i p a s d f g h h j k l z z x c v b b n m M N N ",
|
||||
" X o O + @ # $ % & * = - ; ; : > , < < 1 2 3 4 5 6 7 8 9 0 q w e e r t y u u i p a s d f g h h j k l z z x c v b b n m M B N N ",
|
||||
" o O + @ # $ % & * = - ; ; : > , < < 1 2 3 4 5 6 7 8 9 0 q w e e r t y u u i p a s d f g h h j k l z z x c v b b n m M B V N N ",
|
||||
" O + @ # $ % & * = - ; ; : > , < < 1 2 3 4 5 6 7 8 9 0 q w e e r t y u u i p a s d f g h h j k l z z x c v b b n m M B V C N N ",
|
||||
" + @ # $ % & * = - ; ; : > , < < 1 2 3 4 5 6 7 8 9 0 q w e e r t y u u i p a s d f g h h j k l z z x c v b b n m M B V C Z N N ",
|
||||
" @ # $ % & * = - ; ; : > , < < 1 2 3 4 5 6 7 8 9 0 q w e e r t y u u i p a s d f g h h j k l z z x c v b b n m M B V C Z A N N ",
|
||||
" # % S & * = - ; ; > , , D < 1 2 3 4 5 6 8 9 9 0 q w e e t y y F u i p a s d f g h h j k l z z c v v G b n m H B V C Z A A N N ",
|
||||
" % S & * = - ; ; > , , D < 1 2 3 4 5 6 8 9 9 0 q w e e t y y F u i p a s d f g h h j k l z z c v v G b n m H B V C Z A A J N N ",
|
||||
" S & * = - ; ; > , , D < 1 2 3 4 5 6 8 9 9 0 q w e e t y y F u i p a s d f g h h j k l z z c v v G b n m H B V C Z A A J K N N ",
|
||||
" & * = - ; ; > , , D < 1 2 3 4 5 6 8 9 9 0 q w e e t y y F u i p a s d f g h h j k l z z c v v G b n m H B V C Z A A J K K N N ",
|
||||
" * = - ; ; > , , D < 1 2 3 4 5 6 8 9 9 0 q w e e t y y F u i p a s d f g h h j k l z z c v v G b n m H B V C Z A A J K K L N N ",
|
||||
" = - ; ; > , , D < 1 2 3 4 5 6 8 9 9 0 q w e e t y y F u i p a s d f g h h j k l z z c v v G b n m H B V C Z A A J K K L L N N ",
|
||||
" - ; ; > , , D < 1 2 3 4 5 6 8 9 9 0 q w e e t y y F u i p a s d f g h h j k l z z c v v G b n m H B V C Z A A J K K L L P N N ",
|
||||
" ; ; > , , D < 1 2 3 4 5 6 8 9 9 0 q w e e t y y F u i p a s d f g h h j k l z z c v v G b n m H B V C Z A A J K K L L P I N N ",
|
||||
" ; > , , D < 2 3 3 4 5 6 8 U 9 q w w e e t y y F u p Y a s d f g T h k l l z z c v v G b n M H B V C Z R A J K K L L P I I N N ",
|
||||
" > , , D < 2 3 3 4 5 6 8 U 9 q w w e e t y y F u p Y a s d f g T h k l l z z c v v G b n M H B V C Z R A J K K L L P I I E N N ",
|
||||
" , , D < 2 3 3 4 5 6 8 U 9 q w w e e t y y F u p Y a s d f g T h k l l z z c v v G b n M H B V C Z R A J K K L L P I I E W N N ",
|
||||
" , D < 2 3 3 4 5 6 8 U 9 q w w e e t y y F u p Y a s d f g T h k l l z z c v v G b n M H B V C Z R A J K K L L P I I E W Q N N ",
|
||||
" D < 2 3 3 4 5 6 8 U 9 q w w e e t y y F u p Y a s d f g T h k l l z z c v v G b n M H B V C Z R A J K K L L P I I E W Q ! N N ",
|
||||
" < 2 3 3 4 5 6 8 U 9 q w w e e t y y F u p Y a s d f g T h k l l z z c v v G b n M H B V C Z R A J K K L L P I I E W Q ! ~ N N ",
|
||||
" 2 3 3 4 5 6 8 U 9 q w w e e t y y F u p Y a s d f g T h k l l z z c v v G b n M H B V C Z R A J K K L L P I I E W Q ! ~ ^ N N ",
|
||||
" 3 3 4 5 6 8 U 9 q w w e e t y y F u p Y a s d f g T h k l l z z c v v G b n M H B V C Z R A J K K L L P I I E W Q ! ~ ^ / N N ",
|
||||
" 3 4 5 6 8 U 9 q w w e t t y y F u p Y a s d f g T h k l l z c c v v G b m M H B C Z Z R A J K K ( L P I I E W ) ! ~ ^ _ ` N N ",
|
||||
" 4 5 6 8 U 9 q w w e t t y y F u p Y a s d f g T h k l l z c c v v G b m M H B C Z Z R A J K K ( L P I I E W ) ! ~ ^ _ ` ` N N ",
|
||||
" 5 6 8 U 9 q w w e t t y y F u p Y a s d f g T h k l l z c c v v G b m M H B C Z Z R A J K K ( L P I I E W ) ! ~ ^ _ ` ` ' N N ",
|
||||
" 6 8 U 9 q w w e t t y y F u p Y a s d f g T h k l l z c c v v G b m M H B C Z Z R A J K K ( L P I I E W ) ! ~ ^ _ ` ` ' ] N N ",
|
||||
" 8 U 9 q w w e t t y y F u p Y a s d f g T h k l l z c c v v G b m M H B C Z Z R A J K K ( L P I I E W ) ! ~ ^ _ ` ` ' ] [ N N ",
|
||||
" U 9 q w w e t t y y F u p Y a s d f g T h k l l z c c v v G b m M H B C Z Z R A J K K ( L P I I E W ) ! ~ ^ _ ` ` ' ] [ { N N ",
|
||||
" 9 q w w e t t y y F u p Y a s d f g T h k l l z c c v v G b m M H B C Z Z R A J K K ( L P I I E W ) ! ~ ^ _ ` ` ' ] [ { { N N ",
|
||||
" q w w e t t y y F u p Y a s d f g T h k l l z c c v v G b m M H B C Z Z R A J K K ( L P I I E W ) ! ~ ^ _ ` ` ' ] [ { { } N N ",
|
||||
" w w e t t y y F u p Y a s f | g T h k l l z c c .v G b m M H B C ..Z R A J K K L P P X.I E W ) ! ~ ^ _ o.` ] [ [ { { O.+.N N ",
|
||||
" w e t t y y F u p Y a s f | g T h k l l z c c .v G b m M H B C ..Z R A J K K L P P X.I E W ) ! ~ ^ _ o.` ] [ [ { { O.+.+.N N ",
|
||||
" e t t y y F u p Y a s f | g T h k l l z c c .v G b m M H B C ..Z R A J K K L P P X.I E W ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.N N ",
|
||||
" t t y y F u p Y a s f | g T h k l l z c c .v G b m M H B C ..Z R A J K K L P P X.I E W ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.N N ",
|
||||
" t y y F u p Y a s f | g T h k l l z c c .v G b m M H B C ..Z R A J K K L P P X.I E W ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.$.N N ",
|
||||
" y y F u p Y a s f | g T h k l l z c c .v G b m M H B C ..Z R A J K K L P P X.I E W ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.$.%.N N ",
|
||||
" y F u p Y a s f | g T h k l l z c c .v G b m M H B C ..Z R A J K K L P P X.I E W ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.$.%.&.N N ",
|
||||
" F u p Y a s f | g T h k l l z c c .v G b m M H B C ..Z R A J K K L P P X.I E W ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.$.%.&.*.N N ",
|
||||
" p p Y a s f | g h k k =.l z c c .v b m m M H B C ..Z A J J K K L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.%.-.&.*.;.N N ",
|
||||
" p Y a s f | g h k k =.l z c c .v b m m M H B C ..Z A J J K K L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.%.-.&.*.;.:.N N ",
|
||||
" Y a s f | g h k k =.l z c c .v b m m M H B C ..Z A J J K K L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.%.-.&.*.;.:.>.N N ",
|
||||
" a s f | g h k k =.l z c c .v b m m M H B C ..Z A J J K K L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.%.-.&.*.;.:.>.,.N N ",
|
||||
" s f | g h k k =.l z c c .v b m m M H B C ..Z A J J K K L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.%.-.&.*.;.:.>.,.<.N N ",
|
||||
" f | g h k k =.l z c c .v b m m M H B C ..Z A J J K K L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.%.-.&.*.;.:.>.,.<.1.N N ",
|
||||
" | g h k k =.l z c c .v b m m M H B C ..Z A J J K K L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.%.-.&.*.;.:.>.,.<.1.2.N N ",
|
||||
" g h k k =.l z c c .v b m m M H B C ..Z A J J K K L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { { O.+.+.@.#.%.-.&.*.;.:.>.,.<.1.2.2.N N ",
|
||||
" h k k l z z c c .v b n m M H V C ..Z A J J K L L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { O.O.+.+.@.#.%.-.&.*.:.>.>.,.<.1.2.2.3.N N ",
|
||||
" k k l z z c c .v b n m M H V C ..Z A J J K L L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { O.O.+.+.@.#.%.-.&.*.:.>.>.,.<.1.2.2.3.4.N N ",
|
||||
" k l z z c c .v b n m M H V C ..Z A J J K L L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { O.O.+.+.@.#.%.-.&.*.:.>.>.,.<.1.2.2.3.4.4.N N ",
|
||||
" l z z c c .v b n m M H V C ..Z A J J K L L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { O.O.+.+.@.#.%.-.&.*.:.>.>.,.<.1.2.2.3.4.4.5.N N ",
|
||||
" z z c c .v b n m M H V C ..Z A J J K L L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { O.O.+.+.@.#.%.-.&.*.:.>.>.,.<.1.2.2.3.4.4.5.5.N N ",
|
||||
" z c c .v b n m M H V C ..Z A J J K L L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { O.O.+.+.@.#.%.-.&.*.:.>.>.,.<.1.2.2.3.4.4.5.5.6.N N ",
|
||||
" c c .v b n m M H V C ..Z A J J K L L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { O.O.+.+.@.#.%.-.&.*.:.>.>.,.<.1.2.2.3.4.4.5.5.6.7.N N ",
|
||||
" c .v b n m M H V C ..Z A J J K L L P P X.I W Q ) ! ~ ^ _ o.` ] [ [ { O.O.+.+.@.#.%.-.&.*.:.>.>.,.<.1.2.2.3.4.4.5.5.6.7.8.N N ",
|
||||
" v b b n m M B V C ..Z A J J K L L 9.P I W W Q ) ! ^ / _ o.` ] [ [ { O.O.0.+.#.%.%.-.&.*.:.q.>.,.<.1.2.2.3.4.4.w.5.6.7.8.e.N N ",
|
||||
" b b n m M B V C ..Z A J J K L L 9.P I W W Q ) ! ^ / _ o.` ] [ [ { O.O.0.+.#.%.%.-.&.*.:.q.>.,.<.1.2.2.3.4.4.w.5.6.7.8.e.r.N N ",
|
||||
" b n m M B V C ..Z A J J K L L 9.P I W W Q ) ! ^ / _ o.` ] [ [ { O.O.0.+.#.%.%.-.&.*.:.q.>.,.<.1.2.2.3.4.4.w.5.6.7.8.e.r.t.N N ",
|
||||
" n m M B V C ..Z A J J K L L 9.P I W W Q ) ! ^ / _ o.` ] [ [ { O.O.0.+.#.%.%.-.&.*.:.q.>.,.<.1.2.2.3.4.4.w.5.6.7.8.e.r.t.y.N N ",
|
||||
" m M B V C ..Z A J J K L L 9.P I W W Q ) ! ^ / _ o.` ] [ [ { O.O.0.+.#.%.%.-.&.*.:.q.>.,.<.1.2.2.3.4.4.w.5.6.7.8.e.r.t.y.u.N N ",
|
||||
" M B V C ..Z A J J K L L 9.P I W W Q ) ! ^ / _ o.` ] [ [ { O.O.0.+.#.%.%.-.&.*.:.q.>.,.<.1.2.2.3.4.4.w.5.6.7.8.e.r.t.y.u.i.N N ",
|
||||
" N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ",
|
||||
"p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p."};
|
32
wmmenu/error.c
Normal file
32
wmmenu/error.c
Normal file
|
@ -0,0 +1,32 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "error.h"
|
||||
|
||||
extern void warn (const char * fmt, ...)
|
||||
{
|
||||
va_list args ;
|
||||
|
||||
assert (fmt != NULL) ;
|
||||
va_start (args, fmt) ;
|
||||
fprintf (stderr, "wmmenu warning: ") ;
|
||||
vfprintf (stderr, fmt, args) ;
|
||||
fprintf (stderr, "\n") ;
|
||||
va_end (args) ;
|
||||
}
|
||||
|
||||
extern void error (const char * fmt, ...)
|
||||
{
|
||||
va_list args ;
|
||||
|
||||
assert (fmt != NULL) ;
|
||||
va_start (args, fmt) ;
|
||||
fprintf (stderr, "wmmenu error: ") ;
|
||||
vfprintf (stderr, fmt, args) ;
|
||||
fprintf (stderr, "\n") ;
|
||||
va_end (args) ;
|
||||
|
||||
exit (EXIT_FAILURE) ;
|
||||
}
|
8
wmmenu/error.h
Normal file
8
wmmenu/error.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
#ifndef error_h_
|
||||
#define error_h_
|
||||
|
||||
extern void warn (const char * fmt, ...) ;
|
||||
extern void error (const char * fmt, ...) ;
|
||||
|
||||
#endif /* error_h_ */
|
||||
|
251
wmmenu/events.c
Normal file
251
wmmenu/events.c
Normal file
|
@ -0,0 +1,251 @@
|
|||
/*
|
||||
List of events catched:
|
||||
|
||||
button bar window:
|
||||
- button press and release => run a menu entry
|
||||
- enter/leave => show/hide bar (if not -O click) and highlight (if set)
|
||||
- pointer motion (if highlight set) => change highlight position
|
||||
|
||||
menu icon:
|
||||
- button press => show/hide bar
|
||||
- enter/leave (if not -O click) => show/hide bar
|
||||
- move/reparent => find WMFrame and bar coords, update frame events.
|
||||
|
||||
WMFrame (if some):
|
||||
- enter/leave (if not -O click) => show/hide bar
|
||||
- move/destroy => find WMFrame and bar coords, update frame events.
|
||||
|
||||
NB: Move is actually part of a larger "Configure" event; Configure,
|
||||
Reparent and Destroy events are catched with StructureNotifyMask.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <dockapp.h>
|
||||
|
||||
#include "types.h"
|
||||
#include "events.h"
|
||||
#include "buttonbar.h"
|
||||
#include "options.h"
|
||||
#include "menu.h"
|
||||
#include "xobjects.h"
|
||||
#include "pixmaps.h"
|
||||
|
||||
static bool BarShown = false ;
|
||||
static bool HideBarDelayed = false ;
|
||||
|
||||
static void FindWMFrameAndBarPos (void)
|
||||
{
|
||||
XWindowAttributes wa ;
|
||||
Window tile, parent, root, *children ;
|
||||
unsigned int nChildren ;
|
||||
long evMask ;
|
||||
|
||||
/* find window just under root, it is the wm frame icon */
|
||||
/* (or DAWindow itself if none) */
|
||||
root = 0 ;
|
||||
tile = parent = DAWindow ;
|
||||
while (parent != root)
|
||||
{
|
||||
tile = parent ;
|
||||
XQueryTree (DADisplay, tile,
|
||||
&root, &parent, &children, &nChildren) ;
|
||||
if (children != NULL) XFree (children) ;
|
||||
}
|
||||
|
||||
/* container actually changed ? */
|
||||
if (WMFrame != tile)
|
||||
{
|
||||
#if 0
|
||||
/*
|
||||
TODO: put this back once a solution has been found to avoid an X
|
||||
error, when WMFrame has been destroyed while we were looking for our
|
||||
new frame. Meanwhile, it seems acceptable to not unregister events
|
||||
since in the normal case WMFrame is going to be destroyed !
|
||||
*/
|
||||
/* remove events from old container (if this is not the first time) */
|
||||
if (WMFrame != 0 && WMFrame != DAWindow)
|
||||
XSelectInput (DADisplay, WMFrame, 0) ;
|
||||
#endif
|
||||
|
||||
/* add events to new container */
|
||||
if (tile != DAWindow)
|
||||
{
|
||||
evMask = StructureNotifyMask ; /* move/destroy */
|
||||
if (! ClickOnly)
|
||||
evMask |= EnterWindowMask | LeaveWindowMask ;
|
||||
XSelectInput (DADisplay, tile, evMask) ;
|
||||
}
|
||||
|
||||
WMFrame = tile ;
|
||||
}
|
||||
|
||||
XGetWindowAttributes (DADisplay, WMFrame, & wa) ;
|
||||
ButtonBar_SetPositionFromDockApp (wa.x, wa.y, wa.width, wa.height) ;
|
||||
}
|
||||
|
||||
static void EnterApp (void)
|
||||
{
|
||||
if (Menu_HasChanged ())
|
||||
{
|
||||
Menu_Reload () ;
|
||||
|
||||
Pixmaps_LoadMenu () ;
|
||||
Pixmaps_LoadTile () ;
|
||||
|
||||
ButtonBar_Rebuild () ;
|
||||
/* adjust position depending on possible new size */
|
||||
FindWMFrameAndBarPos () ;
|
||||
}
|
||||
|
||||
ButtonBar_Show () ;
|
||||
BarShown = true ;
|
||||
HideBarDelayed = false ;
|
||||
}
|
||||
|
||||
static void LeaveBar (void)
|
||||
{
|
||||
ButtonBar_Hide () ;
|
||||
BarShown = false ;
|
||||
HideBarDelayed = false ;
|
||||
}
|
||||
|
||||
static void LeaveApp (void)
|
||||
{
|
||||
if (BarShown)
|
||||
{
|
||||
ButtonBar_Unhighlight () ;
|
||||
HideBarDelayed = ! ClickOnly ;
|
||||
}
|
||||
}
|
||||
|
||||
static void InvokeBar (int x, int y)
|
||||
{
|
||||
int h, w ;
|
||||
h = Menu_GetNbRows () ;
|
||||
w = Menu_GetNbColumns () ;
|
||||
x /= TileXSize ;
|
||||
y /= TileYSize ;
|
||||
if (0 <= y && y < h && 0 <= x && x < w)
|
||||
{
|
||||
int entry ;
|
||||
entry = y + h*x ;
|
||||
|
||||
if (entry < Menu_GetNbEntries ())
|
||||
{
|
||||
system (Menu_GetEntryCommand (entry)) ;
|
||||
}
|
||||
}
|
||||
|
||||
LeaveBar () ;
|
||||
}
|
||||
|
||||
static void PressApp (int button, int state, int x, int y)
|
||||
{
|
||||
if (BarShown) LeaveBar () ;
|
||||
else EnterApp () ;
|
||||
}
|
||||
|
||||
extern void Events_SetCallbacks (void)
|
||||
{
|
||||
DACallbacks events ;
|
||||
XSetWindowAttributes ws ;
|
||||
XWindowAttributes wa ;
|
||||
|
||||
events.destroy = NULL ;
|
||||
events.buttonPress = PressApp ;
|
||||
events.buttonRelease = NULL ;
|
||||
events.motion = NULL ;
|
||||
events.enter = (ClickOnly ? NULL : EnterApp) ;
|
||||
events.leave = (ClickOnly ? NULL : LeaveApp) ;
|
||||
|
||||
DASetCallbacks (& events) ;
|
||||
|
||||
/* update set of events we want to catch on the dock app */
|
||||
XGetWindowAttributes (DADisplay, DAWindow, & wa) ;
|
||||
ws.event_mask = wa.your_event_mask
|
||||
| StructureNotifyMask ; /* move/reparent */
|
||||
/* work around a bug in libdockapp: not selecting Enter/Leave events */
|
||||
if (! ClickOnly)
|
||||
ws.event_mask |= EnterWindowMask | LeaveWindowMask ;
|
||||
XChangeWindowAttributes (DADisplay, DAWindow, CWEventMask, & ws) ;
|
||||
}
|
||||
|
||||
extern void Events_Loop (void)
|
||||
{
|
||||
XEvent ev ;
|
||||
bool canShowBar = true ;
|
||||
|
||||
while (true)
|
||||
{
|
||||
/* get some event to process */
|
||||
if (HideBarDelayed)
|
||||
{
|
||||
if (! DANextEventOrTimeout (& ev, HideTimeout))
|
||||
{
|
||||
/* timeout ! */
|
||||
LeaveBar () ;
|
||||
continue ; /* restart waiting for an event */
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
XNextEvent (DADisplay, & ev) ;
|
||||
}
|
||||
/* event available, process it */
|
||||
|
||||
|
||||
if (ev.type == EnterNotify) /* catch entering any wmmenu window */
|
||||
{
|
||||
if (canShowBar) EnterApp () ;
|
||||
canShowBar = true ;
|
||||
}
|
||||
else
|
||||
if (ev.type == LeaveNotify) /* catch leaving any wmmenu window */
|
||||
{
|
||||
/* when cursor goes from icon to dock tile */
|
||||
/* take care to not show the bar back if it is already hidden */
|
||||
if (ev.xany.window == DAWindow)
|
||||
canShowBar = BarShown ;
|
||||
LeaveApp () ;
|
||||
}
|
||||
else
|
||||
if (ev.xany.window == DAWindow) switch (ev.type)
|
||||
{
|
||||
case ReparentNotify :
|
||||
case ConfigureNotify :
|
||||
/* find new WMFrame and update bar position */
|
||||
FindWMFrameAndBarPos () ;
|
||||
break ;
|
||||
|
||||
default :
|
||||
DAProcessEvent (& ev) ;
|
||||
break ;
|
||||
}
|
||||
else
|
||||
if (ev.xany.window == ButtonBarWindow) switch (ev.type)
|
||||
{
|
||||
case ButtonRelease :
|
||||
InvokeBar (ev.xbutton.x, ev.xbutton.y) ;
|
||||
break ;
|
||||
|
||||
case MotionNotify :
|
||||
if (HighlightImage != 0) /* try to avoid func call */
|
||||
{
|
||||
ButtonBar_Highlight (
|
||||
ev.xmotion.x/TileXSize, ev.xmotion.y/TileYSize) ;
|
||||
}
|
||||
break ;
|
||||
}
|
||||
else
|
||||
if (ev.xany.window == WMFrame && WMFrame != 0) switch (ev.type)
|
||||
{
|
||||
case DestroyNotify :
|
||||
case ConfigureNotify :
|
||||
/* find new WMFrame and update bar position */
|
||||
FindWMFrameAndBarPos () ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
7
wmmenu/events.h
Normal file
7
wmmenu/events.h
Normal file
|
@ -0,0 +1,7 @@
|
|||
#ifndef events_h_
|
||||
#define events_h_
|
||||
|
||||
extern void Events_SetCallbacks (void) ;
|
||||
extern void Events_Loop () ;
|
||||
|
||||
#endif /* events_h_ */
|
11
wmmenu/example/apps
Normal file
11
wmmenu/example/apps
Normal file
|
@ -0,0 +1,11 @@
|
|||
# example wmmenu menu file
|
||||
# put it in ~/.wmmenu
|
||||
# run with "wmmenu -m apps"
|
||||
|
||||
"GNUstep.xpm" Menu title
|
||||
"linuxterm.xpm" xterm -T Terminal -name terminal -geometry 80x50 &
|
||||
"HomeNeighborOpen.xpm" xterm -T "Login terminal" -name loginxterm -e bin/rloginsession &
|
||||
"FileManager.xpm" xterm -T "Midnight Commander" -name mc -geometry 100x50 -sl 1000 -e mc -c &
|
||||
"mixer.xpm" gaumix &
|
||||
"HP-16C-48.xpm" kcalc &
|
||||
|
26
wmmenu/example/defaults
Normal file
26
wmmenu/example/defaults
Normal file
|
@ -0,0 +1,26 @@
|
|||
# wmmenu configuration file
|
||||
# put it in ~/.wmmenu/
|
||||
#
|
||||
# xpmpath PATH1:PATH2:...
|
||||
# xpmpath PATH3
|
||||
# xpmpath PATH4
|
||||
# ...
|
||||
#
|
||||
# tile FILE.XPM
|
||||
# or
|
||||
# tile /SOME/PATH/TO/FILE.XPM
|
||||
# or
|
||||
# tile !SOME-COMMAND WITH ARG
|
||||
#
|
||||
# highlight FILE.XPM
|
||||
# or
|
||||
# highlight /SOME/PATH/TO/FILE.XPM
|
||||
#
|
||||
# highlight_behind ANYTHING_NOT_EMPTY
|
||||
#
|
||||
# hide_timeout 1
|
||||
|
||||
xpmpath /usr/local/share/WindowMaker/Icons
|
||||
xpmpath /usr/local/share/pixmaps
|
||||
tile tile2.xpm
|
||||
tile !echo tile2.xpm
|
61
wmmenu/example/extract_icon_back
Executable file
61
wmmenu/example/extract_icon_back
Executable file
|
@ -0,0 +1,61 @@
|
|||
#!/usr/bin/awk -f
|
||||
# Usage:
|
||||
# extract_icon_back [<default pixmap name>]
|
||||
# Description:
|
||||
# Uses WindowMaker's getstyle command to extract the icon pixmap from
|
||||
# preferences, and print it.
|
||||
# If the name returned by getstyle is not absolute, the right pixmap path
|
||||
# is supposed to be declared in wmmenu's defaults file.
|
||||
# If no pixmap is found in WindowMaker's preferences (f.e. in case of
|
||||
# pixmap-less gradient), the string provided as command line argument is
|
||||
# used instead (and is possibly empty or unspecified).
|
||||
# NB: This script expects a POSIX / X/Open compatible AWK. Be aware that
|
||||
# some GNU awk versions do not fulfill this requirement.
|
||||
|
||||
BEGIN {
|
||||
if (1 in ARGV) {
|
||||
Name=ARGV[1]
|
||||
delete ARGV[1]
|
||||
}
|
||||
ARGC=0
|
||||
|
||||
Command="getstyle"
|
||||
IconBackLine=""
|
||||
|
||||
# Search first line marked "IconBack"
|
||||
while (Ok = ((Command | getline) == 1)) {
|
||||
if ($1 == "IconBack") {
|
||||
IconBackLine=$0
|
||||
break
|
||||
}
|
||||
}
|
||||
ReturnDefaultIfNot(Ok)
|
||||
|
||||
# Accumulate while not closed
|
||||
while (IconBackLine !~ /\);$/) {
|
||||
Ok = ((Command | getline) == 1)
|
||||
if (! Ok) break
|
||||
IconBackLine=IconBackLine $0
|
||||
}
|
||||
ReturnDefaultIfNot(Ok)
|
||||
|
||||
# finished
|
||||
close(Command)
|
||||
|
||||
# analyze what we have: split on '= (' and ', "' or ', '
|
||||
FS="(, ([\"]?))|(= \()"
|
||||
$0=IconBackLine
|
||||
TextureType=$2
|
||||
if(TextureType == "spixmap" || TextureType ~ /^t[hvd]gradient$/) {
|
||||
Name=$3
|
||||
sub(/[""]$/,"",Name)
|
||||
}
|
||||
print Name
|
||||
}
|
||||
|
||||
function ReturnDefaultIfNot(ok) {
|
||||
if (! ok) {
|
||||
print Name
|
||||
exit 0
|
||||
}
|
||||
}
|
196
wmmenu/menu.c
Normal file
196
wmmenu/menu.c
Normal file
|
@ -0,0 +1,196 @@
|
|||
#define _POSIX_SOURCE
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "menu.h"
|
||||
#include "utils.h"
|
||||
#include "types.h"
|
||||
#include "error.h"
|
||||
|
||||
#define MAXENTRIES 50
|
||||
|
||||
#define BLANKS " \t\f\r\n"
|
||||
#define SPACES " \t\f"
|
||||
#define ENDLINE "\r\n"
|
||||
|
||||
static int NbEntries = 0 ;
|
||||
static int Rows = 1 ;
|
||||
static const char * Pixmaps [MAXENTRIES] ;
|
||||
static const char * Commands [MAXENTRIES] ;
|
||||
static char * MenuFileText = NULL ;
|
||||
static char MenuPath [FILENAME_MAX] = "" ;
|
||||
static time_t MenuAge = 0 ;
|
||||
|
||||
static void ParseMenu (void)
|
||||
{
|
||||
char * p ;
|
||||
|
||||
assert (MenuFileText != NULL) ;
|
||||
p = MenuFileText ;
|
||||
p += strspn (p, BLANKS) ;
|
||||
NbEntries = 0 ;
|
||||
Pixmaps[0] = NULL ;
|
||||
Commands[0] = NULL ;
|
||||
|
||||
while (NbEntries < MAXENTRIES && *p != EOS) switch (*p++)
|
||||
{
|
||||
case '#' :
|
||||
p += strcspn (p, ENDLINE) ;
|
||||
p += strspn (p, BLANKS) ;
|
||||
break ;
|
||||
|
||||
case '"' :
|
||||
Pixmaps[NbEntries] = p ;
|
||||
p += strcspn (p, "\"") ;
|
||||
*p++ = EOS ;
|
||||
p += strspn (p, SPACES) ;
|
||||
break ;
|
||||
|
||||
default :
|
||||
if (Pixmaps[NbEntries] == NULL)
|
||||
warn ("entry #%d has no pixmap", NbEntries) ;
|
||||
else Commands[NbEntries++] = p-1 ;
|
||||
|
||||
p += strcspn (p, ENDLINE) ;
|
||||
*p++ = EOS ;
|
||||
p += strspn (p, BLANKS) ;
|
||||
|
||||
Commands[NbEntries] = NULL ;
|
||||
Pixmaps[NbEntries] = NULL ;
|
||||
break ;
|
||||
}
|
||||
|
||||
if (*p != EOS)
|
||||
warn ("too many entries") ;
|
||||
}
|
||||
|
||||
extern void Menu_LoadFromFile (const char * name)
|
||||
{
|
||||
char path [FILENAME_MAX] ;
|
||||
const char * home ;
|
||||
FILE * f ;
|
||||
struct stat finfo ;
|
||||
|
||||
assert (name != NULL) ;
|
||||
|
||||
if (strchr (name, '/') == NULL && (home = getenv ("HOME")) != NULL &&
|
||||
home[0] != EOS)
|
||||
sprintf (path, "%s/.wmmenu/%s", home, name) ;
|
||||
else sprintf (path, "%s", name) ;
|
||||
|
||||
if ((f = fopen (path, "r")) == NULL)
|
||||
error ("can't open %s", path) ;
|
||||
else
|
||||
{
|
||||
if (fstat (fileno (f), & finfo) == 0)
|
||||
{
|
||||
MenuAge = finfo.st_mtime ;
|
||||
}
|
||||
|
||||
sprintf (MenuPath, "%.*s", (int)(sizeof MenuPath)-1, path) ;
|
||||
|
||||
if (MenuFileText != NULL) free (MenuFileText) ;
|
||||
MenuFileText = File_ReadAll (f) ;
|
||||
}
|
||||
|
||||
fclose (f) ;
|
||||
|
||||
ParseMenu () ;
|
||||
}
|
||||
|
||||
extern int Menu_GetNbRows(void)
|
||||
{
|
||||
assert (Rows > 0) ;
|
||||
return Rows ;
|
||||
}
|
||||
|
||||
extern void Menu_SetNbRows (const char *s)
|
||||
{
|
||||
int h;
|
||||
|
||||
h = atoi(s) ;
|
||||
if (h > 0) Rows = h ;
|
||||
}
|
||||
|
||||
extern int Menu_GetNbColumns (void)
|
||||
{
|
||||
assert (NbEntries > 1 && Rows > 0) ;
|
||||
/*
|
||||
Remove 1 entry used for header, then apply the formula:
|
||||
UNITS = int (floor ((USED - 1) / PERUNIT)) + 1
|
||||
(USED is NbEntries - 1)
|
||||
*/
|
||||
return ((NbEntries - 2) / Rows) + 1 ;
|
||||
}
|
||||
|
||||
extern int Menu_GetNbEntries (void)
|
||||
{
|
||||
assert (NbEntries > 1) ;
|
||||
return NbEntries-1 ;
|
||||
}
|
||||
|
||||
extern const char * Menu_GetEntryPixmap (int i)
|
||||
{
|
||||
assert (0 <= i && i < NbEntries-1) ;
|
||||
return Pixmaps[i+1] ;
|
||||
}
|
||||
|
||||
extern const char * Menu_GetEntryCommand (int i)
|
||||
{
|
||||
assert (0 <= i && i < NbEntries-1) ;
|
||||
return Commands[i+1] ;
|
||||
}
|
||||
|
||||
extern const char * Menu_GetPixmap (void)
|
||||
{
|
||||
assert (0 < NbEntries) ;
|
||||
return Pixmaps[0] ;
|
||||
}
|
||||
|
||||
extern const char * Menu_GetTitle (void)
|
||||
{
|
||||
assert (0 < NbEntries) ;
|
||||
return Commands[0] ;
|
||||
}
|
||||
|
||||
extern int Menu_HasChanged (void)
|
||||
{
|
||||
struct stat finfo ;
|
||||
|
||||
if (stat (MenuPath, & finfo) == 0 && finfo.st_mtime > MenuAge)
|
||||
{
|
||||
return 1 ; /* should reload */
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0 ; /* don't try to reload */
|
||||
}
|
||||
}
|
||||
|
||||
extern void Menu_Reload (void)
|
||||
{
|
||||
FILE * f ;
|
||||
struct stat finfo ;
|
||||
|
||||
if ((f = fopen (MenuPath, "r")) != NULL)
|
||||
{
|
||||
if (fstat (fileno (f), & finfo) == 0)
|
||||
{
|
||||
MenuAge = finfo.st_mtime ;
|
||||
}
|
||||
|
||||
if (MenuFileText != NULL) free (MenuFileText) ;
|
||||
MenuFileText = File_ReadAll (f) ;
|
||||
fclose (f) ;
|
||||
|
||||
ParseMenu () ;
|
||||
}
|
||||
}
|
19
wmmenu/menu.h
Normal file
19
wmmenu/menu.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#ifndef menu_h_
|
||||
#define menu_h_
|
||||
|
||||
extern void Menu_LoadFromFile (const char * name) ;
|
||||
extern int Menu_HasChanged (void) ;
|
||||
extern void Menu_Reload (void) ;
|
||||
|
||||
extern const char * Menu_GetPixmap (void) ;
|
||||
extern const char * Menu_GetTitle (void) ;
|
||||
|
||||
extern int Menu_GetNbEntries (void) ;
|
||||
extern const char * Menu_GetEntryPixmap (int i) ;
|
||||
extern const char * Menu_GetEntryCommand (int i) ;
|
||||
|
||||
extern void Menu_SetNbRows (const char *s) ;
|
||||
extern int Menu_GetNbRows (void) ;
|
||||
extern int Menu_GetNbColumns (void) ;
|
||||
|
||||
#endif /* menu_h_ */
|
305
wmmenu/options.c
Normal file
305
wmmenu/options.c
Normal file
|
@ -0,0 +1,305 @@
|
|||
/* ANSI */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
/* POSIX */
|
||||
#include <getopt.h>
|
||||
|
||||
#include "options.h"
|
||||
#include "version.h"
|
||||
#include "error.h"
|
||||
#include "utils.h"
|
||||
#include "types.h"
|
||||
#include "menu.h"
|
||||
|
||||
#define MAXOPTIONS (20)
|
||||
|
||||
#ifndef ETCDIR
|
||||
#define ETCDIR "/usr/local/etc"
|
||||
#endif
|
||||
#define DEFAULTPATH (ETCDIR ":.")
|
||||
|
||||
#define BLANKS " \t\f\r\n"
|
||||
#define SPACES " \t\f"
|
||||
#define ENDLINE "\r\n"
|
||||
|
||||
int TileXSize = 0 ;
|
||||
int TileYSize = 0 ;
|
||||
|
||||
char MenuName [40] = "" ;
|
||||
|
||||
static char MyPixmapPath [1024] = "" ;
|
||||
char * PixmapPath = MyPixmapPath ;
|
||||
|
||||
static char MyTilePath [FILENAME_MAX] = "" ;
|
||||
char * TilePath = MyTilePath ;
|
||||
|
||||
static char MyHighlightPath [FILENAME_MAX] = "" ;
|
||||
char * HighlightPath = MyHighlightPath ;
|
||||
|
||||
bool ClickOnly = false ;
|
||||
bool AutoScale = true ;
|
||||
bool HighlightBehind = false ;
|
||||
int HideTimeout = 1 ;
|
||||
|
||||
int Options_Argc = 0 ;
|
||||
char * Options_Argv [MAXOPTIONS] ;
|
||||
|
||||
static void Usage (void)
|
||||
{
|
||||
printf (
|
||||
"Usage: wmmenu [<options>...][-- <dockoptions>...]\n"
|
||||
"Normal options:\n"
|
||||
"-m MENUNAME set the name of the menu file to load from ~/.wmmenu\n"
|
||||
"-g WxH force width and height of tile\n"
|
||||
"-l XPMFILE set the pixmap used to highlight icon under cursor\n"
|
||||
"-t XPMFILE set the pixmap used as button bar background\n"
|
||||
"-O click bar is only triggered by clicks on the tile, not moves\n"
|
||||
"-O noautoscale disable automatic pixmap scaling to tile size\n"
|
||||
"-O behind draw highlight pixmap behind icon, not above\n"
|
||||
"-O hide=N set bar hiding timeout to N ms (default one)\n"
|
||||
"-r ROWS set number of menu rows (default one)\n"
|
||||
"-v print version information\n"
|
||||
"-h print this help message\n"
|
||||
"Note:\n"
|
||||
" -t, -l and '-O behind' can also be specified with the defaults file.\n"
|
||||
""
|
||||
) ;
|
||||
}
|
||||
|
||||
static void SetGeometry (const char * val)
|
||||
{
|
||||
if (sscanf (val, "%dx%d", &TileXSize, &TileYSize) != 2)
|
||||
error ("bad tile geometry \"%s\"", val) ;
|
||||
else
|
||||
if (64 < TileXSize || TileXSize < 0)
|
||||
error ("incorrect tile width %d", TileXSize) ;
|
||||
else
|
||||
if (64 < TileYSize || TileYSize < 0)
|
||||
error ("incorrect tile height %d", TileYSize) ;
|
||||
}
|
||||
|
||||
static void SetTilePath (const char * value)
|
||||
{
|
||||
char *ptrToFree = NULL ;
|
||||
|
||||
if (value != NULL && value[0] == '!')
|
||||
{
|
||||
ptrToFree = File_ReadOutputFromCommand (value+1) ;
|
||||
|
||||
if ((value = ptrToFree) == NULL)
|
||||
value = "" ;
|
||||
}
|
||||
|
||||
sprintf (MyTilePath, "%.*s", (int)(sizeof MyTilePath)-1, value) ;
|
||||
|
||||
if (ptrToFree != NULL)
|
||||
free (ptrToFree) ;
|
||||
}
|
||||
|
||||
static void SetHighlightPath (const char * value)
|
||||
{
|
||||
sprintf (MyHighlightPath, "%.*s", (int)(sizeof MyHighlightPath)-1, value) ;
|
||||
}
|
||||
|
||||
static void SetHideTimeout (const char * value)
|
||||
{
|
||||
HideTimeout = atoi (value) ;
|
||||
if (HideTimeout <= 0)
|
||||
{
|
||||
warn ("hide_timeout must be a strictly positive integer") ;
|
||||
HideTimeout = 1 ;
|
||||
}
|
||||
/* no maximum -- for players */
|
||||
}
|
||||
|
||||
static void AddPixmapPath (const char * value)
|
||||
{
|
||||
int curLen ;
|
||||
int szLeft ;
|
||||
|
||||
curLen = strlen (MyPixmapPath) ;
|
||||
szLeft = (sizeof MyPixmapPath) - curLen ;
|
||||
|
||||
/* don't forget to count space for ':' and ending EOS */
|
||||
sprintf (MyPixmapPath+curLen, ":%.*s", szLeft-2, value) ;
|
||||
}
|
||||
|
||||
static void InitDefaults (void)
|
||||
{
|
||||
char dftPixmapPath [FILENAME_MAX] ;
|
||||
const char * home ;
|
||||
|
||||
if ((home = getenv ("HOME")) != NULL && home[0] != EOS)
|
||||
{
|
||||
sprintf (dftPixmapPath, "%.*s/.wmmenu",
|
||||
(int)(sizeof dftPixmapPath)-10, home) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy (dftPixmapPath, ".") ;
|
||||
}
|
||||
|
||||
strcpy (MyPixmapPath, dftPixmapPath) ;
|
||||
}
|
||||
|
||||
static void ParseDefaults (char * text)
|
||||
{
|
||||
char * p ;
|
||||
const char * name ;
|
||||
const char * value ;
|
||||
|
||||
assert (text != NULL) ;
|
||||
p = text ;
|
||||
p += strspn (p, BLANKS) ;
|
||||
|
||||
while (*p != EOS) switch (*p++)
|
||||
{
|
||||
case '#' :
|
||||
p += strcspn (p, ENDLINE) ;
|
||||
p += strspn (p, BLANKS) ;
|
||||
break ;
|
||||
|
||||
default :
|
||||
name = p-1 ;
|
||||
p += strcspn (p, SPACES) ;
|
||||
*p++ = EOS ;
|
||||
p += strspn (p, SPACES) ;
|
||||
value = p ;
|
||||
p += strcspn (p, ENDLINE) ;
|
||||
*p++ = EOS ;
|
||||
p += strspn (p, BLANKS) ;
|
||||
|
||||
if (streq (name, "geometry")) SetGeometry (value) ;
|
||||
else
|
||||
if (streq (name, "xpmpath"))
|
||||
{
|
||||
AddPixmapPath (value) ;
|
||||
}
|
||||
else
|
||||
if (streq (name, "tile"))
|
||||
{
|
||||
SetTilePath (value) ;
|
||||
}
|
||||
else
|
||||
if (streq (name, "highlight"))
|
||||
{
|
||||
SetHighlightPath (value) ;
|
||||
}
|
||||
else
|
||||
if (streq (name, "highlight_behind"))
|
||||
{
|
||||
HighlightBehind = true ;
|
||||
}
|
||||
else
|
||||
if (streq (name, "hide_timeout"))
|
||||
{
|
||||
SetHideTimeout (value) ;
|
||||
}
|
||||
else error ("unknown setting \"%s\"", name) ;
|
||||
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
extern void Options_ParseDefaults (void)
|
||||
{
|
||||
char pathList [1000] ;
|
||||
char path [FILENAME_MAX] ;
|
||||
const char * home ;
|
||||
FILE * f ;
|
||||
|
||||
if ((home = getenv ("HOME")) != NULL && *home != EOS)
|
||||
{
|
||||
sprintf (pathList, "%s/.wmmenu:%s", home, DEFAULTPATH) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy (pathList, DEFAULTPATH) ;
|
||||
}
|
||||
|
||||
if (File_FindInPath (path, sizeof path, pathList, "defaults") &&
|
||||
(f = fopen (path, "r")) != NULL)
|
||||
{
|
||||
char * text ;
|
||||
|
||||
text = File_ReadAll (f) ;
|
||||
fclose (f) ;
|
||||
|
||||
InitDefaults () ;
|
||||
ParseDefaults (text) ;
|
||||
free (text) ;
|
||||
}
|
||||
}
|
||||
|
||||
extern void Options_Parse (int argc, char ** argv)
|
||||
{
|
||||
int opt ;
|
||||
|
||||
assert (argv != NULL) ;
|
||||
assert (argc > 0) ;
|
||||
|
||||
Options_Argc = 0 ;
|
||||
Options_Argv[Options_Argc++] = MenuName ;
|
||||
|
||||
while ((opt = getopt (argc, argv, "hg:l:m:r:t:vO:")) != EOF) switch (opt)
|
||||
{
|
||||
case 'g' :
|
||||
SetGeometry (optarg) ;
|
||||
break ;
|
||||
|
||||
case 'm' :
|
||||
sprintf (MenuName, "%.*s", (int)(sizeof MenuName)-1, optarg) ;
|
||||
break ;
|
||||
|
||||
case 'r' :
|
||||
Menu_SetNbRows (optarg) ;
|
||||
break ;
|
||||
|
||||
case 't' :
|
||||
SetTilePath (optarg) ;
|
||||
break ;
|
||||
|
||||
case 'l' :
|
||||
sprintf (MyHighlightPath, "%.*s",
|
||||
(int)(sizeof MyHighlightPath)-1, optarg) ;
|
||||
break ;
|
||||
|
||||
case 'O' :
|
||||
if (streq (optarg, "click")) ClickOnly = true ;
|
||||
else if (streq (optarg, "noautoscale")) AutoScale = false ;
|
||||
else if (streq (optarg, "behind")) HighlightBehind = true ;
|
||||
else if (streql (optarg, "hide=", 5)) SetHideTimeout (optarg+5) ;
|
||||
else printf ("ignoring unknown feature \"%s\"\n", optarg) ;
|
||||
break ;
|
||||
|
||||
case 'v' :
|
||||
printf ("wmmenu (c) F.COUTANT v%s\n", VERSION) ;
|
||||
exit (EXIT_SUCCESS) ;
|
||||
break ;
|
||||
|
||||
case 'h' :
|
||||
Usage () ;
|
||||
exit (EXIT_SUCCESS) ;
|
||||
break ;
|
||||
|
||||
case '?' :
|
||||
Usage () ;
|
||||
exit (EXIT_FAILURE) ;
|
||||
break ;
|
||||
}
|
||||
|
||||
if (MenuName[0] == EOS)
|
||||
error ("no menu file name specified") ;
|
||||
if (MyTilePath[0] == EOS)
|
||||
warn ("no tile pixmap specified, using internal default") ;
|
||||
|
||||
while (optind < argc && Options_Argc < MAXOPTIONS)
|
||||
Options_Argv[Options_Argc++] = argv[optind++] ;
|
||||
}
|
||||
|
||||
extern void Options_SetMenuName (const char * name)
|
||||
{
|
||||
sprintf (MenuName, "%.*s", (int)(sizeof MenuName)-1, name) ;
|
||||
}
|
41
wmmenu/options.h
Normal file
41
wmmenu/options.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
#ifndef options_h_
|
||||
#define options_h_
|
||||
|
||||
#include "types.h"
|
||||
|
||||
/* defaults to "not set" */
|
||||
extern int TileXSize ;
|
||||
extern int TileYSize ;
|
||||
|
||||
/* defaults to "not set" */
|
||||
extern char MenuName [] ;
|
||||
|
||||
/* empty by default; can be written to */
|
||||
extern char * PixmapPath ;
|
||||
|
||||
/* empty by default; can be written to */
|
||||
extern char * TilePath ;
|
||||
|
||||
/* empty by default; can be written to */
|
||||
extern char * HighlightPath ;
|
||||
|
||||
/* defaults to false */
|
||||
extern bool ClickOnly ;
|
||||
|
||||
/* defaults to true */
|
||||
extern bool AutoScale ;
|
||||
|
||||
/* defaults to false */
|
||||
extern bool HighlightBehind ;
|
||||
|
||||
/* defaults to 1ms */
|
||||
extern int HideTimeout ;
|
||||
|
||||
extern int Options_Argc ;
|
||||
extern char * Options_Argv [] ;
|
||||
|
||||
extern void Options_ParseDefaults (void) ;
|
||||
extern void Options_Parse (int argc, char ** argv) ;
|
||||
extern void Options_SetMenuName (const char *) ;
|
||||
|
||||
#endif /* options_h_ */
|
238
wmmenu/pixmaps.c
Normal file
238
wmmenu/pixmaps.c
Normal file
|
@ -0,0 +1,238 @@
|
|||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef WITH_GDKPIXBUF
|
||||
#include <gdk-pixbuf/gdk-pixbuf-xlib.h>
|
||||
#endif
|
||||
#include <dockapp.h>
|
||||
|
||||
#include "pixmaps.h"
|
||||
#include "xobjects.h"
|
||||
#include "options.h"
|
||||
#include "utils.h"
|
||||
#include "error.h"
|
||||
#include "menu.h"
|
||||
|
||||
#include "defaultTile.xpm"
|
||||
#include "defaultIcon.xpm"
|
||||
|
||||
static char ** CurrentDefault = defaultIcon_xpm ;
|
||||
|
||||
#ifdef WITH_GDKPIXBUF
|
||||
|
||||
extern void Pixmaps_FindLoad (const char * name,
|
||||
Pixmap * imageP, Pixmap * maskP, int * wP, int * hP)
|
||||
{
|
||||
static int mustInitGdkPixbuf = 1 ;
|
||||
char path [FILENAME_MAX] ;
|
||||
GdkPixbuf * pix ;
|
||||
int width, height ;
|
||||
void (* problem) (const char *, ...) ;
|
||||
|
||||
if (mustInitGdkPixbuf)
|
||||
{
|
||||
gdk_pixbuf_xlib_init (DADisplay, DefaultScreen (DADisplay)) ;
|
||||
mustInitGdkPixbuf = 0 ;
|
||||
}
|
||||
|
||||
assert (name != NULL) ;
|
||||
assert (imageP != NULL) ;
|
||||
assert (maskP != NULL) ;
|
||||
problem = (CurrentDefault == NULL ? error : warn) ;
|
||||
|
||||
#define UseDefault() \
|
||||
if ((pix = gdk_pixbuf_new_from_xpm_data ( \
|
||||
(const char **)CurrentDefault)) == NULL) \
|
||||
error ("can't create internal default pixmap")
|
||||
|
||||
if (name == NULL || name[0] == EOS)
|
||||
{
|
||||
if (CurrentDefault == NULL)
|
||||
error ("missing image name specification") ;
|
||||
|
||||
UseDefault () ;
|
||||
}
|
||||
else
|
||||
if (! File_FindInPath (path, sizeof path, PixmapPath, name))
|
||||
{
|
||||
problem ("can't find image \"%s\"", name) ;
|
||||
UseDefault () ;
|
||||
}
|
||||
else
|
||||
if ((pix = gdk_pixbuf_new_from_file (path)) == NULL)
|
||||
{
|
||||
problem ("can't load image \"%s\"", path) ;
|
||||
UseDefault () ;
|
||||
}
|
||||
|
||||
/* get loaded geometry */
|
||||
width = gdk_pixbuf_get_width (pix) ;
|
||||
height = gdk_pixbuf_get_height (pix) ;
|
||||
|
||||
/* scale if allowed, possible, and useful */
|
||||
if (AutoScale &&
|
||||
TileXSize > 0 && TileYSize > 0 &&
|
||||
(width > TileXSize || height > TileYSize))
|
||||
{
|
||||
GdkPixbuf * scaled ;
|
||||
|
||||
/*
|
||||
Compare width/TileXSize to height/TileYSize to determine a new
|
||||
size that fits within TileXSize x TileYSize and keeps the same
|
||||
aspect ratio as before. The biggest ratio wins.
|
||||
*/
|
||||
if (width*TileYSize >= height*TileXSize)
|
||||
{
|
||||
/* width directs re-scaling */
|
||||
height = (height * TileXSize) / width ;
|
||||
width = TileXSize ;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* height directs re-scaling */
|
||||
width = (width * TileYSize) / height ;
|
||||
height = TileYSize ;
|
||||
}
|
||||
|
||||
scaled = gdk_pixbuf_scale_simple (pix,
|
||||
width, height, GDK_INTERP_HYPER) ;
|
||||
gdk_pixbuf_unref (pix) ;
|
||||
pix = scaled ;
|
||||
}
|
||||
|
||||
if (wP != NULL) *wP = width ;
|
||||
if (hP != NULL) *hP = height ;
|
||||
gdk_pixbuf_xlib_render_pixmap_and_mask (pix, imageP, maskP, 128) ;
|
||||
/* don't forget to free now we've done pixmaps */
|
||||
gdk_pixbuf_unref (pix) ;
|
||||
}
|
||||
|
||||
/*
|
||||
We have to reimplement a few trivial gdk functions here to avoid linking with
|
||||
it !
|
||||
*/
|
||||
|
||||
extern gint gdk_screen_width (void)
|
||||
{
|
||||
return DisplayWidth (DADisplay, DefaultScreen (DADisplay)) ;
|
||||
}
|
||||
|
||||
extern gint gdk_screen_height (void)
|
||||
{
|
||||
return DisplayHeight (DADisplay, DefaultScreen (DADisplay)) ;
|
||||
}
|
||||
|
||||
extern gboolean gdk_color_parse (const gchar * spec, GdkColor * color)
|
||||
{
|
||||
XColor scr ;
|
||||
#if 1
|
||||
|
||||
/* Lukasz Pankowski suggested this */
|
||||
if (! XParseColor (DADisplay,
|
||||
DefaultColormap (DADisplay, DefaultScreen (DADisplay)),
|
||||
spec, & scr))
|
||||
#else
|
||||
XColor exact ;
|
||||
|
||||
if (! XAllocNamedColor (DADisplay,
|
||||
DefaultColormap (DADisplay, DefaultScreen (DADisplay)),
|
||||
spec, & scr, & exact))
|
||||
#endif
|
||||
{
|
||||
return FALSE ;
|
||||
}
|
||||
else
|
||||
{
|
||||
color->pixel = scr.pixel ;
|
||||
color->red = scr.red ;
|
||||
color->green = scr.green ;
|
||||
color->blue = scr.blue ;
|
||||
return TRUE ;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
extern void Pixmaps_FindLoad (const char * name,
|
||||
Pixmap * imageP, Pixmap * maskP, int * wP, int * hP)
|
||||
{
|
||||
char path [FILENAME_MAX] ;
|
||||
XpmAttributes attr ;
|
||||
void (* problem) (const char *, ...) ;
|
||||
|
||||
assert (name != NULL) ;
|
||||
assert (imageP != NULL) ;
|
||||
assert (maskP != NULL) ;
|
||||
attr.valuemask = 0 ;
|
||||
problem = (CurrentDefault == NULL ? error : warn) ;
|
||||
|
||||
#define UseDefault() \
|
||||
if (XpmCreatePixmapFromData (DADisplay, DefaultRootWindow (DADisplay), \
|
||||
CurrentDefault, imageP, maskP, & attr) != XpmSuccess) \
|
||||
error ("can't create internal default pixmap")
|
||||
|
||||
if (! File_FindInPath (path, sizeof path, PixmapPath, name))
|
||||
{
|
||||
problem ("can't find file \"%s\"", name) ;
|
||||
UseDefault () ;
|
||||
}
|
||||
else
|
||||
if (XpmReadFileToPixmap (DADisplay, DefaultRootWindow (DADisplay),
|
||||
path, imageP, maskP, & attr) != XpmSuccess)
|
||||
{
|
||||
problem ("can't load pixmap \"%s\"", path) ;
|
||||
UseDefault () ;
|
||||
}
|
||||
|
||||
if (wP != NULL) *wP = attr.width ;
|
||||
if (hP != NULL) *hP = attr.height ;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
extern void Pixmaps_LoadMenu (void)
|
||||
{
|
||||
Pixmap image, mask ;
|
||||
bool saveAutoScale ;
|
||||
saveAutoScale = AutoScale ; /* save old value */
|
||||
AutoScale = false ; /* set temporary value */
|
||||
Pixmaps_FindLoad (Menu_GetPixmap (), & image, & mask, NULL, NULL) ;
|
||||
DASetShape (mask) ;
|
||||
DASetPixmap (image) ;
|
||||
AutoScale = saveAutoScale ; /* restore initial value */
|
||||
}
|
||||
|
||||
extern void Pixmaps_LoadTile (void)
|
||||
{
|
||||
int x, y ;
|
||||
|
||||
if (TileImage != 0) XFreePixmap (DADisplay, TileImage) ;
|
||||
if (TileMask != 0) XFreePixmap (DADisplay, TileMask) ;
|
||||
|
||||
CurrentDefault = defaultTile_xpm ;
|
||||
Pixmaps_FindLoad (TilePath, & TileImage, & TileMask, & x, & y) ;
|
||||
CurrentDefault = defaultIcon_xpm ;
|
||||
|
||||
if (TileXSize <= 0) TileXSize = x ;
|
||||
if (TileYSize <= 0) TileYSize = y ;
|
||||
}
|
||||
|
||||
extern void Pixmaps_LoadHighlight (void)
|
||||
{
|
||||
int x, y ;
|
||||
|
||||
if (HighlightImage != 0) XFreePixmap (DADisplay, HighlightImage) ;
|
||||
if (HighlightMask != 0) XFreePixmap (DADisplay, HighlightMask) ;
|
||||
|
||||
if (HighlightPath[0] != EOS)
|
||||
{
|
||||
Pixmaps_FindLoad (HighlightPath,
|
||||
& HighlightImage, & HighlightMask, & x, & y) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
HighlightImage = 0 ;
|
||||
HighlightMask = 0 ;
|
||||
}
|
||||
}
|
||||
|
10
wmmenu/pixmaps.h
Normal file
10
wmmenu/pixmaps.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
#ifndef pixmaps_h_
|
||||
#define pixmaps_h_
|
||||
|
||||
extern void Pixmaps_FindLoad (const char * name,
|
||||
Pixmap * imageP, Pixmap * maskP, int * wP, int * hP) ;
|
||||
extern void Pixmaps_LoadMenu (void) ;
|
||||
extern void Pixmaps_LoadTile (void) ;
|
||||
extern void Pixmaps_LoadHighlight (void) ;
|
||||
|
||||
#endif /* pixmaps_h_ */
|
69
wmmenu/target-white.xpm
Normal file
69
wmmenu/target-white.xpm
Normal file
|
@ -0,0 +1,69 @@
|
|||
/* XPM */
|
||||
static char * target_white_xpm[] = {
|
||||
"64 64 2 1",
|
||||
" c None",
|
||||
". c white",
|
||||
" ",
|
||||
" ",
|
||||
" .......... .......... ",
|
||||
" .......... .......... ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .. .. ",
|
||||
" .......... .......... ",
|
||||
" .......... .......... ",
|
||||
" ",
|
||||
" "};
|
16
wmmenu/types.h
Normal file
16
wmmenu/types.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
#ifndef types_h_
|
||||
#define types_h_
|
||||
|
||||
typedef int bool ;
|
||||
#ifndef false
|
||||
#define false (0)
|
||||
#endif
|
||||
#ifndef true
|
||||
#define true (1)
|
||||
#endif
|
||||
|
||||
#ifndef EOS
|
||||
#define EOS '\0'
|
||||
#endif
|
||||
|
||||
#endif /* types_h_ */
|
183
wmmenu/utils.c
Normal file
183
wmmenu/utils.c
Normal file
|
@ -0,0 +1,183 @@
|
|||
#define _POSIX_SOURCE
|
||||
#define _POSIX_C_SOURCE 199309L
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
/* POSIX */
|
||||
#include <unistd.h>
|
||||
|
||||
#include "utils.h"
|
||||
#include "error.h"
|
||||
#include "types.h"
|
||||
|
||||
static char * ReadAll (FILE * f, int offset)
|
||||
{
|
||||
char buf [10*1024] ;
|
||||
int iRead, nRead ;
|
||||
char * ret ;
|
||||
|
||||
clearerr (f) ;
|
||||
|
||||
iRead = 0 ;
|
||||
nRead = 0 ;
|
||||
while (iRead < sizeof buf)
|
||||
{
|
||||
nRead = fread (buf+iRead, 1, (sizeof buf)-iRead, f) ;
|
||||
if (nRead <= 0) break ;
|
||||
iRead += nRead ;
|
||||
}
|
||||
|
||||
if (nRead > 0)
|
||||
{
|
||||
assert (iRead == sizeof buf) ;
|
||||
ret = ReadAll (f, offset+iRead) ;
|
||||
}
|
||||
else
|
||||
if (ferror (f) != 0)
|
||||
{
|
||||
error ("read file: %s", strerror (errno)) ;
|
||||
ret = NULL ;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = malloc (offset+iRead+1) ;
|
||||
if (ret == NULL) error ("failed to allocate memory") ;
|
||||
ret[offset+iRead] = EOS ;
|
||||
}
|
||||
memcpy (ret+offset, buf, iRead) ;
|
||||
|
||||
return ret ;
|
||||
}
|
||||
|
||||
extern char * File_ReadAll (FILE * f)
|
||||
{
|
||||
assert (f != NULL) ;
|
||||
return ReadAll (f, 0) ;
|
||||
}
|
||||
|
||||
static const char * getHome (void)
|
||||
{
|
||||
static char homeDir [80] = "" ;
|
||||
static int initialized = 0 ;
|
||||
if (! initialized)
|
||||
{
|
||||
const char * env ;
|
||||
env = getenv ("HOME") ;
|
||||
if (env != NULL && env[0] != EOS)
|
||||
{
|
||||
sprintf (homeDir, "%.*s", (int)(sizeof homeDir)-1, env) ;
|
||||
}
|
||||
initialized = 1 ;
|
||||
}
|
||||
return homeDir[0] != EOS ? homeDir : NULL ;
|
||||
}
|
||||
|
||||
extern bool File_FindInPath (char * out, int outSz,
|
||||
const char * path, const char * basename)
|
||||
{
|
||||
char name [FILENAME_MAX] ;
|
||||
int len ;
|
||||
|
||||
assert (path != NULL) ;
|
||||
assert (basename != NULL) ;
|
||||
assert (out != NULL) ;
|
||||
|
||||
/* regular path */
|
||||
if (access (basename, F_OK) == 0)
|
||||
{
|
||||
sprintf (out, "%.*s", outSz-1, basename) ;
|
||||
return true ;
|
||||
}
|
||||
else
|
||||
/* relative to home directory */
|
||||
if (strncmp (basename, "~/", 2) == 0 && getHome () != NULL)
|
||||
{
|
||||
sprintf (name, "%s%s", getHome (), basename+1) ;
|
||||
if (access (name, F_OK) == 0)
|
||||
{
|
||||
sprintf (out, "%.*s", outSz-1, name) ;
|
||||
return true ;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
else
|
||||
/* forbid relative to PATH just like shell */
|
||||
/* NB: absolute non-existent files also drop here */
|
||||
if (strchr (basename, '/') != NULL)
|
||||
{
|
||||
return false ;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (*path != EOS)
|
||||
{
|
||||
len = strcspn (path, ":") ;
|
||||
|
||||
if (strncmp (path, "~/", 2) == 0)
|
||||
{
|
||||
sprintf (name, "%s%.*s/%s",
|
||||
getHome (), len-1, path+1, basename) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (name, "%.*s/%s", len, path, basename) ;
|
||||
}
|
||||
|
||||
if (access (name, F_OK) == 0)
|
||||
{
|
||||
sprintf (out, "%.*s", outSz-1, name) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
path += len ;
|
||||
while (*path == ':') path++ ;
|
||||
}
|
||||
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
|
||||
extern char * File_ReadOutputFromCommand (const char * cmd)
|
||||
{
|
||||
FILE * out ;
|
||||
char * ret ;
|
||||
|
||||
if ((out = popen (cmd, "r")) == NULL)
|
||||
{
|
||||
error ("when calling command: %s, error: ",
|
||||
cmd, strerror (errno)) ;
|
||||
ret = NULL ;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = File_ReadAll (out) ;
|
||||
pclose (out) ;
|
||||
|
||||
/* if return value is correct, remove trailing whitespace */
|
||||
if (ret != NULL)
|
||||
{
|
||||
char *lastNotWhite, *cursor ;
|
||||
char c ;
|
||||
|
||||
cursor = lastNotWhite = ret ;
|
||||
|
||||
while ((c = *cursor++) != EOS)
|
||||
{
|
||||
if (strchr (" \t\n", c) == NULL)
|
||||
{
|
||||
lastNotWhite = cursor ;
|
||||
}
|
||||
}
|
||||
|
||||
*lastNotWhite = EOS ;
|
||||
}
|
||||
}
|
||||
|
||||
return ret ;
|
||||
}
|
17
wmmenu/utils.h
Normal file
17
wmmenu/utils.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
#ifndef utils_h_
|
||||
#define utils_h_
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "types.h"
|
||||
|
||||
extern char * File_ReadAll (FILE *) ;
|
||||
extern bool File_FindInPath (char * out, int outSz,
|
||||
const char * path, const char * basename) ;
|
||||
|
||||
#define streq(S1,S2) (strcmp ((S1), (S2)) == 0)
|
||||
#define streql(S1,S2,L) (strncmp ((S1), (S2), (L)) == 0)
|
||||
|
||||
extern char * File_ReadOutputFromCommand (const char * cmd) ;
|
||||
|
||||
#endif /* utils_h_ */
|
12
wmmenu/version.h
Normal file
12
wmmenu/version.h
Normal file
|
@ -0,0 +1,12 @@
|
|||
#ifndef version_h_
|
||||
#define version_h_
|
||||
|
||||
#ifdef WITH_GDKPIXBUF
|
||||
#define ADDVER " (with gdk-pixbuf support)"
|
||||
#else
|
||||
#define ADDVER " (XPM only)"
|
||||
#endif
|
||||
|
||||
#define VERSION ("1.2" ADDVER)
|
||||
|
||||
#endif /* version_h_ */
|
196
wmmenu/wmmenu.1
Normal file
196
wmmenu/wmmenu.1
Normal file
|
@ -0,0 +1,196 @@
|
|||
.TH "wmmenu" "1" "1.1" "Fabien COUTANT" "WMaker dockapp"
|
||||
.SH "NAME"
|
||||
.LP
|
||||
wmmenu \- A WindowMaker dockapp to launch programs with a popup pixmap menu
|
||||
.SH "SYNTAX"
|
||||
.LP
|
||||
wmmenu [\fI<options>\fR] \fB\-m\fP \fI<MENUNAME>\fR
|
||||
.br
|
||||
wmmenu \fB\-v\fP
|
||||
.br
|
||||
wmmenu \fB\-h\fP
|
||||
.SH "DESCRIPTION"
|
||||
.LP
|
||||
This is a "dock application" for Windowmaker, that provides a button bar to
|
||||
launch applications from.
|
||||
.LP
|
||||
The bar opens automatically when either the mouse enters the button or you
|
||||
click on it (this is configurable).
|
||||
.LP
|
||||
Multiple instances of the program can run at the same time: each one provides
|
||||
a menu that it reads from a separate file, so you can have as many different
|
||||
menus as you want (you can also display the same menu more than once if you
|
||||
want; dunno what it's useful for...).
|
||||
.LP
|
||||
NOTE: options can take place before or after "\-m", as long as each option is
|
||||
correctly paired with its corresponding argument (when it has one).
|
||||
.SH "OPTIONS"
|
||||
.LP
|
||||
.TP
|
||||
\fB\-h\fR
|
||||
print a help message listing known options.
|
||||
.TP
|
||||
\fB\-v\fR
|
||||
print version information
|
||||
.TP
|
||||
\fB\-g\fR \fIW\fP\fBx\fR\fIH\fP
|
||||
force width and height of tile
|
||||
.TP
|
||||
\fB\-l\fR \fIXPMFILE\fP
|
||||
set filename of the pixmap used to highlight icon under cursor
|
||||
.TP
|
||||
\fB\-t\fR \fIXPMFILE\fP
|
||||
set filename of the pixmap used as button bar background.
|
||||
XPMFILE may also be '!COMMAND' to execute COMMAND and get the pixmap name to use
|
||||
from its output.
|
||||
.TP
|
||||
\fB\-O click\fR
|
||||
bar is only triggered by clicks on the tile, not moves
|
||||
.TP
|
||||
\fB\-O noautoscale\fR
|
||||
disable automatic pixmap scaling to tile size
|
||||
.TP
|
||||
\fB\-O behind\fR
|
||||
draw highlight pixmap behind icon, not above
|
||||
.TP
|
||||
\fB\-O hide=\fIN\fR
|
||||
set bar hiding timeout in ms. See hide_timeout description in Defaults.
|
||||
.TP
|
||||
\fB\-r\fR \fIROWS\fP
|
||||
set number of menu rows (default one)
|
||||
.LP
|
||||
Please note, that \fB\-l\fR, \fB\-t\fR and \fB\-O behind\fR options
|
||||
can also be specified with another syntax in the \fBdefaults\fR file
|
||||
(described hereafter).
|
||||
.SH "DEFAULTS FILE"
|
||||
This is a configuration file that defines things common to all instances
|
||||
of wmmenu.
|
||||
It is located in "~/.wmmenu/defaults".
|
||||
|
||||
.LP
|
||||
The syntax is as follows:
|
||||
.LP
|
||||
# comment or empty lines are ignored
|
||||
.LP
|
||||
xpmpath PATH1:PATH2:...
|
||||
.br
|
||||
xpmpath PATH3
|
||||
.br
|
||||
xpmpath PATH4
|
||||
.br
|
||||
...
|
||||
.br
|
||||
# defines in which path to search for pixmaps
|
||||
.LP
|
||||
tile FILE.XPM
|
||||
.br
|
||||
or
|
||||
.br
|
||||
tile /SOME/PATH/TO/FILE.XPM
|
||||
.br
|
||||
# defines pixmap used as background tile in menu bar
|
||||
.br
|
||||
or
|
||||
.br
|
||||
tile !some_command with arguments
|
||||
.br
|
||||
# defines the command to call to get the pixmap name to be
|
||||
# used: the name is read from its standard output.
|
||||
# If the name read is empty, the internal default is used
|
||||
# instead.
|
||||
.LP
|
||||
highlight FILE.XPM
|
||||
.br
|
||||
or
|
||||
.br
|
||||
highlight /SOME/PATH/TO/FILE.XPM
|
||||
.br
|
||||
# defines pixmap used to highlight item under cursor
|
||||
.LP
|
||||
highlight_behind[ ANYTHING_NOT_EMPTY]
|
||||
.br
|
||||
# (don't forget the separating space)
|
||||
.br
|
||||
# request to draw highlight pixmap BEHIND icon,
|
||||
.br
|
||||
# no more in front.
|
||||
.br
|
||||
# To be used if your pixmap is designed to cover most
|
||||
.br
|
||||
# of tile's surface
|
||||
.LP
|
||||
hide_timeout MS
|
||||
.br
|
||||
# set the delay, in ms, necessary for the bar to close
|
||||
.br
|
||||
# after the cursor has left wmmenu. 1 by default.
|
||||
.SH "MENU FILES"
|
||||
Those files each define a menu of their own.
|
||||
Each menu file is located in "~/.wmmenu/\fI<MENUNAME>\fR";
|
||||
The name of the file determines the name you must use on command\-line
|
||||
to call it.
|
||||
|
||||
.LP
|
||||
The syntax is the following:
|
||||
.LP
|
||||
# comment and blank lines are ignored
|
||||
.TP
|
||||
"MENUICON.XPM" menu title
|
||||
There is exactly one such line in each menu file,
|
||||
and is the first significant line encountered.
|
||||
It describes the menu name, which may be used by your window manager, and
|
||||
the pixmap that is shown to trigger the menu.
|
||||
The pixmap is specified using the same rules as the next item (read on).
|
||||
.TP
|
||||
"ICON.XPM" command arguments &
|
||||
\fIICON.XPM\fR is an image filename or path.
|
||||
It can be an absolute path (begins with "/"),
|
||||
a path relative to wmmenu's current directory (contains a "/" but not at the beginning),
|
||||
a path relative to home directory (starts with "~/"),
|
||||
or a simple file name (searched through all defined xpmpath elements).
|
||||
If you compiled wmmenu with gdk\-pixbuf support, the image can be any format
|
||||
supported by this library (GIF, PNG, TIFF, JPEG, etc...);
|
||||
Otherwise only XPM is supported.
|
||||
.br
|
||||
\fIcommand\fR and \fIarguments\fR are run with the system(3) library call,
|
||||
hence:
|
||||
1/ you can use any shell tricks you want, and
|
||||
2/ wmmenu waits for command completion, so for X11 programs you have to add
|
||||
"\fB&\fR" at the end.
|
||||
.SH "FILES"
|
||||
.LP
|
||||
\fI~/.wmmenu/<MENUNAME>\fP
|
||||
.br
|
||||
\fI~/.wmmenu/defaults\fP
|
||||
.SH "ENVIRONMENT VARIABLES"
|
||||
.LP
|
||||
.TP
|
||||
\fBHOME\fP
|
||||
Specifies the home directory
|
||||
.SH "EXAMPLES"
|
||||
.LP
|
||||
I personally use the following command line:
|
||||
.LP
|
||||
wmmenu \-m apps \-r 3
|
||||
.SH "BUGS"
|
||||
.LP
|
||||
If wmmenu was not compiled with gdk\-pixbuf support,
|
||||
application icons larger than tile overlap over icons next to them.
|
||||
With gdk\-pixbuf support turned on, images in this case are
|
||||
automatically scaled down to fit to tile
|
||||
(unless "\-O noautoscale" was specified).
|
||||
.LP
|
||||
There is some flicker when the mouse goes from the dockapp to the
|
||||
menu bar. On fast displays this is not always apparent.
|
||||
.LP
|
||||
No editor is provided, to edit menu files.
|
||||
However, editing by hand is not so difficult, and
|
||||
menu files are automatically reloaded each time you save them.
|
||||
You only have to restart wmmenu, if you change any setting in
|
||||
the \fBdefaults\fR file.
|
||||
.SH "AUTHORS"
|
||||
.LP
|
||||
Fabien COUTANT <fcoutant@freesurf.fr>
|
||||
.SH "SEE ALSO"
|
||||
.LP
|
||||
rox\-menu, wmaker
|
36
wmmenu/wmmenu.c
Normal file
36
wmmenu/wmmenu.c
Normal file
|
@ -0,0 +1,36 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <dockapp.h>
|
||||
|
||||
#include "options.h"
|
||||
#include "menu.h"
|
||||
#include "version.h"
|
||||
#include "pixmaps.h"
|
||||
#include "buttonbar.h"
|
||||
#include "events.h"
|
||||
|
||||
extern int main (int argc, char ** argv)
|
||||
{
|
||||
Options_ParseDefaults () ;
|
||||
Options_Parse (argc, argv) ;
|
||||
Menu_LoadFromFile (MenuName) ;
|
||||
|
||||
DAParseArguments (Options_Argc, Options_Argv, NULL, 0,
|
||||
"wmmenu", VERSION) ;
|
||||
DAInitialize (NULL, (char*)Menu_GetTitle (), 48, 48, argc, argv) ;
|
||||
|
||||
Pixmaps_LoadMenu () ;
|
||||
Pixmaps_LoadTile () ;
|
||||
/* needs tile to be loaded before to have autoscale work */
|
||||
Pixmaps_LoadHighlight () ;
|
||||
/* bar build needs highlight mask and menu icons */
|
||||
ButtonBar_Build () ;
|
||||
Events_SetCallbacks () ;
|
||||
|
||||
DAShow () ;
|
||||
Events_Loop () ;
|
||||
|
||||
return EXIT_SUCCESS ;
|
||||
}
|
||||
|
11
wmmenu/xobjects.c
Normal file
11
wmmenu/xobjects.c
Normal file
|
@ -0,0 +1,11 @@
|
|||
#include "xobjects.h"
|
||||
|
||||
Pixmap TileImage = 0 ;
|
||||
Pixmap TileMask = 0 ;
|
||||
Pixmap HighlightImage = 0 ;
|
||||
Pixmap HighlightMask = 0 ;
|
||||
Pixmap HighlightBehindMask = 0 ;
|
||||
Pixmap ButtonBarImage = 0 ;
|
||||
Window ButtonBarWindow = 0 ;
|
||||
Window WMFrame = 0 ;
|
||||
|
13
wmmenu/xobjects.h
Normal file
13
wmmenu/xobjects.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
#ifndef xobjects_h_
|
||||
#define xobjects_h_
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
extern Pixmap TileImage, TileMask ;
|
||||
extern Pixmap HighlightImage, HighlightMask ;
|
||||
extern Pixmap HighlightBehindMask ;
|
||||
extern Pixmap ButtonBarImage ;
|
||||
extern Window ButtonBarWindow ;
|
||||
extern Window WMFrame ;
|
||||
|
||||
#endif /* xobjects_h_ */
|
Loading…
Reference in a new issue