Compare commits
204 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
91dc06d0b8 | ||
|
3af80cd7d8 | ||
|
4692f84ff0 | ||
|
c805dcbeaf | ||
|
a6cbc6c9a7 | ||
|
bae58f61cf | ||
|
1636e12210 | ||
|
2b92c95230 | ||
|
16a0c0d52a | ||
|
5867c53390 | ||
|
34a816f87d | ||
|
0288b576ca | ||
|
59dafc4ad6 | ||
|
49672e9d05 | ||
|
07d452e0c8 | ||
|
88d44169e9 | ||
|
f7cbe710a2 | ||
|
86e9e6f1ec | ||
|
eadf090413 | ||
|
8ec1b41cac | ||
|
ab3bcac0bf | ||
|
723cbabc12 | ||
|
86775cc44b | ||
|
2103ae2891 | ||
|
b028ec0e07 | ||
|
bb3e33def3 | ||
|
3a60b19514 | ||
|
dd2f298252 | ||
|
11ea52d170 | ||
|
4354074607 | ||
|
4776d6dc61 | ||
|
d0051e7bb8 | ||
|
fb67bd666e | ||
|
f5bd1eed8d | ||
|
1654d6cd62 | ||
|
6cc0b0dc08 | ||
|
b2bb6ebec9 | ||
|
a662fc6e0a | ||
|
d066975e78 | ||
|
26236a4900 | ||
|
15505bd711 | ||
|
86468aafe5 | ||
|
be9afce035 | ||
|
3c067598fc | ||
|
86019c5855 | ||
|
0291c722fb | ||
|
e0e6b071c6 | ||
|
cd3b4915c3 | ||
|
210b303941 | ||
|
47e3e8be7b | ||
|
d515d2758f | ||
|
a8ea79715f | ||
|
3e0a141016 | ||
|
cbd8257914 | ||
|
22cf9626c7 | ||
|
9e13ecabe8 | ||
|
266f3dd311 | ||
|
8d9ade36de | ||
|
da81f57f6d | ||
|
c1241bcba3 | ||
|
eeba6221b1 | ||
|
a0a99d10e1 | ||
|
7cf66b443a | ||
|
038a78a3f4 | ||
|
e0add428d2 | ||
|
bf7b8e37ee | ||
|
610a0a8d12 | ||
|
f0818217b3 | ||
|
3c366bd73d | ||
|
75a19c35bd | ||
|
a5f31f5707 | ||
|
b81c1e88cd | ||
|
5376113039 | ||
|
c7a8f17bd2 | ||
|
128d4cf376 | ||
|
e4fdaba88d | ||
|
849f1dd7a3 | ||
|
402dc2bc95 | ||
|
00a60cb7b2 | ||
|
e149c531b8 | ||
|
605e9b6c03 | ||
|
caf5246268 | ||
|
93af72e116 | ||
|
0b8072a5a9 | ||
|
31ffcd3b9a | ||
|
9cf07b4b9b | ||
|
7a2782d02d | ||
|
1c91c2a99c | ||
|
b7695fa98c | ||
|
b54c179d58 | ||
|
06c18808b6 | ||
|
a7aee433cc | ||
|
a3606ecb0e | ||
|
7d5fe17391 | ||
|
7f36736d11 | ||
|
115c01b74e | ||
|
d77340ed53 | ||
|
da7a799121 | ||
|
855a566319 | ||
|
29e8faed6c | ||
|
d9c24564d2 | ||
|
6ba5103df4 | ||
|
309d071df5 | ||
|
26b9f3de0f | ||
|
7afd296c40 | ||
|
cc8b3b999b | ||
|
f2abaf8b30 | ||
|
340b176de6 | ||
|
18dcf73896 | ||
|
9f3b0c6ea8 | ||
|
4508fd2c4e | ||
|
723361fa12 | ||
|
96c65400cc | ||
|
6c1d0e4d60 | ||
|
6efe1932be | ||
|
8f7b62e2b6 | ||
|
2ec16d9cb2 | ||
|
146bc23c11 | ||
|
595e797660 | ||
|
bba30e2686 | ||
|
08b264393d | ||
|
b4e63454e5 | ||
|
bff1526d31 | ||
|
9a33a72c6a | ||
|
97797d90a6 | ||
|
4983707c70 | ||
|
4229fb7b78 | ||
|
b27ffbd78b | ||
|
6366f94e36 | ||
|
645f1d0dfc | ||
|
d7d14e53da | ||
|
851672cadc | ||
|
504b797be8 | ||
|
503ca75af4 | ||
|
8623bf5d19 | ||
|
5bc288b2b1 | ||
|
a6835349df | ||
|
518c9b72d1 | ||
|
09db46f54f | ||
|
e3623cd7f2 | ||
|
0ba3bae981 | ||
|
ebeb4e4752 | ||
|
3472085f59 | ||
|
7ffe519816 | ||
|
29686bd1b8 | ||
|
052ffae192 | ||
|
eededaa76f | ||
|
8e3e61170b | ||
|
37236f8840 | ||
|
7082ba1e10 | ||
|
569a1f925a | ||
|
0f4d3ffdb5 | ||
|
a1ad9c2a1c | ||
|
51224dcb79 | ||
|
4e74263ba0 | ||
|
bab59a9807 | ||
|
ef00902fd9 | ||
|
3e60c5d836 | ||
|
c24f22a36b | ||
|
44e372bb31 | ||
|
17232f493b | ||
|
b95e61c9b7 | ||
|
cf7e4c15a9 | ||
|
c43c692a4d | ||
|
abd9fbb79a | ||
|
698ec259af | ||
|
88efbf3dd1 | ||
|
4d8a646958 | ||
|
b89a9501c7 | ||
|
65d655b371 | ||
|
2cef0ddb01 | ||
|
3f244b1d52 | ||
|
a6945d5094 | ||
|
8911aa1060 | ||
|
d2305e4b13 | ||
|
fcf26a38f1 | ||
|
4fc6cbe608 | ||
|
a45f106d3c | ||
|
596033b781 | ||
|
357558798c | ||
|
1f6af5e78f | ||
|
f3617bd7ca | ||
|
096fb3723b | ||
|
6423288394 | ||
|
7195e941c1 | ||
|
12805b69ac | ||
|
1538bb7426 | ||
|
cbe5e88e4f | ||
|
2fe3ccdf58 | ||
|
07d82c0c2a | ||
|
e7423f8fc6 | ||
|
61976c292b | ||
|
63c9e30a76 | ||
|
015f51ac46 | ||
|
542c58d8d0 | ||
|
745c46d8fa | ||
|
d058e83570 | ||
|
301b4e5591 | ||
|
38b866ba34 | ||
|
540a78761b | ||
|
7804354106 | ||
|
6d8e68dcfd | ||
|
d8688f7a4f | ||
|
09d0926bb9 |
14
.hgtags
14
.hgtags
@@ -33,3 +33,17 @@ dd3d02b07cac44fbafc074a361c1002cebe7aae4 2.8
|
||||
8f0f917ac988164e1b4446236e3a6ab6cfcb8c67 3.1
|
||||
e4c81a78ffbad6ba4d1ad119cc654da6eca63a4c 3.2
|
||||
709df5a4bad7015a346b2b44b1b3b573ea3088ff 3.3
|
||||
9ab649b3b3e5bfccf1c8f352c59e5361e070a25f 3.4
|
||||
05e5bd706b3b3e61399d57c4bb43df296a20112d 3.5
|
||||
0bc2751d06e8b95e0138854c7815e154c5c3d990 3.6
|
||||
0508a3a6ee106f36d9b8ff07bb5b28584edfa89c 3.7
|
||||
644b0798fcccd570fd519899e1601c6857496b91 3.8
|
||||
21a1ed9a69b9541a355758a57103e294fb722c33 3.9
|
||||
78f9f72cc9c6bdb022ff8908486b61ef5e242aad 4.0
|
||||
844587572673cf6326c3f61737264a46b728fc0a 4.1
|
||||
72749a826cab0baa805620e44a22e54486c97a4e 4.1.1
|
||||
379813a051f03a1b20bdbfdc2d2d1d2d794ace48 4.2
|
||||
abb6579a324fffdf6a23c2fa4c32911277da594a 4.2.1
|
||||
14c79f054bdf43ff3213af8e60a783192e92a018 4.3
|
||||
34a2d77049a95b02f3332a0b88f9370965ebcfad 4.3.1
|
||||
2b105eaae8315b076da93056da9ecd60de5a7ac9 4.4
|
||||
|
26
LICENSE
26
LICENSE
@@ -1,23 +1,27 @@
|
||||
MIT/X Consortium License
|
||||
|
||||
© 2006-2007 Anselm R. Garbe <garbeam at gmail dot com>
|
||||
© 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com>
|
||||
© 2010-2011 Connor Lane Smith <cls@lubutu.com>
|
||||
© 2006-2011 Anselm R Garbe <anselm@garbe.us>
|
||||
© 2009 Gottox <gottox@s01.de>
|
||||
© 2009 Markus Schnalke <meillo@marmaro.de>
|
||||
© 2009 Evan Gates <evan.gates@gmail.com>
|
||||
© 2006-2008 Sander van Dijk <a dot h dot vandijk at gmail dot com>
|
||||
© 2006-2007 Michał Janeczek <janeczek at gmail dot com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
42
Makefile
42
Makefile
@@ -1,12 +1,12 @@
|
||||
# dmenu - dynamic menu
|
||||
# © 2006-2007 Anselm R. Garbe, Sander van Dijk
|
||||
# See LICENSE file for copyright and license details.
|
||||
|
||||
include config.mk
|
||||
|
||||
SRC = dmenu.c
|
||||
SRC = dmenu.c draw.c lsx.c
|
||||
OBJ = ${SRC:.c=.o}
|
||||
|
||||
all: options dmenu
|
||||
all: options dmenu lsx
|
||||
|
||||
options:
|
||||
@echo dmenu build options:
|
||||
@@ -15,42 +15,52 @@ options:
|
||||
@echo "CC = ${CC}"
|
||||
|
||||
.c.o:
|
||||
@echo CC $<
|
||||
@${CC} -c ${CFLAGS} $<
|
||||
@echo CC -c $<
|
||||
@${CC} -c $< ${CFLAGS}
|
||||
|
||||
${OBJ}: config.h config.mk
|
||||
${OBJ}: config.mk
|
||||
|
||||
dmenu: ${OBJ}
|
||||
dmenu: dmenu.o draw.o
|
||||
@echo CC -o $@
|
||||
@${CC} -o $@ ${OBJ} ${LDFLAGS}
|
||||
@${CC} -o $@ dmenu.o draw.o ${LDFLAGS}
|
||||
|
||||
lsx: lsx.o
|
||||
@echo CC -o $@
|
||||
@${CC} -o $@ lsx.o ${LDFLAGS}
|
||||
|
||||
clean:
|
||||
@echo cleaning
|
||||
@rm -f dmenu ${OBJ} dmenu-${VERSION}.tar.gz
|
||||
@rm -f dmenu lsx ${OBJ} dmenu-${VERSION}.tar.gz
|
||||
|
||||
dist: clean
|
||||
@echo creating dist tarball
|
||||
@mkdir -p dmenu-${VERSION}
|
||||
@cp -R LICENSE Makefile README config.mk dmenu.1 config.h dmenu_path ${SRC} dmenu-${VERSION}
|
||||
@cp LICENSE Makefile README config.mk dmenu.1 draw.h dmenu_run lsx.1 ${SRC} dmenu-${VERSION}
|
||||
@tar -cf dmenu-${VERSION}.tar dmenu-${VERSION}
|
||||
@gzip dmenu-${VERSION}.tar
|
||||
@rm -rf dmenu-${VERSION}
|
||||
|
||||
install: all
|
||||
@echo installing executable file to ${DESTDIR}${PREFIX}/bin
|
||||
@echo installing executables to ${DESTDIR}${PREFIX}/bin
|
||||
@mkdir -p ${DESTDIR}${PREFIX}/bin
|
||||
@cp -f dmenu dmenu_path ${DESTDIR}${PREFIX}/bin
|
||||
@cp -f dmenu dmenu_run lsx ${DESTDIR}${PREFIX}/bin
|
||||
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu
|
||||
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_path
|
||||
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
|
||||
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_run
|
||||
@chmod 755 ${DESTDIR}${PREFIX}/bin/lsx
|
||||
@echo installing manual pages to ${DESTDIR}${MANPREFIX}/man1
|
||||
@mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
||||
@sed "s/VERSION/${VERSION}/g" < dmenu.1 > ${DESTDIR}${MANPREFIX}/man1/dmenu.1
|
||||
@sed "s/VERSION/${VERSION}/g" < lsx.1 > ${DESTDIR}${MANPREFIX}/man1/lsx.1
|
||||
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1
|
||||
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/lsx.1
|
||||
|
||||
uninstall:
|
||||
@echo removing executable file from ${DESTDIR}${PREFIX}/bin
|
||||
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu ${DESTDIR}${PREFIX}/bin/dmenu_path
|
||||
@echo removing executables from ${DESTDIR}${PREFIX}/bin
|
||||
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu
|
||||
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu_run
|
||||
@rm -f ${DESTDIR}${PREFIX}/bin/lsx
|
||||
@echo removing manual page from ${DESTDIR}${MANPREFIX}/man1
|
||||
@rm -f ${DESTDIR}${MANPREFIX}/man1/dmenu.1
|
||||
@rm -f ${DESTDIR}${MANPREFIX}/man1/lsx.1
|
||||
|
||||
.PHONY: all options clean dist install uninstall
|
||||
|
6
README
6
README
@@ -1,6 +1,6 @@
|
||||
dmenu - dynamic menu
|
||||
====================
|
||||
dmenu is a generic and efficient menu for X.
|
||||
dmenu is an efficient dynamic menu for X.
|
||||
|
||||
|
||||
Requirements
|
||||
@@ -13,8 +13,8 @@ Installation
|
||||
Edit config.mk to match your local setup (dmenu is installed into
|
||||
the /usr/local namespace by default).
|
||||
|
||||
Afterwards enter the following command to build and install dmenu (if
|
||||
necessary as root):
|
||||
Afterwards enter the following command to build and install dmenu
|
||||
(if necessary as root):
|
||||
|
||||
make clean install
|
||||
|
||||
|
10
config.h
10
config.h
@@ -1,10 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
/* appearance */
|
||||
#define FONT "-*-terminus-medium-*-*-*-*-*-*-*-*-*-*-*"
|
||||
#define NORMBGCOLOR "#cccccc"
|
||||
#define NORMFGCOLOR "#000000"
|
||||
#define SELBGCOLOR "#0066ff"
|
||||
#define SELFGCOLOR "#ffffff"
|
||||
/* next macro defines the space between menu items */
|
||||
#define SPACE 30 /* px */
|
24
config.mk
24
config.mk
@@ -1,7 +1,5 @@
|
||||
# dmenu version
|
||||
VERSION = 3.4
|
||||
|
||||
# Customize below to fit your system
|
||||
VERSION = 4.4.1
|
||||
|
||||
# paths
|
||||
PREFIX = /usr/local
|
||||
@@ -10,20 +8,18 @@ MANPREFIX = ${PREFIX}/share/man
|
||||
X11INC = /usr/X11R6/include
|
||||
X11LIB = /usr/X11R6/lib
|
||||
|
||||
# Xinerama, comment if you don't want it
|
||||
XINERAMALIBS = -lXinerama
|
||||
XINERAMAFLAGS = -DXINERAMA
|
||||
|
||||
# includes and libs
|
||||
INCS = -I. -I/usr/include -I${X11INC}
|
||||
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
|
||||
INCS = -I${X11INC}
|
||||
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
|
||||
|
||||
# flags
|
||||
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
|
||||
LDFLAGS = -s ${LIBS}
|
||||
#CFLAGS = -g -std=c99 -pedantic -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
|
||||
#LDFLAGS = -g ${LIBS}
|
||||
|
||||
# Solaris
|
||||
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
|
||||
#LDFLAGS = ${LIBS}
|
||||
#CFLAGS += -xtarget=ultra
|
||||
CPPFLAGS = -D_BSD_SOURCE -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
||||
CFLAGS = -ansi -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
|
||||
LDFLAGS = -s ${LIBS}
|
||||
|
||||
# compiler and linker
|
||||
CC = cc
|
||||
|
139
dmenu.1
139
dmenu.1
@@ -4,95 +4,96 @@ dmenu \- dynamic menu
|
||||
.SH SYNOPSIS
|
||||
.B dmenu
|
||||
.RB [ \-b ]
|
||||
.RB [ \-f ]
|
||||
.RB [ \-i ]
|
||||
.RB [ \-fn " <font>"]
|
||||
.RB [ \-nb " <color>"]
|
||||
.RB [ \-nf " <color>"]
|
||||
.RB [ \-p " <prompt>"]
|
||||
.RB [ \-sb " <color>"]
|
||||
.RB [ \-sf " <color>"]
|
||||
.RB [ \-l
|
||||
.IR lines ]
|
||||
.RB [ \-p
|
||||
.IR prompt ]
|
||||
.RB [ \-fn
|
||||
.IR font ]
|
||||
.RB [ \-nb
|
||||
.IR color ]
|
||||
.RB [ \-nf
|
||||
.IR color ]
|
||||
.RB [ \-sb
|
||||
.IR color ]
|
||||
.RB [ \-sf
|
||||
.IR color ]
|
||||
.RB [ \-v ]
|
||||
.P
|
||||
.BR dmenu_run " ..."
|
||||
.SH DESCRIPTION
|
||||
.SS Overview
|
||||
dmenu is a generic menu for X, originally designed for
|
||||
.BR dwm (1).
|
||||
It manages huge amounts (up to 10.000 and more) of user defined menu items
|
||||
efficiently.
|
||||
.SS Options
|
||||
.B dmenu
|
||||
is a dynamic menu for X, originally designed for
|
||||
.IR dwm (1).
|
||||
It manages huge numbers of user\-defined menu items efficiently.
|
||||
.P
|
||||
dmenu reads a list of newline\-separated items from stdin and creates a menu.
|
||||
When the user selects an item or enters any text and presses Return, their
|
||||
choice is printed to stdout and dmenu terminates.
|
||||
.P
|
||||
.B dmenu_run
|
||||
is a dmenu script used by dwm which lists programs in the user's $PATH and
|
||||
executes the selected item.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-b
|
||||
makes dmenu appear at the screen bottom (by default it appears at the screen top).
|
||||
dmenu appears at the bottom of the screen.
|
||||
.TP
|
||||
.B \-f
|
||||
dmenu grabs the keyboard before reading stdin. This is faster, but may lock up
|
||||
X if stdin is from a terminal.
|
||||
.TP
|
||||
.B \-i
|
||||
makes dmenu match menu entries with ignoring intermediate characters.
|
||||
dmenu matches menu items case insensitively.
|
||||
.TP
|
||||
.B \-fn <font>
|
||||
defines the font.
|
||||
.BI \-l " lines"
|
||||
dmenu lists items vertically, with the given number of lines.
|
||||
.TP
|
||||
.B \-nb <color>
|
||||
defines the normal background color (#RGB, #RRGGBB, and color names are supported).
|
||||
.BI \-p " prompt"
|
||||
defines the prompt to be displayed to the left of the input field.
|
||||
.TP
|
||||
.B \-nf <color>
|
||||
defines the normal foreground color (#RGB, #RRGGBB, and color names are supported).
|
||||
.BI \-fn " font"
|
||||
defines the font or font set used.
|
||||
.TP
|
||||
.B \-p <prompt>
|
||||
defines a prompt to be displayed before the input area.
|
||||
.BI \-nb " color"
|
||||
defines the normal background color.
|
||||
.IR #RGB ,
|
||||
.IR #RRGGBB ,
|
||||
and X color names are supported.
|
||||
.TP
|
||||
.B \-sb <color>
|
||||
defines the selected background color (#RGB, #RRGGBB, and color names are supported).
|
||||
.BI \-nf " color"
|
||||
defines the normal foreground color.
|
||||
.TP
|
||||
.B \-sf <color>
|
||||
defines the selected foreground color (#RGB, #RRGGBB, and color names are supported).
|
||||
.BI \-sb " color"
|
||||
defines the selected background color.
|
||||
.TP
|
||||
.BI \-sf " color"
|
||||
defines the selected foreground color.
|
||||
.TP
|
||||
.B \-v
|
||||
prints version information to standard output, then exits.
|
||||
prints version information to stdout, then exits.
|
||||
.SH USAGE
|
||||
dmenu reads a list of newline-separated items from standard input and creates a
|
||||
menu. When the user selects an item or enters any text and presses Return, his/her
|
||||
choice is printed to standard output and dmenu terminates.
|
||||
.P
|
||||
dmenu is completely controlled by the keyboard. The following keys are recognized:
|
||||
dmenu is completely controlled by the keyboard. Besides standard Unix line
|
||||
editing and item selection (arrow keys, page up/down, home and end), the
|
||||
following keys are recognized:
|
||||
.TP
|
||||
.B Any printable character
|
||||
Appends the character to the text in the input field. This works as a filter:
|
||||
only items containing this text will be displayed.
|
||||
.TP
|
||||
.B Left/Right (Mod1\-h/Mod1\-l)
|
||||
Select the previous/next item.
|
||||
.TP
|
||||
.B PageUp/PageDown (Mod1\-k/Mod1\-j)
|
||||
Select the first item of the previous/next 'page' of items.
|
||||
.TP
|
||||
.B Home/End (Mod1\-g/Mod1\-G)
|
||||
Select the first/last item.
|
||||
.TP
|
||||
.B Tab (Control\-i)
|
||||
.B Tab (Ctrl\-i)
|
||||
Copy the selected item to the input field.
|
||||
.TP
|
||||
.B Return (Control\-j)
|
||||
Confirm selection and quit (print the selected item to standard output). Returns
|
||||
.B 0
|
||||
on termination.
|
||||
.B Return (Ctrl\-j)
|
||||
Confirm selection. Prints the selected item to stdout and exits, returning
|
||||
success.
|
||||
.TP
|
||||
.B Shift\-Return (Control\-Shift\-j)
|
||||
Confirm selection and quit (print the text in the input field to standard output).
|
||||
Returns
|
||||
.B 0
|
||||
on termination.
|
||||
.B Shift\-Return (Ctrl\-Shift\-j)
|
||||
Confirm input. Prints the input text to stdout and exits, returning success.
|
||||
.TP
|
||||
.B Escape (Control\-bracketleft)
|
||||
Quit without selecting an item. Returns
|
||||
.B 1
|
||||
on termination.
|
||||
.B Escape (Ctrl\-c)
|
||||
Exit without selecting an item, returning failure.
|
||||
.TP
|
||||
.B Backspace (Control\-h)
|
||||
Remove a character from the input field.
|
||||
.TP
|
||||
.B Control\-u
|
||||
Remove all characters from the input field.
|
||||
.TP
|
||||
.B Control\-w
|
||||
Remove all characters of current word from the input field.
|
||||
.B Ctrl\-y
|
||||
Paste the current X selection into the input field.
|
||||
.SH SEE ALSO
|
||||
.BR dwm (1),
|
||||
.BR wmii (1) .
|
||||
.IR dwm (1),
|
||||
.IR lsx (1)
|
||||
|
26
dmenu_path
26
dmenu_path
@@ -1,26 +0,0 @@
|
||||
#!/bin/sh
|
||||
CACHE=$HOME/.dmenu_cache
|
||||
IFS=:
|
||||
|
||||
uptodate() {
|
||||
test ! -f $CACHE && return 1
|
||||
for dir in $PATH
|
||||
do
|
||||
test $dir -nt $CACHE && return 1
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
if ! uptodate
|
||||
then
|
||||
for dir in $PATH
|
||||
do
|
||||
for file in "$dir"/*
|
||||
do
|
||||
test -x "$file" && echo "${file##*/}"
|
||||
done
|
||||
done | sort | uniq > $CACHE.$$
|
||||
mv $CACHE.$$ $CACHE
|
||||
fi
|
||||
|
||||
cat $CACHE
|
9
dmenu_run
Executable file
9
dmenu_run
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
CACHE=${XDG_CACHE_HOME:-"$HOME/.cache"}/dmenu_run
|
||||
(
|
||||
IFS=:
|
||||
if test "`ls -dt $PATH "$CACHE" 2> /dev/null | sed 1q`" != "$CACHE"; then
|
||||
mkdir -p "`dirname "$CACHE"`" && lsx $PATH | sort -u > "$CACHE"
|
||||
fi
|
||||
)
|
||||
cmd=`dmenu "$@" < "$CACHE"` && exec sh -c "$cmd"
|
177
draw.c
Normal file
177
draw.c
Normal file
@@ -0,0 +1,177 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <locale.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include "draw.h"
|
||||
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#define DEFAULTFN "fixed"
|
||||
|
||||
static Bool loadfont(DC *dc, const char *fontstr);
|
||||
|
||||
void
|
||||
drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) {
|
||||
XSetForeground(dc->dpy, dc->gc, color);
|
||||
if(fill)
|
||||
XFillRectangle(dc->dpy, dc->canvas, dc->gc, dc->x + x, dc->y + y, w, h);
|
||||
else
|
||||
XDrawRectangle(dc->dpy, dc->canvas, dc->gc, dc->x + x, dc->y + y, w-1, h-1);
|
||||
}
|
||||
|
||||
void
|
||||
drawtext(DC *dc, const char *text, unsigned long col[ColLast]) {
|
||||
char buf[BUFSIZ];
|
||||
size_t mn, n = strlen(text);
|
||||
|
||||
/* shorten text if necessary */
|
||||
for(mn = MIN(n, sizeof buf); textnw(dc, text, mn) + dc->font.height/2 > dc->w; mn--)
|
||||
if(mn == 0)
|
||||
return;
|
||||
memcpy(buf, text, mn);
|
||||
if(mn < n)
|
||||
for(n = MAX(mn-3, 0); n < mn; buf[n++] = '.');
|
||||
|
||||
drawrect(dc, 0, 0, dc->w, dc->h, True, BG(dc, col));
|
||||
drawtextn(dc, buf, mn, col);
|
||||
}
|
||||
|
||||
void
|
||||
drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]) {
|
||||
int x = dc->x + dc->font.height/2;
|
||||
int y = dc->y + dc->font.ascent+1;
|
||||
|
||||
XSetForeground(dc->dpy, dc->gc, FG(dc, col));
|
||||
if(dc->font.set)
|
||||
XmbDrawString(dc->dpy, dc->canvas, dc->font.set, dc->gc, x, y, text, n);
|
||||
else {
|
||||
XSetFont(dc->dpy, dc->gc, dc->font.xfont->fid);
|
||||
XDrawString(dc->dpy, dc->canvas, dc->gc, x, y, text, n);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
eprintf(const char *fmt, ...) {
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if(fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':') {
|
||||
fputc(' ', stderr);
|
||||
perror(NULL);
|
||||
}
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
void
|
||||
freedc(DC *dc) {
|
||||
if(dc->font.set)
|
||||
XFreeFontSet(dc->dpy, dc->font.set);
|
||||
if(dc->font.xfont)
|
||||
XFreeFont(dc->dpy, dc->font.xfont);
|
||||
if(dc->canvas)
|
||||
XFreePixmap(dc->dpy, dc->canvas);
|
||||
XFreeGC(dc->dpy, dc->gc);
|
||||
XCloseDisplay(dc->dpy);
|
||||
free(dc);
|
||||
}
|
||||
|
||||
unsigned long
|
||||
getcolor(DC *dc, const char *colstr) {
|
||||
Colormap cmap = DefaultColormap(dc->dpy, DefaultScreen(dc->dpy));
|
||||
XColor color;
|
||||
|
||||
if(!XAllocNamedColor(dc->dpy, cmap, colstr, &color, &color))
|
||||
eprintf("cannot allocate color '%s'\n", colstr);
|
||||
return color.pixel;
|
||||
}
|
||||
|
||||
DC *
|
||||
initdc(void) {
|
||||
DC *dc;
|
||||
|
||||
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
|
||||
fputs("no locale support\n", stderr);
|
||||
if(!(dc = calloc(1, sizeof *dc)))
|
||||
eprintf("cannot malloc %u bytes:", sizeof *dc);
|
||||
if(!(dc->dpy = XOpenDisplay(NULL)))
|
||||
eprintf("cannot open display\n");
|
||||
|
||||
dc->gc = XCreateGC(dc->dpy, DefaultRootWindow(dc->dpy), 0, NULL);
|
||||
XSetLineAttributes(dc->dpy, dc->gc, 1, LineSolid, CapButt, JoinMiter);
|
||||
return dc;
|
||||
}
|
||||
|
||||
void
|
||||
initfont(DC *dc, const char *fontstr) {
|
||||
if(!loadfont(dc, fontstr ? fontstr : DEFAULTFN)) {
|
||||
if(fontstr != NULL)
|
||||
fprintf(stderr, "cannot load font '%s'\n", fontstr);
|
||||
if(fontstr == NULL || !loadfont(dc, DEFAULTFN))
|
||||
eprintf("cannot load font '%s'\n", DEFAULTFN);
|
||||
}
|
||||
dc->font.height = dc->font.ascent + dc->font.descent;
|
||||
}
|
||||
|
||||
Bool
|
||||
loadfont(DC *dc, const char *fontstr) {
|
||||
char *def, **missing, **names;
|
||||
int i, n;
|
||||
XFontStruct **xfonts;
|
||||
|
||||
if(!*fontstr)
|
||||
return False;
|
||||
if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) {
|
||||
n = XFontsOfFontSet(dc->font.set, &xfonts, &names);
|
||||
for(i = 0; i < n; i++) {
|
||||
dc->font.ascent = MAX(dc->font.ascent, xfonts[i]->ascent);
|
||||
dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent);
|
||||
dc->font.width = MAX(dc->font.width, xfonts[i]->max_bounds.width);
|
||||
}
|
||||
}
|
||||
else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) {
|
||||
dc->font.ascent = dc->font.xfont->ascent;
|
||||
dc->font.descent = dc->font.xfont->descent;
|
||||
dc->font.width = dc->font.xfont->max_bounds.width;
|
||||
}
|
||||
if(missing)
|
||||
XFreeStringList(missing);
|
||||
return dc->font.set || dc->font.xfont;
|
||||
}
|
||||
|
||||
void
|
||||
mapdc(DC *dc, Window win, unsigned int w, unsigned int h) {
|
||||
XCopyArea(dc->dpy, dc->canvas, win, dc->gc, 0, 0, w, h, 0, 0);
|
||||
}
|
||||
|
||||
void
|
||||
resizedc(DC *dc, unsigned int w, unsigned int h) {
|
||||
if(dc->canvas)
|
||||
XFreePixmap(dc->dpy, dc->canvas);
|
||||
|
||||
dc->w = w;
|
||||
dc->h = h;
|
||||
dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h,
|
||||
DefaultDepth(dc->dpy, DefaultScreen(dc->dpy)));
|
||||
}
|
||||
|
||||
int
|
||||
textnw(DC *dc, const char *text, size_t len) {
|
||||
if(dc->font.set) {
|
||||
XRectangle r;
|
||||
|
||||
XmbTextExtents(dc->font.set, text, len, NULL, &r);
|
||||
return r.width;
|
||||
}
|
||||
return XTextWidth(dc->font.xfont, text, len);
|
||||
}
|
||||
|
||||
int
|
||||
textw(DC *dc, const char *text) {
|
||||
return textnw(dc, text, strlen(text)) + dc->font.height;
|
||||
}
|
35
draw.h
Normal file
35
draw.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
#define FG(dc, col) ((col)[(dc)->invert ? ColBG : ColFG])
|
||||
#define BG(dc, col) ((col)[(dc)->invert ? ColFG : ColBG])
|
||||
|
||||
enum { ColBG, ColFG, ColBorder, ColLast };
|
||||
|
||||
typedef struct {
|
||||
int x, y, w, h;
|
||||
Bool invert;
|
||||
Display *dpy;
|
||||
GC gc;
|
||||
Pixmap canvas;
|
||||
struct {
|
||||
int ascent;
|
||||
int descent;
|
||||
int height;
|
||||
int width;
|
||||
XFontSet set;
|
||||
XFontStruct *xfont;
|
||||
} font;
|
||||
} DC; /* draw context */
|
||||
|
||||
void drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color);
|
||||
void drawtext(DC *dc, const char *text, unsigned long col[ColLast]);
|
||||
void drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]);
|
||||
void eprintf(const char *fmt, ...);
|
||||
void freedc(DC *dc);
|
||||
unsigned long getcolor(DC *dc, const char *colstr);
|
||||
DC *initdc(void);
|
||||
void initfont(DC *dc, const char *fontstr);
|
||||
void mapdc(DC *dc, Window win, unsigned int w, unsigned int h);
|
||||
void resizedc(DC *dc, unsigned int w, unsigned int h);
|
||||
int textnw(DC *dc, const char *text, size_t len);
|
||||
int textw(DC *dc, const char *text);
|
11
lsx.1
Normal file
11
lsx.1
Normal file
@@ -0,0 +1,11 @@
|
||||
.TH LSX 1 dmenu\-VERSION
|
||||
.SH NAME
|
||||
lsx \- list executables
|
||||
.SH SYNOPSIS
|
||||
.B lsx
|
||||
.RI [ directory ...]
|
||||
.SH DESCRIPTION
|
||||
.B lsx
|
||||
lists the executables in each
|
||||
.IR directory .
|
||||
If none are given the current working directory is used.
|
38
lsx.c
Normal file
38
lsx.c
Normal file
@@ -0,0 +1,38 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <dirent.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
static void lsx(const char *dir);
|
||||
|
||||
int
|
||||
main(int argc, char *argv[]) {
|
||||
int i;
|
||||
|
||||
if(argc < 2)
|
||||
lsx(".");
|
||||
else for(i = 1; i < argc; i++)
|
||||
lsx(argv[i]);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
void
|
||||
lsx(const char *dir) {
|
||||
char buf[PATH_MAX];
|
||||
struct dirent *d;
|
||||
struct stat st;
|
||||
DIR *dp;
|
||||
|
||||
if(!(dp = opendir(dir))) {
|
||||
perror(dir);
|
||||
return;
|
||||
}
|
||||
while((d = readdir(dp)))
|
||||
if(snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name) < (int)sizeof buf
|
||||
&& !stat(buf, &st) && S_ISREG(st.st_mode) && access(buf, X_OK) == 0)
|
||||
puts(d->d_name);
|
||||
closedir(dp);
|
||||
}
|
Reference in New Issue
Block a user