merge lsx -> default
49672e9d
6 file(s) · +77 −27
| 3 | 3 | ||
| 4 | 4 | include config.mk |
|
| 5 | 5 | ||
| 6 | - | SRC = dmenu.c draw.c |
|
| 6 | + | SRC = dmenu.c draw.c lsx.c |
|
| 7 | 7 | OBJ = ${SRC:.c=.o} |
|
| 8 | 8 | ||
| 9 | - | all: options dmenu |
|
| 9 | + | all: options dmenu lsx |
|
| 10 | 10 | ||
| 11 | 11 | options: |
|
| 12 | 12 | @echo dmenu build options: |
|
| 20 | 20 | ||
| 21 | 21 | ${OBJ}: config.mk |
|
| 22 | 22 | ||
| 23 | - | dmenu: ${OBJ} |
|
| 23 | + | dmenu: dmenu.o draw.o |
|
| 24 | + | @echo CC -o $@ |
|
| 25 | + | @${CC} -o $@ dmenu.o draw.o ${LDFLAGS} |
|
| 26 | + | ||
| 27 | + | lsx: lsx.o |
|
| 24 | 28 | @echo CC -o $@ |
|
| 25 | - | @${CC} -o $@ ${OBJ} ${LDFLAGS} |
|
| 29 | + | @${CC} -o $@ lsx.o ${LDFLAGS} |
|
| 26 | 30 | ||
| 27 | 31 | clean: |
|
| 28 | 32 | @echo cleaning |
|
| 31 | 35 | dist: clean |
|
| 32 | 36 | @echo creating dist tarball |
|
| 33 | 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 | 39 | @tar -cf dmenu-${VERSION}.tar dmenu-${VERSION} |
|
| 36 | 40 | @gzip dmenu-${VERSION}.tar |
|
| 37 | 41 | @rm -rf dmenu-${VERSION} |
|
| 39 | 43 | install: all |
|
| 40 | 44 | @echo installing executables to ${DESTDIR}${PREFIX}/bin |
|
| 41 | 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 | 47 | @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu |
|
| 44 | - | @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu_path |
|
| 45 | 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 | 51 | @mkdir -p ${DESTDIR}${MANPREFIX}/man1 |
|
| 48 | 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 | 54 | @chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1 |
|
| 55 | + | @chmod 644 ${DESTDIR}${MANPREFIX}/man1/lsx.1 |
|
| 50 | 56 | ||
| 51 | 57 | uninstall: |
|
| 52 | 58 | @echo removing executables from ${DESTDIR}${PREFIX}/bin |
|
| 53 | 59 | @rm -f ${DESTDIR}${PREFIX}/bin/dmenu |
|
| 54 | - | @rm -f ${DESTDIR}${PREFIX}/bin/dmenu_path |
|
| 55 | 60 | @rm -f ${DESTDIR}${PREFIX}/bin/dmenu_run |
|
| 61 | + | @rm -f ${DESTDIR}${PREFIX}/bin/lsx |
|
| 56 | 62 | @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 |
|
| 57 | 63 | @rm -f ${DESTDIR}${MANPREFIX}/man1/dmenu.1 |
|
| 64 | + | @rm -f ${DESTDIR}${MANPREFIX}/man1/lsx.1 |
|
| 58 | 65 | ||
| 59 | 66 | .PHONY: all options clean dist install uninstall |
|
| 23 | 23 | .RB [ \-v ] |
|
| 24 | 24 | .P |
|
| 25 | 25 | .BR dmenu_run " ..." |
|
| 26 | - | .P |
|
| 27 | - | .B dmenu_path |
|
| 28 | 26 | .SH DESCRIPTION |
|
| 29 | 27 | .B dmenu |
|
| 30 | 28 | is a dynamic menu for X, originally designed for |
|
| 31 | - | .BR dwm (1). |
|
| 29 | + | .IR dwm (1). |
|
| 32 | 30 | It manages huge numbers of user\-defined menu items efficiently. |
|
| 33 | 31 | .P |
|
| 34 | 32 | dmenu reads a list of newline\-separated items from stdin and creates a menu. |
|
| 36 | 34 | choice is printed to stdout and dmenu terminates. |
|
| 37 | 35 | .P |
|
| 38 | 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 | 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 | 39 | .SH OPTIONS |
|
| 45 | 40 | .TP |
|
| 46 | 41 | .B \-b |
|
| 100 | 95 | .B Ctrl\-y |
|
| 101 | 96 | Paste the current X selection into the input field. |
|
| 102 | 97 | .SH SEE ALSO |
|
| 103 | - | .BR dwm (1) |
|
| 98 | + | .IR dwm (1), |
|
| 99 | + | .IR lsx (1) |
|
| 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 | 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 |
| 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. |
| 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 | + | } |