111 Commits
3.8 ... 4.2.1

Author SHA1 Message Date
Anselm R Garbe
22cf9626c7 fixed dist target bug 2010-11-20 09:25:04 +00:00
Anselm R Garbe
9e13ecabe8 Added tag 4.2 for changeset 379813a051f0 2010-11-19 11:51:01 +00:00
Connor Lane Smith
266f3dd311 removed unnecessary defines 2010-11-17 04:51:30 +00:00
Connor Lane Smith
8d9ade36de moved main, updated args 2010-11-17 04:33:34 +00:00
Connor Lane Smith
da81f57f6d fixed config.mk dep 2010-11-12 00:30:03 +00:00
Connor Lane Smith
c1241bcba3 updated manpage 2010-11-12 00:01:54 +00:00
Connor Lane Smith
eeba6221b1 rebound paste to ^Y 2010-11-12 00:00:32 +00:00
Connor Lane Smith
a0a99d10e1 removed libdc dependence 2010-11-11 23:56:39 +00:00
Connor Lane Smith
7cf66b443a -m flag to fix dwm selmon bug 2010-11-02 12:15:15 +00:00
Connor Lane Smith
038a78a3f4 updated manpage 2010-10-08 23:40:11 +01:00
Connor Lane Smith
e0add428d2 cleaned up 2010-10-08 23:36:45 +01:00
Connor Lane Smith
bf7b8e37ee dmenu_path.c (shell is a bottleneck) 2010-10-08 23:24:22 +01:00
Connor Lane Smith
610a0a8d12 fixed linking bug (thanks Jacob Nixdorf) & iscntrl corner case 2010-09-13 14:22:02 +01:00
Connor Lane Smith
f0818217b3 simplification 2010-09-11 19:48:10 +01:00
Connor Lane Smith
3c366bd73d update to libdc, fixed utf8 bug 2010-09-11 13:37:01 +01:00
Connor Lane Smith
75a19c35bd arrow offset 2010-08-20 19:57:13 +01:00
Connor Lane Smith
a5f31f5707 fixed width bug 2010-08-20 19:42:58 +01:00
Connor Lane Smith
b81c1e88cd rebound paste, removed useless max widths 2010-08-20 13:50:44 +01:00
Connor Lane Smith
5376113039 new libdraw 2010-08-19 16:43:39 +01:00
Connor Lane Smith
c7a8f17bd2 new libdraw 2010-08-19 16:17:57 +01:00
Connor Lane Smith
128d4cf376 resorted globals 2010-08-18 17:35:23 +01:00
Connor Lane Smith
e4fdaba88d signed ints, ignore negative -l value 2010-08-18 17:33:34 +01:00
Connor Lane Smith
849f1dd7a3 fixed insert segfault, added nextrune 2010-08-12 15:35:51 +01:00
Connor Lane Smith
402dc2bc95 fixed paste 2010-08-11 15:02:03 +01:00
Connor Lane Smith
00a60cb7b2 new libdraw, replaced cistrstr with fstrstr, simpler readstdin 2010-08-11 14:24:25 +01:00
Connor Lane Smith
e149c531b8 more efficient initfont 2010-08-10 18:09:02 +01:00
Connor Lane Smith
605e9b6c03 reverted calcoffsets 2010-08-10 14:14:37 +01:00
Connor Lane Smith
caf5246268 simplifications 2010-08-10 13:38:49 +01:00
Connor Lane Smith
93af72e116 cursor fix + style 2010-08-09 11:54:46 +01:00
Connor Lane Smith
0b8072a5a9 added ^D, removed ^M 2010-08-06 14:16:08 +01:00
Connor Lane Smith
31ffcd3b9a new libdraw, typo fixes 2010-08-05 15:41:56 +01:00
Connor Lane Smith
9cf07b4b9b another typo fix (thanks, Gene Auyeung) 2010-08-03 18:19:59 +01:00
Connor Lane Smith
7a2782d02d typo fix 2010-08-03 17:29:53 +01:00
Connor Lane Smith
1c91c2a99c cleaned up 2010-08-03 17:18:24 +01:00
Connor Lane Smith
b7695fa98c merged *{h,v} functions 2010-08-03 17:10:29 +01:00
Connor Lane Smith
b54c179d58 retyped promptw 2010-08-02 15:13:33 +01:00
Connor Lane Smith
06c18808b6 replaced promptw 2010-08-02 14:49:14 +01:00
Connor Lane Smith
a7aee433cc fixed bugs, no more config.h, updated manpage, new libdraw 2010-08-02 14:22:54 +01:00
Connor Lane Smith
a3606ecb0e updated manpage, added paste, cleaned up, new libdraw 2010-07-31 14:56:27 +01:00
Connor Lane Smith
7d5fe17391 merged dmenu & dinput (clunky interface) 2010-07-30 13:40:56 +01:00
Connor Lane Smith
7f36736d11 underline match 2010-07-30 10:26:12 +01:00
Connor Lane Smith
115c01b74e new libdraw 2010-07-30 10:25:55 +01:00
Connor Lane Smith
d77340ed53 fixed vlist select 2010-07-30 09:18:35 +01:00
Connor Lane Smith
da7a799121 updated to libdraw tip 2010-07-27 13:40:32 +01:00
Connor Lane Smith
855a566319 added dmenu.h, common.c 2010-07-02 06:49:05 +01:00
Connor Lane Smith
29e8faed6c updated to new libdraw 2010-07-02 05:50:19 +01:00
Connor Lane Smith
d9c24564d2 atexit cleanup 2010-07-02 03:44:01 +01:00
Connor Lane Smith
6ba5103df4 removed -e flag (too buggy), cleaned up 2010-06-30 22:42:15 +01:00
Connor Lane Smith
309d071df5 fixed no-input invisible text bug 2010-06-30 10:45:24 +01:00
Connor Lane Smith
26b9f3de0f libdraw now has own repo 2010-06-30 01:36:15 +01:00
Connor Lane Smith
7afd296c40 resizing vlist, new dinput binding 2010-06-30 00:52:14 +01:00
Connor Lane Smith
cc8b3b999b cleaned up 2010-06-30 00:05:32 +01:00
Connor Lane Smith
f2abaf8b30 decosmetics 2010-06-29 19:19:20 +01:00
Connor Lane Smith
340b176de6 dinput with dmenu flags, fixed usage & -v, cosmetics 2010-06-29 16:07:31 +01:00
Connor Lane Smith
18dcf73896 extended libdraw 2010-06-28 06:09:34 +01:00
Connor Lane Smith
9f3b0c6ea8 cleaned up 2010-06-25 04:33:41 +01:00
Connor Lane Smith
4508fd2c4e moved draw.c to libdraw.a 2010-06-24 17:44:35 +01:00
Connor Lane Smith
723361fa12 removed colors from dc 2010-06-24 16:24:04 +01:00
Connor Lane Smith
96c65400cc decoupled draw.c from dmenu & dinput 2010-06-24 16:18:18 +01:00
Connor Lane Smith
6c1d0e4d60 fixed offsets, updated eprint, cleaned up 2010-06-24 14:22:34 +01:00
Connor Lane Smith
6efe1932be fixed static symbols in config.def.h 2010-06-24 11:30:30 +01:00
Connor Lane Smith
8f7b62e2b6 fixed makefile 2010-06-23 14:29:32 +01:00
Connor Lane Smith
2ec16d9cb2 cleaned up 2010-06-23 13:49:24 +01:00
Connor Lane Smith
146bc23c11 cleaned up 2010-06-23 13:31:11 +01:00
Connor Lane Smith
595e797660 added draw.h 2010-06-23 13:29:15 +01:00
Connor Lane Smith
bba30e2686 overlapping code 2010-06-23 12:42:08 +01:00
Connor Lane Smith
08b264393d typo fixes 2010-06-23 12:15:07 +01:00
Connor Lane Smith
b4e63454e5 initial dmenu / dinput separation 2010-06-23 12:04:54 +01:00
Connor Lane Smith
bff1526d31 fixed vlist cursor 2010-06-22 10:45:07 +01:00
Connor Lane Smith
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
Connor Lane Smith
97797d90a6 cleaned up 2010-06-20 01:19:17 +01:00
Connor Lane Smith
4983707c70 added ^K, optimisations 2010-06-20 00:44:26 +01:00
Connor Lane Smith
4229fb7b78 added sselp requirement to readme 2010-06-19 21:44:32 +01:00
Connor Lane Smith
b27ffbd78b cleaned up 2010-06-16 15:36:17 +01:00
Connor Lane Smith
6366f94e36 fixed vlist paging, cleaned up 2010-06-11 09:24:33 +01:00
Connor Lane Smith
645f1d0dfc updated manpage 2010-06-09 10:13:26 +01:00
Anselm R Garbe
d7d14e53da Added tag 4.1.1 for changeset 72749a826cab 2010-05-29 12:56:37 +01:00
Anselm R Garbe
851672cadc prepared bugfix release 4.1.1 2010-05-29 12:56:33 +01:00
Anselm R Garbe
504b797be8 applied Ramils patch 2010-05-29 12:55:38 +01:00
Anselm R Garbe
503ca75af4 Added tag 4.1 for changeset 844587572673 2010-05-28 11:42:54 +01:00
Anselm R Garbe
8623bf5d19 prepared dmenu-4.1 release 2010-05-28 11:42:49 +01:00
Connor Lane Smith
5bc288b2b1 fixed vlist alignment 2010-05-05 11:42:39 +01:00
Connor Lane Smith
a6835349df cleaning up 2010-05-02 23:17:02 +01:00
Connor Lane Smith
518c9b72d1 fixed bad parenting, simpler vlist 2010-04-14 17:35:19 +00:00
Connor Lane Smith
09db46f54f fixed ^U cursor support 2010-04-13 20:14:45 +00:00
Connor Lane Smith
e3623cd7f2 fixed 3 bugs and some inconsistency 2010-04-07 16:15:34 +00:00
Anselm R Garbe
0ba3bae981 applied Troels' patch, thanks Troels! 2010-04-01 21:40:11 +01:00
Anselm R Garbe
ebeb4e4752 added Connor to LICENSE file 2010-04-01 21:32:06 +01:00
Anselm R Garbe
3472085f59 commited Connor's sanity patch 2010-04-01 21:31:09 +01:00
pancake
7ffe519816 apply nibble patch removing per-item length limit 2010-04-01 19:30:21 +02:00
pancake
29686bd1b8 add ^a and ^e keybindings 2010-04-01 19:10:41 +02:00
Anselm R Garbe
052ffae192 applied Connor's subwindow patch 2010-03-31 22:43:49 +01:00
Anselm R Garbe
eededaa76f applied Connor's next nice patch, thanks a lot! 2010-03-31 22:37:41 +01:00
anselm@garbe.us
8e3e61170b applied cls' patch, thanks Connor! 2010-03-22 07:50:26 +00:00
Anselm R Garbe
37236f8840 applied Connor's patch, thanks! 2010-03-07 08:32:16 +00:00
Anselm R Garbe
7082ba1e10 this is only a temporary workaround, the command executed by -p must be configurable through some switch, that was the initial idea, just using sselp is too limited, I'll look into the other issues soon 2009-12-05 16:52:53 +00:00
Anselm R Garbe
569a1f925a applied cursor, vertical and paste patches for upcoming 4.1 dmenu version (due to the fact that surf is using dmenu as well) 2009-11-28 12:28:15 +00:00
Anselm R Garbe
0f4d3ffdb5 Added tag 4.0 for changeset 78f9f72cc9c6 2009-04-18 12:50:12 +01:00
Anselm R Garbe
a1ad9c2a1c applied Matthias Christian Ott's sanity fixes (thanks a lot!) 2009-02-21 19:21:54 +00:00
a@null
51224dcb79 next release will be 4.0 2008-12-12 19:58:52 +00:00
a@null
4e74263ba0 minor modification 2008-12-09 21:55:47 +00:00
Anselm R Garbe
bab59a9807 Added tag 3.9 for changeset 21a1ed9a69b9 2008-09-09 20:45:07 +01:00
Anselm R Garbe
ef00902fd9 simplified initfont 2008-08-29 10:09:40 +01:00
Anselm R Garbe
3e60c5d836 reverted setlocale() call 2008-08-25 09:38:19 +01:00
Anselm R Garbe
c24f22a36b removed artifact from wmii menu 2008-08-23 09:33:56 +01:00
Anselm R Garbe
44e372bb31 fixed a problem when backporting dwm's drawtext() 2008-08-18 19:24:29 +01:00
Anselm R Garbe
17232f493b abc... 2008-08-18 10:20:53 +01:00
Anselm R Garbe
b95e61c9b7 removed the i = textnw... as remarked by Martin Hurton 2008-08-18 10:17:15 +01:00
Anselm R Garbe
cf7e4c15a9 backported drawtext() simplifications to dmenu 2008-08-18 10:03:28 +01:00
Anselm R Garbe
c43c692a4d getting rid of setlocale(), it doesn't seem to make sense with Xmb, artifact of Xutf8 times 2008-08-18 09:31:01 +01:00
Anselm R Garbe
abd9fbb79a Added tag 3.8 for changeset 644b0798fccc 2008-07-29 19:20:53 +01:00
12 changed files with 800 additions and 694 deletions

View File

@@ -37,3 +37,9 @@ e4c81a78ffbad6ba4d1ad119cc654da6eca63a4c 3.2
05e5bd706b3b3e61399d57c4bb43df296a20112d 3.5 05e5bd706b3b3e61399d57c4bb43df296a20112d 3.5
0bc2751d06e8b95e0138854c7815e154c5c3d990 3.6 0bc2751d06e8b95e0138854c7815e154c5c3d990 3.6
0508a3a6ee106f36d9b8ff07bb5b28584edfa89c 3.7 0508a3a6ee106f36d9b8ff07bb5b28584edfa89c 3.7
644b0798fcccd570fd519899e1601c6857496b91 3.8
21a1ed9a69b9541a355758a57103e294fb722c33 3.9
78f9f72cc9c6bdb022ff8908486b61ef5e242aad 4.0
844587572673cf6326c3f61737264a46b728fc0a 4.1
72749a826cab0baa805620e44a22e54486c97a4e 4.1.1
379813a051f03a1b20bdbfdc2d2d1d2d794ace48 4.2

View File

@@ -1,6 +1,10 @@
MIT/X Consortium License MIT/X Consortium License
© 2006-2008 Anselm R. Garbe <garbeam at gmail dot com> © 2010 Connor Lane Smith <cls@lubutu.com>
© 2006-2010 Anselm R Garbe <anselm@garbe.us>
© 2009 Gottox <gottox@s01.de>
© 2009 Markus Schnalke <meillo@marmaro.de>
© 2009 Evan Gates <evan.gates@gmail.com>
© 2006-2008 Sander van Dijk <a dot h dot vandijk at gmail dot com> © 2006-2008 Sander van Dijk <a dot h dot vandijk at gmail dot com>
© 2006-2007 Michał Janeczek <janeczek at gmail dot com> © 2006-2007 Michał Janeczek <janeczek at gmail dot com>

View File

@@ -3,10 +3,7 @@
include config.mk include config.mk
SRC = dmenu.c all: options dmenu dmenu_path
OBJ = ${SRC:.c=.o}
all: options dmenu
options: options:
@echo dmenu build options: @echo dmenu build options:
@@ -14,30 +11,31 @@ options:
@echo "LDFLAGS = ${LDFLAGS}" @echo "LDFLAGS = ${LDFLAGS}"
@echo "CC = ${CC}" @echo "CC = ${CC}"
.c.o: dmenu: dmenu.o draw.o
@echo CC $< dmenu_path: dmenu_path.o
@${CC} -c ${CFLAGS} $<
${OBJ}: config.h config.mk .c.o: config.mk
@echo CC -c $<
@${CC} -c $< ${CFLAGS}
dmenu: ${OBJ} dmenu dmenu_path:
@echo CC -o $@ @echo CC -o $@
@${CC} -o $@ ${OBJ} ${LDFLAGS} @${CC} -o $@ $+ ${LDFLAGS}
clean: clean:
@echo cleaning @echo cleaning
@rm -f dmenu ${OBJ} dmenu-${VERSION}.tar.gz @rm -f dmenu dmenu.o draw.o dmenu_path dmenu_path.o dmenu-${VERSION}.tar.gz
dist: clean dist: clean
@echo creating dist tarball @echo creating dist tarball
@mkdir -p dmenu-${VERSION} @mkdir -p dmenu-${VERSION}
@cp -R LICENSE Makefile README config.mk dmenu.1 config.h dmenu_path dmenu_run ${SRC} dmenu-${VERSION} @cp LICENSE Makefile README config.mk dmenu.1 dmenu.c draw.c draw.h dmenu_path.c dmenu_run 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}
install: all install: all
@echo installing executable file 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_path dmenu_run ${DESTDIR}${PREFIX}/bin
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu
@@ -49,9 +47,10 @@ install: all
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1 @chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1
uninstall: uninstall:
@echo removing executable file from ${DESTDIR}${PREFIX}/bin @echo removing executables from ${DESTDIR}${PREFIX}/bin
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu ${DESTDIR}${PREFIX}/bin/dmenu_path @rm -f ${DESTDIR}${PREFIX}/bin/dmenu
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu ${DESTDIR}${PREFIX}/bin/dmenu_run @rm -f ${DESTDIR}${PREFIX}/bin/dmenu_path
@rm -f ${DESTDIR}${PREFIX}/bin/dmenu_run
@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

6
README
View File

@@ -1,6 +1,6 @@
dmenu - dynamic menu dmenu - dynamic menu
==================== ====================
dmenu is a generic and efficient menu for X. dmenu is an efficient dynamic menu for X.
Requirements Requirements
@@ -13,8 +13,8 @@ Installation
Edit config.mk to match your local setup (dmenu is installed into Edit config.mk to match your local setup (dmenu is installed into
the /usr/local namespace by default). the /usr/local namespace by default).
Afterwards enter the following command to build and install dmenu (if Afterwards enter the following command to build and install dmenu
necessary as root): (if necessary as root):
make clean install 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,5 +1,5 @@
# dmenu version # dmenu version
VERSION = 3.8 VERSION = 4.2.1
# Customize below to fit your system # Customize below to fit your system
@@ -11,21 +11,17 @@ X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib X11LIB = /usr/X11R6/lib
# Xinerama, comment if you don't want it # Xinerama, comment if you don't want it
XINERAMALIBS = -L${X11LIB} -lXinerama XINERAMALIBS = -lXinerama
XINERAMAFLAGS = -DXINERAMA XINERAMAFLAGS = -DXINERAMA
# includes and libs # includes and libs
INCS = -I. -I/usr/include -I${X11INC} INCS = -I${X11INC}
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
# flags # flags
CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} CPPFLAGS = -D_BSD_SOURCE -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
LDFLAGS = -s ${LIBS} LDFLAGS = -s ${LIBS}
# Solaris
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = ${LIBS}
# compiler and linker # compiler and linker
CC = cc CC = cc

140
dmenu.1
View File

@@ -3,96 +3,102 @@
dmenu \- dynamic menu dmenu \- dynamic menu
.SH SYNOPSIS .SH SYNOPSIS
.B dmenu .B dmenu
.RB [ \-i ]
.RB [ \-b ] .RB [ \-b ]
.RB [ \-fn " <font>"] .RB [ \-i ]
.RB [ \-nb " <color>"] .RB [ \-l
.RB [ \-nf " <color>"] .IR lines ]
.RB [ \-p " <prompt>"] .RB [ \-m
.RB [ \-sb " <color>"] .IR monitor ]
.RB [ \-sf " <color>"] .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 ] .RB [ \-v ]
.P
.BR dmenu_run " ..."
.P
.B dmenu_path
.SH DESCRIPTION .SH DESCRIPTION
.SS Overview .B dmenu
dmenu is a generic menu for X, originally designed for is a dynamic menu for X, originally designed for
.BR dwm (1). .BR dwm (1).
It manages huge amounts (up to 10.000 and more) of user defined menu items It manages huge numbers of user-defined menu items efficiently.
efficiently. .P
.SS Options dmenu reads a list of newline-separated items from standard input and creates a
.TP menu. When the user selects an item or enters any text and presses Return,
.B \-i their choice is printed to standard output and dmenu terminates.
makes dmenu match menu entries case insensitively. .P
.B dmenu_run
is a dmenu script used by dwm which lists programs in the user's PATH and
executes the selected item.
.P
.B dmenu_path
is a program used by dmenu_run to find and cache a list of executables.
.SH OPTIONS
.TP .TP
.B \-b .B \-b
defines that dmenu appears at the bottom. dmenu appears at the bottom of the screen.
.TP .TP
.B \-fn <font> .B \-i
defines the font. dmenu matches menu items case insensitively.
.TP .TP
.B \-nb <color> .BI \-l " lines"
defines the normal background color (#RGB, #RRGGBB, and color names are supported). dmenu lists items vertically, with the given number of lines.
.TP .TP
.B \-nf <color> .BI \-m " monitor"
defines the normal foreground color (#RGB, #RRGGBB, and color names are supported). dmenu appears on the given Xinerama screen.
.TP .TP
.B \-p <prompt> .BI \-p " prompt"
defines a prompt to be displayed before the input area. defines the prompt to be displayed to the left of the input field.
.TP .TP
.B \-sb <color> .BI \-fn " font"
defines the selected background color (#RGB, #RRGGBB, and color names are supported). defines the font or font set used.
.TP .TP
.B \-sf <color> .BI \-nb " color"
defines the selected foreground color (#RGB, #RRGGBB, and color names are supported). defines the normal background color.
.IR #RGB ,
.IR #RRGGBB ,
and color names are supported.
.TP
.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 .TP
.B \-v .B \-v
prints version information to standard output, then exits. prints version information to standard output, then exits.
.SH USAGE .SH USAGE
dmenu reads a list of newline-separated items from standard input and creates a dmenu is completely controlled by the keyboard. Besides standard Unix line
menu. When the user selects an item or enters any text and presses Return, his/her editing and item selection (Up/Down/Left/Right, PageUp/PageDown, Home/End), the
choice is printed to standard output and dmenu terminates. following keys are recognized:
.P
dmenu is completely controlled by the keyboard. 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 (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 .TP
.B Tab (Control\-i) .B Tab (Control\-i)
Copy the selected item to the input field. Copy the selected item to the input field.
.TP .TP
.B Return (Control\-j) .B Return (Control\-j)
Confirm selection and quit (print the selected item to standard output). Returns Confirm selection. Prints the selected item to standard output and exits,
.B 0 returning success.
on termination.
.TP .TP
.B Shift\-Return (Control\-Shift\-j) .B Shift\-Return (Control\-Shift\-j)
Confirm selection and quit (print the text in the input field to standard output). Confirm input. Prints the input text to standard output and exits, returning
Returns success.
.B 0
on termination.
.TP .TP
.B Escape (Control\-bracketleft) .B Escape (Control\-c)
Quit without selecting an item. Returns Exit without selecting an item, returning failure.
.B 1
on termination.
.TP .TP
.B Backspace (Control\-h) .B Control\-y
Remove a character from the input field. Paste the current X selection into 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.
.SH SEE ALSO .SH SEE ALSO
.BR dwm (1), .BR dwm (1)
.BR wmii (1) .

919
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"

102
dmenu_path.c Normal file
View File

@@ -0,0 +1,102 @@
/* See LICENSE file for copyright and license details. */
#include <dirent.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#define CACHE ".dmenu_cache"
static void die(const char *s);
static int qstrcmp(const void *a, const void *b);
static void scan(void);
static int uptodate(void);
static char **items = NULL;
static const char *home, *path;
int
main(void) {
if(!(home = getenv("HOME")))
die("no $HOME");
if(!(path = getenv("PATH")))
die("no $PATH");
if(chdir(home) < 0)
die("chdir failed");
if(uptodate()) {
execlp("cat", "cat", CACHE, NULL);
die("exec failed");
}
scan();
return EXIT_SUCCESS;
}
void
die(const char *s) {
fprintf(stderr, "dmenu_path: %s\n", s);
exit(EXIT_FAILURE);
}
int
qstrcmp(const void *a, const void *b) {
return strcmp(*(const char **)a, *(const char **)b);
}
void
scan(void) {
char buf[PATH_MAX];
char *dir, *p;
size_t i, count;
struct dirent *ent;
DIR *dp;
FILE *cache;
count = 0;
if(!(p = strdup(path)))
die("strdup failed");
for(dir = strtok(p, ":"); dir; dir = strtok(NULL, ":")) {
if(!(dp = opendir(dir)))
continue;
while((ent = readdir(dp))) {
snprintf(buf, sizeof buf, "%s/%s", dir, ent->d_name);
if(ent->d_name[0] == '.' || access(buf, X_OK) < 0)
continue;
if(!(items = realloc(items, ++count * sizeof *items)))
die("malloc failed");
if(!(items[count-1] = strdup(ent->d_name)))
die("strdup failed");
}
closedir(dp);
}
qsort(items, count, sizeof *items, qstrcmp);
if(!(cache = fopen(CACHE, "w")))
die("open failed");
for(i = 0; i < count; i++) {
if(i > 0 && !strcmp(items[i], items[i-1]))
continue;
fprintf(cache, "%s\n", items[i]);
fprintf(stdout, "%s\n", items[i]);
}
fclose(cache);
free(p);
}
int
uptodate(void) {
char *dir, *p;
time_t mtime;
struct stat st;
if(stat(CACHE, &st) < 0)
return 0;
mtime = st.st_mtime;
if(!(p = strdup(path)))
die("strdup failed");
for(dir = strtok(p, ":"); dir; dir = strtok(NULL, ":"))
if(!stat(dir, &st) && st.st_mtime > mtime)
return 0;
free(p);
return 1;
}

194
draw.c Normal file
View File

@@ -0,0 +1,194 @@
/* 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 DEFFONT "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) {
XRectangle r = { dc->x + x, dc->y + y, w, h };
if(!fill) {
r.width -= 1;
r.height -= 1;
}
XSetForeground(dc->dpy, dc->gc, color);
(fill ? XFillRectangles : XDrawRectangles)(dc->dpy, dc->canvas, dc->gc, &r, 1);
}
void
drawtext(DC *dc, const char *text, unsigned long col[ColLast]) {
char buf[256];
size_t n, mn;
/* shorten text if necessary */
n = strlen(text);
for(mn = MIN(n, sizeof buf); textnw(dc, text, mn) > dc->w - dc->font.height/2; 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, y;
x = dc->x + dc->font.height/2;
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;
fprintf(stderr, "%s: ", progname);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
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())
weprintf("no locale support\n");
if(!(dc = malloc(sizeof *dc)))
eprintf("cannot malloc %u bytes\n", 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);
dc->font.xfont = NULL;
dc->font.set = NULL;
dc->canvas = None;
return dc;
}
void
initfont(DC *dc, const char *fontstr) {
if(!loadfont(dc, fontstr ? fontstr : DEFFONT)) {
if(fontstr != NULL)
weprintf("cannot load font '%s'\n", fontstr);
if(fontstr == NULL || !loadfont(dc, DEFFONT))
eprintf("cannot load font '%s'\n", DEFFONT);
}
dc->font.height = dc->font.ascent + dc->font.descent;
}
Bool
loadfont(DC *dc, const char *fontstr) {
char *def, **missing;
int i, n;
if(!*fontstr)
return False;
if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) {
char **names;
XFontStruct **xfonts;
n = XFontsOfFontSet(dc->font.set, &xfonts, &names);
for(i = dc->font.ascent = dc->font.descent = 0; i < n; i++) {
dc->font.ascent = MAX(dc->font.ascent, xfonts[i]->ascent);
dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent);
}
}
else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) {
dc->font.ascent = dc->font.xfont->ascent;
dc->font.descent = dc->font.xfont->descent;
}
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->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h,
DefaultDepth(dc->dpy, DefaultScreen(dc->dpy)));
dc->x = dc->y = 0;
dc->w = w;
dc->h = h;
dc->invert = False;
}
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;
}
void
weprintf(const char *fmt, ...) {
va_list ap;
fprintf(stderr, "%s: warning: ", progname);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
}

37
draw.h Normal file
View File

@@ -0,0 +1,37 @@
/* 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;
XFontSet set;
XFontStruct *xfont;
} font;
} DC; /* draw context */
unsigned long getcolor(DC *dc, const char *colstr);
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 initfont(DC *dc, const char *fontstr);
void freedc(DC *dc);
DC *initdc(void);
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);
void eprintf(const char *fmt, ...);
void weprintf(const char *fmt, ...);
const char *progname;