new dmenu_run

This commit is contained in:
Connor Lane Smith 2011-06-13 21:50:31 +01:00
parent 8ec1b41cac
commit eadf090413
5 changed files with 15 additions and 26 deletions

View file

@ -35,7 +35,7 @@ clean:
dist: clean dist: clean
@echo creating dist tarball @echo creating dist tarball
@mkdir -p dmenu-${VERSION} @mkdir -p dmenu-${VERSION}
@cp LICENSE Makefile README config.mk dmenu.1 draw.h dmenu_path dmenu_run ${SRC} dmenu-${VERSION} @cp LICENSE Makefile README config.mk dmenu.1 draw.h dmenu_run ${SRC} dmenu-${VERSION}
@tar -cf dmenu-${VERSION}.tar dmenu-${VERSION} @tar -cf dmenu-${VERSION}.tar dmenu-${VERSION}
@gzip dmenu-${VERSION}.tar @gzip dmenu-${VERSION}.tar
@rm -rf dmenu-${VERSION} @rm -rf dmenu-${VERSION}
@ -43,9 +43,8 @@ dist: clean
install: all install: all
@echo installing executables to ${DESTDIR}${PREFIX}/bin @echo installing executables to ${DESTDIR}${PREFIX}/bin
@mkdir -p ${DESTDIR}${PREFIX}/bin @mkdir -p ${DESTDIR}${PREFIX}/bin
@cp -f dmenu dmenu_path dmenu_run lsx ${DESTDIR}${PREFIX}/bin @cp -f dmenu dmenu_run lsx ${DESTDIR}${PREFIX}/bin
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_path
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_run @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_run
@chmod 755 ${DESTDIR}${PREFIX}/bin/lsx @chmod 755 ${DESTDIR}${PREFIX}/bin/lsx
@echo installing manual pages to ${DESTDIR}${MANPREFIX}/man1 @echo installing manual pages to ${DESTDIR}${MANPREFIX}/man1
@ -58,7 +57,6 @@ install: all
uninstall: uninstall:
@echo removing executables from ${DESTDIR}${PREFIX}/bin @echo removing executables from ${DESTDIR}${PREFIX}/bin
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu @rm -f ${DESTDIR}${PREFIX}/bin/dmenu
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu_path
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu_run @rm -f ${DESTDIR}${PREFIX}/bin/dmenu_run
@rm -f ${DESTDIR}${PREFIX}/bin/lsx @rm -f ${DESTDIR}${PREFIX}/bin/lsx
@echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1

11
dmenu.1
View file

@ -23,12 +23,10 @@ dmenu \- dynamic menu
.RB [ \-v ] .RB [ \-v ]
.P .P
.BR dmenu_run " ..." .BR dmenu_run " ..."
.P
.B dmenu_path
.SH DESCRIPTION .SH DESCRIPTION
.B dmenu .B dmenu
is a dynamic menu for X, originally designed for is a dynamic menu for X, originally designed for
.BR dwm (1). .IR dwm (1).
It manages huge numbers of user\-defined menu items efficiently. It manages huge numbers of user\-defined menu items efficiently.
.P .P
dmenu reads a list of newline\-separated items from stdin and creates a menu. dmenu reads a list of newline\-separated items from stdin and creates a menu.
@ -36,11 +34,8 @@ When the user selects an item or enters any text and presses Return, their
choice is printed to stdout and dmenu terminates. choice is printed to stdout and dmenu terminates.
.P .P
.B dmenu_run .B dmenu_run
is a dmenu script used by dwm which lists programs in the user's PATH and is a dmenu script used by dwm which lists programs in the user's $PATH and
executes the selected item. executes the selected item.
.P
.B dmenu_path
is a script used by dmenu_run to find and cache a list of executables.
.SH OPTIONS .SH OPTIONS
.TP .TP
.B \-b .B \-b
@ -100,4 +95,4 @@ Exit without selecting an item, returning failure.
.B Ctrl\-y .B Ctrl\-y
Paste the current X selection into the input field. Paste the current X selection into the input field.
.SH SEE ALSO .SH SEE ALSO
.BR dwm (1) .IR dwm (1)

View file

@ -1,9 +0,0 @@
#!/bin/sh
CACHE=$HOME/.dmenu_cache
IFS=:
if ! test -f "$CACHE" || find $PATH -type d -newer "$CACHE" | grep -q .; then
lsx $PATH | sort -u > "$CACHE"
fi
cat "$CACHE"

View file

@ -1,2 +1,9 @@
#!/bin/sh #!/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 $cmd

6
lsx.c
View file

@ -6,7 +6,7 @@
#include <unistd.h> #include <unistd.h>
#include <sys/stat.h> #include <sys/stat.h>
static void lsx(const char *s); static void lsx(const char *dir);
int int
main(int argc, char *argv[]) { main(int argc, char *argv[]) {
@ -34,9 +34,7 @@ lsx(const char *dir) {
} }
while((d = readdir(dp))) { while((d = readdir(dp))) {
snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name); snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name);
if(stat(buf, &st) == -1) if(stat(buf, &st) == 0 && S_ISREG(st.st_mode) && access(buf, X_OK) == 0)
perror(buf);
else if(S_ISREG(st.st_mode) && access(buf, X_OK) == 0)
puts(d->d_name); puts(d->d_name);
} }
closedir(dp); closedir(dp);