Compare commits

..

131 Commits
4.1.1 ... 4.4.1

Author SHA1 Message Date
91dc06d0b8 prepare 4.4.1 release 2011-09-19 10:41:30 +01:00
3af80cd7d8 change version to 'hg' 2011-09-19 10:40:07 +01:00
4692f84ff0 dmenu_run: sh -c 2011-07-24 20:04:58 +01:00
c805dcbeaf fix loadfont 2011-07-22 18:16:57 +01:00
a6cbc6c9a7 Added tag 4.4 for changeset 2b105eaae831 2011-07-19 21:30:14 +01:00
bae58f61cf add lsx.1 to dist 2011-07-19 21:30:09 +01:00
1636e12210 tweaks 2011-07-17 14:06:53 +01:00
2b92c95230 efficiency tweaks 2011-07-14 20:03:08 +01:00
16a0c0d52a fix extra warning 2011-07-14 20:03:00 +01:00
5867c53390 simpler vline 2011-07-06 13:40:36 +01:00
34a816f87d rebind ^N ^P 2011-07-04 16:55:09 +01:00
0288b576ca include limits.h 2011-06-25 17:02:14 +01:00
59dafc4ad6 make clean lsx 2011-06-23 22:39:20 +01:00
49672e9d05 merge lsx -> default 2011-06-23 20:27:28 +01:00
07d452e0c8 close lsx branch 2011-06-23 20:26:57 +01:00
88d44169e9 lsx: check snprintf 2011-06-23 20:04:50 +01:00
f7cbe710a2 update draw.c 2011-06-18 22:11:19 +01:00
86e9e6f1ec simpler lsx 2011-06-18 07:50:46 +01:00
eadf090413 new dmenu_run 2011-06-13 21:50:31 +01:00
8ec1b41cac add lsx.1 2011-06-13 19:32:45 +01:00
ab3bcac0bf new lsx branch 2011-06-13 19:28:30 +01:00
723cbabc12 add ^M 2011-06-13 19:25:40 +01:00
86775cc44b Added tag 4.3.1 for changeset 34a2d77049a9 2011-05-18 17:01:59 +01:00
2103ae2891 bugfix 2011-05-18 17:01:44 +01:00
b028ec0e07 Added tag 4.3 for changeset 14c79f054bdf 2011-05-18 16:21:45 +01:00
bb3e33def3 no -m, cleanup 2011-05-18 16:20:03 +01:00
3a60b19514 fix possible overflow 2011-05-16 23:35:14 +01:00
dd2f298252 fixed extra warnings 2011-05-16 12:59:31 +01:00
11ea52d170 portability 2011-05-15 21:54:26 +01:00
4354074607 efficient incremental search 2011-05-15 16:05:32 +01:00
4776d6dc61 match first 2011-05-15 14:21:00 +01:00
d0051e7bb8 faster grab 2011-05-15 14:13:31 +01:00
fb67bd666e cleanup 2011-05-15 13:58:54 +01:00
f5bd1eed8d fast but inexact 2011-05-15 13:02:33 +01:00
1654d6cd62 cleanup 2011-05-15 02:37:49 +01:00
6cc0b0dc08 increment version 2011-05-14 23:26:41 +01:00
b2bb6ebec9 only match links 2011-05-14 23:21:38 +01:00
a662fc6e0a follow symlinks 2011-05-14 23:14:31 +01:00
d066975e78 cleanup 2011-05-14 22:43:42 +01:00
26236a4900 whoops, wrong dmenu_path version 2011-05-14 22:12:28 +01:00
15505bd711 fast dmenu_path script 2011-05-14 20:43:11 +01:00
86468aafe5 instant ^E 2011-05-14 18:39:27 +01:00
be9afce035 fix typo 2011-05-14 17:47:12 +01:00
3c067598fc use array for items 2011-05-14 17:46:20 +01:00
86019c5855 fixed xinerama corner case 2011-05-12 13:17:41 +01:00
0291c722fb fixed -m bug (thanks Rob) 2011-05-11 12:25:50 +01:00
e0e6b071c6 fast grab patch (thanks Rob) 2011-05-08 15:15:24 +01:00
cd3b4915c3 helpful errors 2011-05-06 21:13:02 +01:00
210b303941 paring 2011-05-05 15:46:48 +01:00
47e3e8be7b update license 2011-01-07 18:55:00 +00:00
d515d2758f cache option in config.mk 2011-01-07 18:54:40 +00:00
a8ea79715f gmake spews 2010-12-01 20:25:10 +00:00
3e0a141016 posix makefile 2010-12-01 20:23:16 +00:00
cbd8257914 Added tag 4.2.1 for changeset abb6579a324f 2010-11-20 09:25:08 +00:00
22cf9626c7 fixed dist target bug 2010-11-20 09:25:04 +00:00
9e13ecabe8 Added tag 4.2 for changeset 379813a051f0 2010-11-19 11:51:01 +00:00
266f3dd311 removed unnecessary defines 2010-11-17 04:51:30 +00:00
8d9ade36de moved main, updated args 2010-11-17 04:33:34 +00:00
da81f57f6d fixed config.mk dep 2010-11-12 00:30:03 +00:00
c1241bcba3 updated manpage 2010-11-12 00:01:54 +00:00
eeba6221b1 rebound paste to ^Y 2010-11-12 00:00:32 +00:00
a0a99d10e1 removed libdc dependence 2010-11-11 23:56:39 +00:00
7cf66b443a -m flag to fix dwm selmon bug 2010-11-02 12:15:15 +00:00
038a78a3f4 updated manpage 2010-10-08 23:40:11 +01:00
e0add428d2 cleaned up 2010-10-08 23:36:45 +01:00
bf7b8e37ee dmenu_path.c (shell is a bottleneck) 2010-10-08 23:24:22 +01:00
610a0a8d12 fixed linking bug (thanks Jacob Nixdorf) & iscntrl corner case 2010-09-13 14:22:02 +01:00
f0818217b3 simplification 2010-09-11 19:48:10 +01:00
3c366bd73d update to libdc, fixed utf8 bug 2010-09-11 13:37:01 +01:00
75a19c35bd arrow offset 2010-08-20 19:57:13 +01:00
a5f31f5707 fixed width bug 2010-08-20 19:42:58 +01:00
b81c1e88cd rebound paste, removed useless max widths 2010-08-20 13:50:44 +01:00
5376113039 new libdraw 2010-08-19 16:43:39 +01:00
c7a8f17bd2 new libdraw 2010-08-19 16:17:57 +01:00
128d4cf376 resorted globals 2010-08-18 17:35:23 +01:00
e4fdaba88d signed ints, ignore negative -l value 2010-08-18 17:33:34 +01:00
849f1dd7a3 fixed insert segfault, added nextrune 2010-08-12 15:35:51 +01:00
402dc2bc95 fixed paste 2010-08-11 15:02:03 +01:00
00a60cb7b2 new libdraw, replaced cistrstr with fstrstr, simpler readstdin 2010-08-11 14:24:25 +01:00
e149c531b8 more efficient initfont 2010-08-10 18:09:02 +01:00
605e9b6c03 reverted calcoffsets 2010-08-10 14:14:37 +01:00
caf5246268 simplifications 2010-08-10 13:38:49 +01:00
93af72e116 cursor fix + style 2010-08-09 11:54:46 +01:00
0b8072a5a9 added ^D, removed ^M 2010-08-06 14:16:08 +01:00
31ffcd3b9a new libdraw, typo fixes 2010-08-05 15:41:56 +01:00
9cf07b4b9b another typo fix (thanks, Gene Auyeung) 2010-08-03 18:19:59 +01:00
7a2782d02d typo fix 2010-08-03 17:29:53 +01:00
1c91c2a99c cleaned up 2010-08-03 17:18:24 +01:00
b7695fa98c merged *{h,v} functions 2010-08-03 17:10:29 +01:00
b54c179d58 retyped promptw 2010-08-02 15:13:33 +01:00
06c18808b6 replaced promptw 2010-08-02 14:49:14 +01:00
a7aee433cc fixed bugs, no more config.h, updated manpage, new libdraw 2010-08-02 14:22:54 +01:00
a3606ecb0e updated manpage, added paste, cleaned up, new libdraw 2010-07-31 14:56:27 +01:00
7d5fe17391 merged dmenu & dinput (clunky interface) 2010-07-30 13:40:56 +01:00
7f36736d11 underline match 2010-07-30 10:26:12 +01:00
115c01b74e new libdraw 2010-07-30 10:25:55 +01:00
d77340ed53 fixed vlist select 2010-07-30 09:18:35 +01:00
da7a799121 updated to libdraw tip 2010-07-27 13:40:32 +01:00
855a566319 added dmenu.h, common.c 2010-07-02 06:49:05 +01:00
29e8faed6c updated to new libdraw 2010-07-02 05:50:19 +01:00
d9c24564d2 atexit cleanup 2010-07-02 03:44:01 +01:00
6ba5103df4 removed -e flag (too buggy), cleaned up 2010-06-30 22:42:15 +01:00
309d071df5 fixed no-input invisible text bug 2010-06-30 10:45:24 +01:00
26b9f3de0f libdraw now has own repo 2010-06-30 01:36:15 +01:00
7afd296c40 resizing vlist, new dinput binding 2010-06-30 00:52:14 +01:00
cc8b3b999b cleaned up 2010-06-30 00:05:32 +01:00
f2abaf8b30 decosmetics 2010-06-29 19:19:20 +01:00
340b176de6 dinput with dmenu flags, fixed usage & -v, cosmetics 2010-06-29 16:07:31 +01:00
18dcf73896 extended libdraw 2010-06-28 06:09:34 +01:00
9f3b0c6ea8 cleaned up 2010-06-25 04:33:41 +01:00
4508fd2c4e moved draw.c to libdraw.a 2010-06-24 17:44:35 +01:00
723361fa12 removed colors from dc 2010-06-24 16:24:04 +01:00
96c65400cc decoupled draw.c from dmenu & dinput 2010-06-24 16:18:18 +01:00
6c1d0e4d60 fixed offsets, updated eprint, cleaned up 2010-06-24 14:22:34 +01:00
6efe1932be fixed static symbols in config.def.h 2010-06-24 11:30:30 +01:00
8f7b62e2b6 fixed makefile 2010-06-23 14:29:32 +01:00
2ec16d9cb2 cleaned up 2010-06-23 13:49:24 +01:00
146bc23c11 cleaned up 2010-06-23 13:31:11 +01:00
595e797660 added draw.h 2010-06-23 13:29:15 +01:00
bba30e2686 overlapping code 2010-06-23 12:42:08 +01:00
08b264393d typo fixes 2010-06-23 12:15:07 +01:00
b4e63454e5 initial dmenu / dinput separation 2010-06-23 12:04:54 +01:00
bff1526d31 fixed vlist cursor 2010-06-22 10:45:07 +01:00
9a33a72c6a updated manpage, changed keybinds
M- binds tend to be wm level, and there were up to 3 binds for the same action
M-{hjkl} also no longer made sense in vlist mode
2010-06-20 15:04:15 +01:00
97797d90a6 cleaned up 2010-06-20 01:19:17 +01:00
4983707c70 added ^K, optimisations 2010-06-20 00:44:26 +01:00
4229fb7b78 added sselp requirement to readme 2010-06-19 21:44:32 +01:00
b27ffbd78b cleaned up 2010-06-16 15:36:17 +01:00
6366f94e36 fixed vlist paging, cleaned up 2010-06-11 09:24:33 +01:00
645f1d0dfc updated manpage 2010-06-09 10:13:26 +01:00
d7d14e53da Added tag 4.1.1 for changeset 72749a826cab 2010-05-29 12:56:37 +01:00
14 changed files with 756 additions and 817 deletions

View File

@ -41,3 +41,9 @@ e4c81a78ffbad6ba4d1ad119cc654da6eca63a4c 3.2
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

View File

@ -1,7 +1,7 @@
MIT/X Consortium License
© 2010 Connor Lane Smith <cls@lubutu.com>
© 2006-2010 Anselm R Garbe <anselm@garbe.us>
© 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>

View File

@ -3,10 +3,10 @@
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,48 +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
config.h:
@echo creating $@ from config.def.h
@cp config.def.h $@
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.def.h dmenu_path dmenu_run ${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 dmenu_run ${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
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_run
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
@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
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu ${DESTDIR}${PREFIX}/bin/dmenu_run
@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
View File

@ -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

View File

@ -1,9 +0,0 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
static const char *font = "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*";
static const char *normbgcolor = "#cccccc";
static const char *normfgcolor = "#000000";
static const char *selbgcolor = "#0066ff";
static const char *selfgcolor = "#ffffff";
static unsigned int spaceitem = 30; /* px between menu items */

View File

@ -1,7 +1,5 @@
# dmenu version
VERSION = 4.1.1
# Customize below to fit your system
VERSION = 4.4.1
# paths
PREFIX = /usr/local
@ -11,21 +9,17 @@ X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib
# Xinerama, comment if you don't want it
XINERAMALIBS = -L${X11LIB} -lXinerama
XINERAMALIBS = -lXinerama
XINERAMAFLAGS = -DXINERAMA
# includes and libs
INCS = -I. -I/usr/include -I${X11INC}
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS}
INCS = -I${X11INC}
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
# flags
CPPFLAGS = -D_BSD_SOURCE -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
LDFLAGS = -s ${LIBS}
# Solaris
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = ${LIBS}
CFLAGS = -ansi -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
LDFLAGS = -s ${LIBS}
# compiler and linker
CC = cc

148
dmenu.1
View File

@ -3,101 +3,97 @@
dmenu \- dynamic menu
.SH SYNOPSIS
.B dmenu
.RB [ \-i ]
.RB [ \-b ]
.RB [ \-l " <lines>"]
.RB [ \-fn " <font>"]
.RB [ \-nb " <color>"]
.RB [ \-nf " <color>"]
.RB [ \-p " <prompt>"]
.RB [ \-sb " <color>"]
.RB [ \-sf " <color>"]
.RB [ \-f ]
.RB [ \-i ]
.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
.TP
.B \-i
makes dmenu match menu entries case insensitively.
.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
defines that dmenu appears at the bottom.
dmenu appears at the bottom of the screen.
.TP
.B \-l <lines>
activates vertical list mode.
The given number of lines will be displayed. Window height will get adjusted.
.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 \-fn <font>
defines the font.
.B \-i
dmenu matches menu items case insensitively.
.TP
.B \-nb <color>
defines the normal background color (#RGB, #RRGGBB, and color names are supported).
.BI \-l " lines"
dmenu lists items vertically, with the given number of lines.
.TP
.B \-nf <color>
defines the normal foreground 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 \-p <prompt>
defines a prompt to be displayed before the input area.
.BI \-fn " font"
defines the font or font set used.
.TP
.B \-sb <color>
defines the selected background color (#RGB, #RRGGBB, and color names are supported).
.BI \-nb " color"
defines the normal background color.
.IR #RGB ,
.IR #RRGGBB ,
and X color names are supported.
.TP
.B \-sf <color>
defines the selected foreground color (#RGB, #RRGGBB, and color names are supported).
.BI \-nf " color"
defines the normal foreground color.
.TP
.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 (Up/Down) (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)

1042
dmenu.c

File diff suppressed because it is too large Load Diff

View File

@ -1,26 +0,0 @@
#!/bin/sh
CACHE=$HOME/.dmenu_cache
IFS=:
uptodate() {
test -f "$CACHE" &&
for dir in $PATH
do
test ! $dir -nt "$CACHE" || return 1
done
}
if ! uptodate
then
for dir in $PATH
do
cd "$dir" &&
for file in *
do
test -x "$file" && echo "$file"
done
done | sort | uniq > "$CACHE".$$ &&
mv "$CACHE".$$ "$CACHE"
fi
cat "$CACHE"

View File

@ -1,2 +1,9 @@
#!/bin/sh
exe=`dmenu_path | dmenu ${1+"$@"}` && exec $exe
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
View 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
View 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
View 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
View 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);
}