@@ -3,10 +3,10 @@ | |||||
include config.mk | include config.mk | ||||
SRC = dmenu.c draw.c | |||||
SRC = dmenu.c draw.c lsx.c | |||||
OBJ = ${SRC:.c=.o} | OBJ = ${SRC:.c=.o} | ||||
all: options dmenu | |||||
all: options dmenu lsx | |||||
options: | options: | ||||
@echo dmenu build options: | @echo dmenu build options: | ||||
@@ -20,9 +20,13 @@ options: | |||||
${OBJ}: config.mk | ${OBJ}: config.mk | ||||
dmenu: ${OBJ} | |||||
dmenu: dmenu.o draw.o | |||||
@echo CC -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: | clean: | ||||
@echo cleaning | @echo cleaning | ||||
@@ -31,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} | ||||
@@ -39,21 +43,24 @@ 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 ${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 | ||||
@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 | @mkdir -p ${DESTDIR}${MANPREFIX}/man1 | ||||
@sed "s/VERSION/${VERSION}/g" < dmenu.1 > ${DESTDIR}${MANPREFIX}/man1/dmenu.1 | @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/dmenu.1 | ||||
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/lsx.1 | |||||
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 | |||||
@echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 | @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 | ||||
@rm -f ${DESTDIR}${MANPREFIX}/man1/dmenu.1 | @rm -f ${DESTDIR}${MANPREFIX}/man1/dmenu.1 | ||||
@rm -f ${DESTDIR}${MANPREFIX}/man1/lsx.1 | |||||
.PHONY: all options clean dist install uninstall | .PHONY: all options clean dist install uninstall |
@@ -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,5 @@ 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), | |||||
.IR lsx (1) |
@@ -1,9 +0,0 @@ | |||||
#!/bin/sh | |||||
CACHE=$HOME/.dmenu_cache | |||||
IFS=: | |||||
if ! test -f "$CACHE" || find $PATH -type d -newer "$CACHE" | grep -q .; then | |||||
find $PATH ! -type d \( -perm -1 -o -perm -10 -o -perm -100 \) | sed 's/.*\///' | sort -u > "$CACHE" | |||||
fi | |||||
cat "$CACHE" |
@@ -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 |
@@ -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. |
@@ -0,0 +1,38 @@ | |||||
/* See LICENSE file for copyright and license details. */ | |||||
#include <dirent.h> | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <string.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) < sizeof buf | |||||
&& !stat(buf, &st) && S_ISREG(st.st_mode) && access(buf, X_OK) == 0) | |||||
puts(d->d_name); | |||||
closedir(dp); | |||||
} |