Compare commits

...

43 Commits
0.1 ... 0.4

Author SHA1 Message Date
26fc52fcf6 removed finished message 2006-08-14 16:11:38 +02:00
6a26e97f74 fixed string cutting 2006-08-14 10:56:57 +02:00
0e21ef5f37 fixed string cutting 2006-08-14 08:52:28 +02:00
2f3068fb77 added comment 2006-08-14 08:44:54 +02:00
b7f8911455 applied Sanders LD patch 2006-08-14 08:42:23 +02:00
35a06ccd2e applied my new color scheme 2006-08-11 18:12:07 +02:00
67649463c8 simplified drawborder 2006-08-11 11:52:34 +02:00
d1415ea497 Added tag 0.3 for changeset d352e9dc112ee96aa5cad961a0ed880ae9ce7276 2006-08-10 15:19:03 +02:00
c6113a3b27 readded border colors, this sucks least 2006-08-10 11:13:21 +02:00
dd902868df drawing border around sel item 2006-08-10 11:07:06 +02:00
4318bf2905 removed unnecessary border color 2006-08-10 10:28:58 +02:00
25f71b3829 swapping my default colors 2006-08-10 10:21:50 +02:00
0af369ba65 added uppercase chars for C-u and C-h as well 2006-08-10 10:10:32 +02:00
e4fbc43253 removed C-[ from source and man page 2006-08-10 10:09:44 +02:00
66f2a93eaa removed control sequences which actually aren't implemented anymore (only the real unix control sequences are implemented) 2006-08-09 18:45:32 +02:00
a381b3a819 fixes to README 2006-08-08 17:14:35 +02:00
2a4b146fc4 default colors are best 2006-08-08 12:47:58 +02:00
84d7f7bccf noborder 2006-08-08 11:47:58 +02:00
00dce8cc39 dito 2006-08-08 11:18:23 +02:00
170b977288 using a better colorscheme 2006-08-08 11:07:12 +02:00
366b2afd6c removed unnecessary typedef 2006-08-07 17:17:27 +02:00
4e009770d6 made dmenu(1) more dwm(1) alike 2006-08-07 14:07:04 +02:00
b24aa8312b font size changed as well 2006-08-07 12:21:31 +02:00
5146c3f27f appliead Sanders manpage/Makefile pacth 2006-08-07 11:58:23 +02:00
6a332a043a fixed dmenu.1 version info 2006-08-07 11:11:17 +02:00
9d574f5ebe settle with grey 2006-08-07 11:10:05 +02:00
1fb8a6b898 next version is 0.3 2006-08-07 10:32:18 +02:00
7fb4c2b818 also made my colors tasting better with my overall colorscheme 2006-08-07 10:28:42 +02:00
f3a60b583f next attempt for bright background switch 2006-08-07 09:40:28 +02:00
48e2ce8709 Added tag 0.2 for changeset 656be0f47df545dfdd2e1e0663663b8b1b26f031 2006-08-07 08:52:37 +02:00
4c7866ec55 added stripping to dmenu target 2006-08-07 08:45:47 +02:00
fe94aeb468 fixed a bad mistake setting the dmenu border to False; 2006-08-07 08:40:26 +02:00
d32fd15ea4 renamed some functions to make it more readable 2006-08-07 07:39:31 +02:00
bb393554fd updated man page 2006-08-07 07:37:32 +02:00
38bc664ef6 updated man page 2006-08-07 07:36:18 +02:00
ee03052e73 removed -t title crap from dmenu 2006-08-07 07:30:13 +02:00
62a7d40746 menu now also uses -Os 2006-08-05 14:57:51 +02:00
2535072fd8 small change 2006-08-05 14:05:04 +02:00
d8d17f369e yet another fix 2006-08-04 17:17:03 +02:00
f1495a11b6 fixed README of dmenu 2006-08-04 17:15:07 +02:00
84b56075f4 fixed dist target 2006-08-04 10:34:44 +02:00
7aae7fac9c removed config.h 2006-08-04 10:32:15 +02:00
b862ed5a54 Added tag 0.1 for changeset fcc8a282cb52c6a9343b461026b386825590cd31 2006-08-04 10:31:51 +02:00
10 changed files with 107 additions and 172 deletions

3
.hgtags Normal file
View File

@ -0,0 +1,3 @@
fcc8a282cb52c6a9343b461026b386825590cd31 0.1
656be0f47df545dfdd2e1e0663663b8b1b26f031 0.2
d352e9dc112ee96aa5cad961a0ed880ae9ce7276 0.3

View File

@ -7,13 +7,13 @@ SRC = draw.c main.c util.c
OBJ = ${SRC:.c=.o} OBJ = ${SRC:.c=.o}
all: options dmenu all: options dmenu
@echo finished
options: options:
@echo dmenu build options: @echo dmenu build options:
@echo "CFLAGS = ${CFLAGS}" @echo "CFLAGS = ${CFLAGS}"
@echo "LDFLAGS = ${LDFLAGS}" @echo "LDFLAGS = ${LDFLAGS}"
@echo "CC = ${CC}" @echo "CC = ${CC}"
@echo "LD = ${LD}"
.c.o: .c.o:
@echo CC $< @echo CC $<
@ -27,7 +27,8 @@ config.h:
dmenu: ${OBJ} dmenu: ${OBJ}
@echo LD $@ @echo LD $@
@${CC} -o $@ ${OBJ} ${LDFLAGS} @${LD} -o $@ ${OBJ} ${LDFLAGS}
@strip $@
clean: clean:
@echo cleaning @echo cleaning
@ -36,7 +37,7 @@ clean:
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 \ @cp -R LICENSE Makefile README config.*.h config.mk \
dmenu.1 dmenu.h ${SRC} dmenu-${VERSION} dmenu.1 dmenu.h ${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
@ -49,7 +50,7 @@ install: all
@chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu @chmod 755 ${DESTDIR}${PREFIX}/bin/dmenu
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
@mkdir -p ${DESTDIR}${MANPREFIX}/man1 @mkdir -p ${DESTDIR}${MANPREFIX}/man1
@cp -f dmenu.1 ${DESTDIR}${MANPREFIX}/man1 @sed 's/VERSION/${VERSION}/g' < dmenu.1 > ${DESTDIR}${MANPREFIX}/man1/dmenu.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1 @chmod 644 ${DESTDIR}${MANPREFIX}/man1/dmenu.1
uninstall: uninstall:

39
README
View File

@ -1,48 +1,31 @@
dwm - dynamic window manager dmenu - dynamic menu
---------------------------- --------------------
dwm is an extremely fast, small, and dynamic X11 window manager. dmenu is a generic, highly customizable, and efficient menu for the
X Window System.
Requirements Requirements
------------ ------------
In order to build dwm you need the Xlib header files. In order to build dmenu you need the Xlib header files.
Installation Installation
------------ ------------
Edit config.mk to match your local setup (dwm 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 dwm (if Afterwards enter the following command to build and install dmenu (if
necessary as root): necessary as root):
make clean install make clean install
Running dwm Running dmenu
----------- -------------
Add the following line to your .xinitrc to start dwm using startx: See the man page for details.
exec dwm
In order to connect dwm to a specific display, make sure that
the DISPLAY environment variable is set correctly, e.g.:
DISPLAY=foo.bar:1 exec dwm
(This will start dwm on display :1 of the host foo.bar.)
In order to display status info in the bar, you can do something
like this in your .xinitrc:
while true
do
echo `date` `uptime | sed 's/.*://; s/,//g'`
sleep 1
done | dwm
Configuration Configuration
------------- -------------
The configuration of dwm is done by creating a custom config.h The configuration of dmenu is done by creating a custom config.h
and (re)compiling the source code. and (re)compiling the source code.

View File

@ -3,7 +3,7 @@
* See LICENSE file for license details. * See LICENSE file for license details.
*/ */
#define FONT "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*" #define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*"
#define BGCOLOR "#0a2c2d" #define BGCOLOR "#0d121d"
#define FGCOLOR "#ddeeee" #define FGCOLOR "#eeeeee"
#define BORDERCOLOR "#176164" #define BORDERCOLOR "#3f484d"

View File

@ -1,9 +0,0 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#define FONT "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
#define BGCOLOR "#0a2c2d"
#define FGCOLOR "#ddeeee"
#define BORDERCOLOR "#176164"

View File

@ -1,5 +1,5 @@
# dmenu version # dmenu version
VERSION = 0.1 VERSION = 0.4
# Customize below to fit your system # Customize below to fit your system
@ -15,10 +15,11 @@ INCS = -I/usr/lib -I${X11INC}
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
# flags # flags
CFLAGS = -O3 ${INCS} -DVERSION=\"${VERSION}\" CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
LDFLAGS = ${LIBS} LDFLAGS = ${LIBS}
#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" #CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = -g ${LIBS} #LDFLAGS = -g ${LIBS}
# compiler # compiler and linker
CC = cc CC = cc
LD = ${CC}

64
dmenu.1
View File

@ -1,11 +1,9 @@
.TH DMENU 1 d-0.0 .TH DMENU 1 dmenu-VERSION
.SH NAME .SH NAME
dmenu \- dynamic menu dmenu \- dynamic menu
.SH SYNOPSIS .SH SYNOPSIS
.B dmenu .B dmenu
.RB [ \-v ] .RB [ \-v ]
.RB [ \-t
.IR title ]
.SH DESCRIPTION .SH DESCRIPTION
.SS Overview .SS Overview
.B dmenu .B dmenu
@ -17,52 +15,50 @@ It supports arbitrary, user defined menu contents.
.TP .TP
.B \-v .B \-v
prints version information to stdout, then exits. prints version information to stdout, then exits.
.TP .SH USAGE
.BI \-t " title"
displays
.I title
above the menu.
.SS Usage
.B dmenu .B dmenu
reads a list of newline-separated items from stdin and creates a menu. reads a list of newline-separated items from stdin and creates a menu.
When the user selects an item or enters any text and presses Enter, his choice When the user selects an item or enters any text and presses Return, his choice
is printed to stdout and is printed to stdout and
.B dmenu .B dmenu
terminates. terminates.
.SS Keyboard Control
.B dmenu .B dmenu
is completely controlled by the keyboard. The following keys are recognized: is completely controlled by the keyboard. The following keys are recognized:
.TP 2 .TP
Any printable character Any printable character
appends the character to the text in the input field. This works as a filter: Appends the character to the text in the input field. This works as a filter:
only items containing this text will be displayed. only items containing this text will be displayed.
.TP 2 .TP
Left/Right (Control-p/Control-n) Left/Right
select the previous/next item. Select the previous/next item.
.TP 2 .TP
Tab (Control-i) Tab
copy the selected item to the input field. Copy the selected item to the input field.
.TP 2 .TP
Enter (Control-j) Return
confirm selection and quit (print the selected item to stdout). Confirm selection and quit (print the selected item to stdout).
.TP 2 .TP
Shift-Enter (Shift-Control-j) Shift-Return
confirm selection and quit (print the text in the input field to stdout). Confirm selection and quit (print the text in the input field to stdout).
.TP 2 .TP
Escape (Control-[) Escape
quit without selecting an item. Quit without selecting an item.
.TP 2 .TP
Backspace (Control-h) Backspace (Control-h)
remove enough characters from the input field to change its filtering effect. Remove enough characters from the input field to change its filtering effect.
.TP 2 .TP
Control-u Control-u
remove all characters from the input field. Remove all characters from the input field.
.SS Exit codes .P
.B dmenu .B dmenu
returns returns
.B 0 .B 0
if Enter is pressed on termination, if Return is pressed on termination,
.B 1 .B 1
if Escape is pressed. if Escape is pressed.
.SH CUSTOMIZATION
.B dmenu
is customized by creating a custom config.h and (re)compiling the source
code. This keeps it fast, secure and simple.
.SH SEE ALSO .SH SEE ALSO
.BR dwm (1) .BR dwm (1)

View File

@ -9,7 +9,6 @@
#define SPACE 30 /* px */ #define SPACE 30 /* px */
typedef struct Brush Brush;
typedef struct DC DC; typedef struct DC DC;
typedef struct Fnt Fnt; typedef struct Fnt Fnt;

50
draw.c
View File

@ -9,26 +9,6 @@
/* static */ /* static */
static void
drawborder(void)
{
XPoint points[5];
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
XSetForeground(dpy, dc.gc, dc.border);
points[0].x = dc.x;
points[0].y = dc.y;
points[1].x = dc.w - 1;
points[1].y = 0;
points[2].x = 0;
points[2].y = dc.h - 1;
points[3].x = -(dc.w - 1);
points[3].y = 0;
points[4].x = 0;
points[4].y = -(dc.h - 1);
XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
}
static unsigned int static unsigned int
textnw(const char *text, unsigned int len) textnw(const char *text, unsigned int len)
{ {
@ -48,21 +28,35 @@ drawtext(const char *text, Bool invert, Bool border)
{ {
int x, y, w, h; int x, y, w, h;
static char buf[256]; static char buf[256];
unsigned int len; unsigned int len, olen;
XGCValues gcv; XGCValues gcv;
XPoint points[5];
XRectangle r = { dc.x, dc.y, dc.w, dc.h }; XRectangle r = { dc.x, dc.y, dc.w, dc.h };
XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
w = 0; w = 0;
if(border) if(border) {
drawborder(); XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
XSetForeground(dpy, dc.gc, dc.border);
points[0].x = dc.x;
points[0].y = dc.y;
points[1].x = dc.w - 1;
points[1].y = 0;
points[2].x = 0;
points[2].y = dc.h - 1;
points[3].x = -(dc.w - 1);
points[3].y = 0;
points[4].x = 0;
points[4].y = -(dc.h - 1);
XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
}
if(!text) if(!text)
return; return;
len = strlen(text); olen = len = strlen(text);
if(len >= sizeof(buf)) if(len >= sizeof(buf))
len = sizeof(buf) - 1; len = sizeof(buf) - 1;
memcpy(buf, text, len); memcpy(buf, text, len);
@ -75,6 +69,14 @@ drawtext(const char *text, Bool invert, Bool border)
/* shorten text if necessary */ /* shorten text if necessary */
while(len && (w = textnw(buf, len)) > dc.w - h) while(len && (w = textnw(buf, len)) > dc.w - h)
buf[--len] = 0; buf[--len] = 0;
if(len < olen) {
if(len > 1)
buf[len - 1] = '.';
if(len > 2)
buf[len - 2] = '.';
if(len > 3)
buf[len - 3] = '.';
}
if(w > dc.w) if(w > dc.w)
return; /* too long */ return; /* too long */

89
main.c
View File

@ -24,13 +24,11 @@ struct Item {
/* static */ /* static */
static char *title, text[4096]; static char text[4096];
static int mx, my, mw, mh; static int mx, my, mw, mh;
static int ret = 0; static int ret = 0;
static int nitem = 0; static int nitem = 0;
static unsigned int cmdw = 0; static unsigned int cmdw = 0;
static unsigned int tw = 0;
static unsigned int cw = 0;
static Bool done = False; static Bool done = False;
static Item *allitems = NULL; /* first of all items */ static Item *allitems = NULL; /* first of all items */
static Item *item = NULL; /* first of pattern matching items */ static Item *item = NULL; /* first of pattern matching items */
@ -82,18 +80,10 @@ drawmenu()
drawtext(NULL, False, False); drawtext(NULL, False, False);
/* print command */ /* print command */
if(!title || text[0]) { if(cmdw && item)
cmdw = cw;
if(cmdw && item)
dc.w = cmdw;
drawtext(text, False, False);
}
else {
cmdw = tw;
dc.w = cmdw; dc.w = cmdw;
drawtext(title, False, False); drawtext(text[0] ? text : NULL, False, False);
} dc.x += cmdw;
dc.x += dc.w;
if(curr) { if(curr) {
dc.w = SPACE; dc.w = SPACE;
@ -102,7 +92,6 @@ drawmenu()
/* determine maximum items */ /* determine maximum items */
for(i = curr; i != next; i=i->right) { for(i = curr; i != next; i=i->right) {
dc.border = False;
dc.w = textw(i->text); dc.w = textw(i->text);
if(dc.w > mw / 3) if(dc.w > mw / 3)
dc.w = mw / 3; dc.w = mw / 3;
@ -119,7 +108,7 @@ drawmenu()
} }
static void static void
input(char *pattern) match(char *pattern)
{ {
unsigned int plen; unsigned int plen;
Item *i, *j; Item *i, *j;
@ -127,11 +116,6 @@ input(char *pattern)
if(!pattern) if(!pattern)
return; return;
if(!title || *pattern)
cmdw = cw;
else
cmdw = tw;
plen = strlen(pattern); plen = strlen(pattern);
item = j = NULL; item = j = NULL;
nitem = 0; nitem = 0;
@ -188,18 +172,16 @@ kpress(XKeyEvent * e)
return; return;
break; break;
case XK_h: case XK_h:
case XK_H:
ksym = XK_BackSpace; ksym = XK_BackSpace;
break; break;
case XK_U:
case XK_u: case XK_u:
case XK_U:
text[0] = 0; text[0] = 0;
input(text); match(text);
drawmenu(); drawmenu();
return; return;
break; break;
case XK_bracketleft:
ksym = XK_Escape;
break;
} }
} }
switch(ksym) { switch(ksym) {
@ -216,7 +198,7 @@ kpress(XKeyEvent * e)
if(!sel) if(!sel)
return; return;
strncpy(text, sel->text, sizeof(text)); strncpy(text, sel->text, sizeof(text));
input(text); match(text);
break; break;
case XK_Right: case XK_Right:
if(!(sel && sel->right)) if(!(sel && sel->right))
@ -248,9 +230,9 @@ kpress(XKeyEvent * e)
prev_nitem = nitem; prev_nitem = nitem;
do { do {
text[--i] = 0; text[--i] = 0;
input(text); match(text);
} while(i && nitem && prev_nitem == nitem); } while(i && nitem && prev_nitem == nitem);
input(text); match(text);
} }
break; break;
default: default:
@ -260,14 +242,14 @@ kpress(XKeyEvent * e)
strncat(text, buf, sizeof(text)); strncat(text, buf, sizeof(text));
else else
strncpy(text, buf, sizeof(text)); strncpy(text, buf, sizeof(text));
input(text); match(text);
} }
} }
drawmenu(); drawmenu();
} }
static char * static char *
readinput() readstdin()
{ {
static char *maxname = NULL; static char *maxname = NULL;
char *p, buf[1024]; char *p, buf[1024];
@ -308,38 +290,23 @@ int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
char *maxname; char *maxname;
int i;
XEvent ev; XEvent ev;
XSetWindowAttributes wa; XSetWindowAttributes wa;
/* command line args */ if(argc == 2 && !strncmp("-v", argv[1], 3)) {
for(i = 1; i < argc; i++) { fputs("dmenu-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout);
if (argv[i][0] == '-') exit(EXIT_SUCCESS);
switch (argv[i][1]) {
case 'v':
fputs("dmenu-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout);
exit(EXIT_SUCCESS);
break;
case 't':
if(++i < argc) {
title = argv[i];
break;
}
default:
eprint("usage: dmenu [-v] [-t <title>]\n");
break;
}
else
eprint("usage: dmenu [-v] [-t <title>]\n");
} }
else if(argc != 1)
eprint("usage: dmenu [-v]\n");
dpy = XOpenDisplay(0); dpy = XOpenDisplay(0);
if(!dpy) if(!dpy)
eprint("dmenu: cannot open dpy\n"); eprint("dmenu: cannot open display\n");
screen = DefaultScreen(dpy); screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen); root = RootWindow(dpy, screen);
maxname = readinput(); maxname = readstdin();
/* grab as early as possible, but after reading all items!!! */ /* grab as early as possible, but after reading all items!!! */
while(XGrabKeyboard(dpy, root, True, GrabModeAsync, while(XGrabKeyboard(dpy, root, True, GrabModeAsync,
@ -371,20 +338,12 @@ main(int argc, char *argv[])
dc.gc = XCreateGC(dpy, root, 0, 0); dc.gc = XCreateGC(dpy, root, 0, 0);
if(maxname) if(maxname)
cw = textw(maxname); cmdw = textw(maxname);
if(cw > mw / 3) if(cmdw > mw / 3)
cw = mw / 3; cmdw = mw / 3;
if(title) {
tw = textw(title);
if(tw > mw / 3)
tw = mw / 3;
}
cmdw = title ? tw : cw;
text[0] = 0; text[0] = 0;
input(text); match(text);
XMapRaised(dpy, win); XMapRaised(dpy, win);
drawmenu(); drawmenu();
XSync(dpy, False); XSync(dpy, False);