diff options
| -rw-r--r-- | Makefile | 25 | ||||
| -rw-r--r-- | dmenu.1 | 12 | ||||
| -rwxr-xr-x | dmenu_path | 9 | ||||
| -rwxr-xr-x | dmenu_run | 9 | ||||
| -rw-r--r-- | lsx.1 | 11 | ||||
| -rw-r--r-- | lsx.c | 38 |
6 files changed, 77 insertions, 27 deletions
| @@ -3,10 +3,10 @@ | |||
| 3 | 3 | ||
| 4 | include config.mk | 4 | include config.mk |
| 5 | 5 | ||
| 6 | SRC = dmenu.c draw.c | 6 | SRC = dmenu.c draw.c lsx.c |
| 7 | OBJ = ${SRC:.c=.o} | 7 | OBJ = ${SRC:.c=.o} |
| 8 | 8 | ||
| 9 | all: options dmenu | 9 | all: options dmenu lsx |
| 10 | 10 | ||
| 11 | options: | 11 | options: |
| 12 | @echo dmenu build options: | 12 | @echo dmenu build options: |
| @@ -20,9 +20,13 @@ options: | |||
| 20 | 20 | ||
| 21 | ${OBJ}: config.mk | 21 | ${OBJ}: config.mk |
| 22 | 22 | ||
| 23 | dmenu: ${OBJ} | 23 | dmenu: dmenu.o draw.o |
| 24 | @echo CC -o $@ | 24 | @echo CC -o $@ |
| 25 | @${CC} -o $@ ${OBJ} ${LDFLAGS} | 25 | @${CC} -o $@ dmenu.o draw.o ${LDFLAGS} |
| 26 | |||
| 27 | lsx: lsx.o | ||
| 28 | @echo CC -o $@ | ||
| 29 | @${CC} -o $@ lsx.o ${LDFLAGS} | ||
| 26 | 30 | ||
| 27 | clean: | 31 | clean: |
| 28 | @echo cleaning | 32 | @echo cleaning |
| @@ -31,7 +35,7 @@ clean: | |||
| 31 | dist: clean | 35 | dist: clean |
| 32 | @echo creating dist tarball | 36 | @echo creating dist tarball |
| 33 | @mkdir -p dmenu-${VERSION} | 37 | @mkdir -p dmenu-${VERSION} |
| 34 | @cp LICENSE Makefile README config.mk dmenu.1 draw.h dmenu_path dmenu_run ${SRC} dmenu-${VERSION} | 38 | @cp LICENSE Makefile README config.mk dmenu.1 draw.h dmenu_run ${SRC} dmenu-${VERSION} |
| 35 | @tar -cf dmenu-${VERSION}.tar dmenu-${VERSION} | 39 | @tar -cf dmenu-${VERSION}.tar dmenu-${VERSION} |
| 36 | @gzip dmenu-${VERSION}.tar | 40 | @gzip dmenu-${VERSION}.tar |
| 37 | @rm -rf dmenu-${VERSION} | 41 | @rm -rf dmenu-${VERSION} |
| @@ -39,21 +43,24 @@ dist: clean | |||
| 39 | install: all | 43 | install: all |
| 40 | @echo installing executables to ${DESTDIR}${PREFIX}/bin | 44 | @echo installing executables to ${DESTDIR}${PREFIX}/bin |
| 41 | @mkdir -p ${DESTDIR}${PREFIX}/bin | 45 | @mkdir -p ${DESTDIR}${PREFIX}/bin |
| 42 | @cp -f dmenu dmenu_path dmenu_run ${DESTDIR}${PREFIX}/bin | 46 | @cp -f dmenu dmenu_run lsx ${DESTDIR}${PREFIX}/bin |
| 43 | @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu | 47 | @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu |
| 44 | @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_path | ||
| 45 | @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_run | 48 | @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_run |
| 46 | @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 | 49 | @chmod 755 ${DESTDIR}${PREFIX}/bin/lsx |
| 50 | @echo installing manual pages to ${DESTDIR}${MANPREFIX}/man1 | ||
| 47 | @mkdir -p ${DESTDIR}${MANPREFIX}/man1 | 51 | @mkdir -p ${DESTDIR}${MANPREFIX}/man1 |
| 48 | @sed "s/VERSION/${VERSION}/g" < dmenu.1 > ${DESTDIR}${MANPREFIX}/man1/dmenu.1 | 52 | @sed "s/VERSION/${VERSION}/g" < dmenu.1 > ${DESTDIR}${MANPREFIX}/man1/dmenu.1 |
| 53 | @sed "s/VERSION/${VERSION}/g" < lsx.1 > ${DESTDIR}${MANPREFIX}/man1/lsx.1 | ||
| 49 | @chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1 | 54 | @chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1 |
| 55 | @chmod 644 ${DESTDIR}${MANPREFIX}/man1/lsx.1 | ||
| 50 | 56 | ||
| 51 | uninstall: | 57 | uninstall: |
| 52 | @echo removing executables from ${DESTDIR}${PREFIX}/bin | 58 | @echo removing executables from ${DESTDIR}${PREFIX}/bin |
| 53 | @rm -f ${DESTDIR}${PREFIX}/bin/dmenu | 59 | @rm -f ${DESTDIR}${PREFIX}/bin/dmenu |
| 54 | @rm -f ${DESTDIR}${PREFIX}/bin/dmenu_path | ||
| 55 | @rm -f ${DESTDIR}${PREFIX}/bin/dmenu_run | 60 | @rm -f ${DESTDIR}${PREFIX}/bin/dmenu_run |
| 61 | @rm -f ${DESTDIR}${PREFIX}/bin/lsx | ||
| 56 | @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 | 62 | @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 |
| 57 | @rm -f ${DESTDIR}${MANPREFIX}/man1/dmenu.1 | 63 | @rm -f ${DESTDIR}${MANPREFIX}/man1/dmenu.1 |
| 64 | @rm -f ${DESTDIR}${MANPREFIX}/man1/lsx.1 | ||
| 58 | 65 | ||
| 59 | .PHONY: all options clean dist install uninstall | 66 | .PHONY: all options clean dist install uninstall |
| @@ -23,12 +23,10 @@ dmenu \- dynamic menu | |||
| 23 | .RB [ \-v ] | 23 | .RB [ \-v ] |
| 24 | .P | 24 | .P |
| 25 | .BR dmenu_run " ..." | 25 | .BR dmenu_run " ..." |
| 26 | .P | ||
| 27 | .B dmenu_path | ||
| 28 | .SH DESCRIPTION | 26 | .SH DESCRIPTION |
| 29 | .B dmenu | 27 | .B dmenu |
| 30 | is a dynamic menu for X, originally designed for | 28 | is a dynamic menu for X, originally designed for |
| 31 | .BR dwm (1). | 29 | .IR dwm (1). |
| 32 | It manages huge numbers of user\-defined menu items efficiently. | 30 | It manages huge numbers of user\-defined menu items efficiently. |
| 33 | .P | 31 | .P |
| 34 | dmenu reads a list of newline\-separated items from stdin and creates a menu. | 32 | 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 | |||
| 36 | choice is printed to stdout and dmenu terminates. | 34 | choice is printed to stdout and dmenu terminates. |
| 37 | .P | 35 | .P |
| 38 | .B dmenu_run | 36 | .B dmenu_run |
| 39 | is a dmenu script used by dwm which lists programs in the user's PATH and | 37 | is a dmenu script used by dwm which lists programs in the user's $PATH and |
| 40 | executes the selected item. | 38 | executes the selected item. |
| 41 | .P | ||
| 42 | .B dmenu_path | ||
| 43 | is a script used by dmenu_run to find and cache a list of executables. | ||
| 44 | .SH OPTIONS | 39 | .SH OPTIONS |
| 45 | .TP | 40 | .TP |
| 46 | .B \-b | 41 | .B \-b |
| @@ -100,4 +95,5 @@ Exit without selecting an item, returning failure. | |||
| 100 | .B Ctrl\-y | 95 | .B Ctrl\-y |
| 101 | Paste the current X selection into the input field. | 96 | Paste the current X selection into the input field. |
| 102 | .SH SEE ALSO | 97 | .SH SEE ALSO |
| 103 | .BR dwm (1) | 98 | .IR dwm (1), |
| 99 | .IR lsx (1) | ||
diff --git a/dmenu_path b/dmenu_path deleted file mode 100755 index 1b1b241..0000000 --- a/dmenu_path +++ /dev/null | |||
| @@ -1,9 +0,0 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | CACHE=$HOME/.dmenu_cache | ||
| 3 | IFS=: | ||
| 4 | |||
| 5 | if ! test -f "$CACHE" || find $PATH -type d -newer "$CACHE" | grep -q .; then | ||
| 6 | find $PATH ! -type d \( -perm -1 -o -perm -10 -o -perm -100 \) | sed 's/.*\///' | sort -u > "$CACHE" | ||
| 7 | fi | ||
| 8 | |||
| 9 | cat "$CACHE" | ||
| @@ -1,2 +1,9 @@ | |||
| 1 | #!/bin/sh | 1 | #!/bin/sh |
| 2 | exe=`dmenu_path | dmenu ${1+"$@"}` && exec $exe | 2 | CACHE=${XDG_CACHE_HOME:-"$HOME/.cache"}/dmenu_run |
| 3 | ( | ||
| 4 | IFS=: | ||
| 5 | if test "`ls -dt $PATH "$CACHE" 2> /dev/null | sed 1q`" != "$CACHE"; then | ||
| 6 | mkdir -p "`dirname "$CACHE"`" && lsx $PATH | sort -u > "$CACHE" | ||
| 7 | fi | ||
| 8 | ) | ||
| 9 | cmd=`dmenu "$@" < "$CACHE"` && exec $cmd | ||
| @@ -0,0 +1,11 @@ | |||
| 1 | .TH LSX 1 dmenu\-VERSION | ||
| 2 | .SH NAME | ||
| 3 | lsx \- list executables | ||
| 4 | .SH SYNOPSIS | ||
| 5 | .B lsx | ||
| 6 | .RI [ directory ...] | ||
| 7 | .SH DESCRIPTION | ||
| 8 | .B lsx | ||
| 9 | lists the executables in each | ||
| 10 | .IR directory . | ||
| 11 | If none are given the current working directory is used. | ||
| @@ -0,0 +1,38 @@ | |||
| 1 | /* See LICENSE file for copyright and license details. */ | ||
| 2 | #include <dirent.h> | ||
| 3 | #include <stdio.h> | ||
| 4 | #include <stdlib.h> | ||
| 5 | #include <string.h> | ||
| 6 | #include <unistd.h> | ||
| 7 | #include <sys/stat.h> | ||
| 8 | |||
| 9 | static void lsx(const char *dir); | ||
| 10 | |||
| 11 | int | ||
| 12 | main(int argc, char *argv[]) { | ||
| 13 | int i; | ||
| 14 | |||
| 15 | if(argc < 2) | ||
| 16 | lsx("."); | ||
| 17 | else for(i = 1; i < argc; i++) | ||
| 18 | lsx(argv[i]); | ||
| 19 | return EXIT_SUCCESS; | ||
| 20 | } | ||
| 21 | |||
| 22 | void | ||
| 23 | lsx(const char *dir) { | ||
| 24 | char buf[PATH_MAX]; | ||
| 25 | struct dirent *d; | ||
| 26 | struct stat st; | ||
| 27 | DIR *dp; | ||
| 28 | |||
| 29 | if(!(dp = opendir(dir))) { | ||
| 30 | perror(dir); | ||
| 31 | return; | ||
| 32 | } | ||
| 33 | while((d = readdir(dp))) | ||
| 34 | if(snprintf(buf, sizeof buf, "%s/%s", dir, d->d_name) < sizeof buf | ||
| 35 | && !stat(buf, &st) && S_ISREG(st.st_mode) && access(buf, X_OK) == 0) | ||
| 36 | puts(d->d_name); | ||
| 37 | closedir(dp); | ||
| 38 | } | ||
