Compare commits

..

23 Commits
1.0 ... 1.4

Author SHA1 Message Date
194d890517 removed misleading input cursor 2006-10-23 12:53:35 +02:00
f633276774 fixing arg handling in dmenu (thanks to Sander for his report) 2006-10-23 10:12:09 +02:00
bb480fb4b0 Added tag 1.3 for changeset 2eb9997be51cb1b11a8900728ccc0904f9371157 2006-10-13 11:08:35 +02:00
95b19f75cc changing order 2006-10-12 12:59:37 +02:00
3d25a327aa simplified util.c 2006-10-12 12:58:34 +02:00
d78bcf247f simplified main event loop 2006-10-10 19:15:06 +02:00
afaf66dc99 Added tag 1.2 for changeset bee7fe6d1189174d0204ca3195b83cdc1bb4f82e 2006-10-06 13:44:22 +02:00
63be0ee22a small change 2006-10-06 12:40:49 +02:00
ca973eb64e changing version info 2006-10-06 12:39:06 +02:00
5fd7af18c6 removed useless newlines 2006-10-06 11:52:57 +02:00
02238725f6 small update to man page (backported) 2006-09-26 17:51:22 +02:00
2d5afd7c01 Added tag 1.1 for changeset e8c1e9733752db12f2dbd1fa93c46f5806242ba9 2006-09-26 17:39:04 +02:00
f7615e220e updated README 2006-09-26 14:31:42 +02:00
e7ecae0d58 removed crap from Makefile 2006-09-26 14:30:48 +02:00
b661ca75de error handling 2006-09-26 13:45:41 +02:00
c02da9f87e foo 2006-09-26 13:41:51 +02:00
14133be5bd reverting 2006-09-26 13:39:00 +02:00
3b590beda2 added fallback to color initialization 2006-09-26 13:37:36 +02:00
5c0d28e4ff removed config.h stuff, made dwm configurable due to command line options 2006-09-26 13:20:47 +02:00
e0fe9f2fca uriel didn't understood dmenu code, he broke nearly everything 2006-09-26 08:47:10 +02:00
c9465859a6 applied a change made by Uriel to dmenu (though I didn't applied everything) 2006-09-26 08:43:41 +02:00
1716159e05 applied something similiar to Jukkas patch 2006-09-25 08:29:20 +02:00
11b6401668 Added tag 1.0 for changeset 9e11140d4cc3eecac3b0ab752f91528fd5e04be8 2006-09-16 11:20:54 +02:00
11 changed files with 97 additions and 118 deletions

View File

@ -7,3 +7,7 @@ d352e9dc112ee96aa5cad961a0ed880ae9ce7276 0.3
5fc20d7158bd16b4d5f8d1c25e177680b6d54252 0.7
409667a57221f7e50ba8b5248f638915cd61b366 0.8
d046c818ea467555cc338751c9bf3024609f1f12 0.9
9e11140d4cc3eecac3b0ab752f91528fd5e04be8 1.0
e8c1e9733752db12f2dbd1fa93c46f5806242ba9 1.1
bee7fe6d1189174d0204ca3195b83cdc1bb4f82e 1.2
2eb9997be51cb1b11a8900728ccc0904f9371157 1.3

View File

@ -19,11 +19,7 @@ options:
@echo CC $<
@${CC} -c ${CFLAGS} $<
${OBJ}: dmenu.h config.h config.mk
config.h:
@echo creating $@ from config.default.h
@cp config.default.h $@
${OBJ}: dmenu.h config.mk
dmenu: ${OBJ}
@echo LD $@
@ -37,8 +33,7 @@ clean:
dist: clean
@echo creating dist tarball
@mkdir -p dmenu-${VERSION}
@cp -R LICENSE Makefile README config.*.h config.mk \
dmenu.1 dmenu.h ${SRC} dmenu-${VERSION}
@cp -R LICENSE Makefile README config.mk dmenu.1 dmenu.h ${SRC} dmenu-${VERSION}
@tar -cf dmenu-${VERSION}.tar dmenu-${VERSION}
@gzip dmenu-${VERSION}.tar
@rm -rf dmenu-${VERSION}

8
README
View File

@ -1,5 +1,5 @@
dmenu - dynamic menu
--------------------
====================
dmenu is a generic and efficient menu for X.
@ -22,9 +22,3 @@ necessary as root):
Running dmenu
-------------
See the man page for details.
Configuration
-------------
The configuration of dmenu is done by creating a custom config.h
and (re)compiling the source code.

View File

@ -1,11 +0,0 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*"
#define SELBGCOLOR "#333366"
#define SELFGCOLOR "#eeeeee"
#define NORMBGCOLOR "#333333"
#define NORMFGCOLOR "#dddddd"
#define STDIN_TIMEOUT 3 /* seconds */

View File

@ -1,11 +0,0 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#define FONT "fixed"
#define SELBGCOLOR "#666699"
#define SELFGCOLOR "#eeeeee"
#define NORMBGCOLOR "#333366"
#define NORMFGCOLOR "#cccccc"
#define STDIN_TIMEOUT 3 /* seconds */

View File

@ -1,5 +1,5 @@
# dmenu version
VERSION = 1.0
VERSION = 1.4
# Customize below to fit your system

27
dmenu.1
View File

@ -3,6 +3,12 @@
dmenu \- dynamic menu
.SH SYNOPSIS
.B dmenu
.RB [ \-font " <name>"]
.RB [ \-normbg " <color>"]
.RB [ \-normfg " <color>"]
.RB [ \-selbg " <color>"]
.RB [ \-selfg " <color>"]
.RB [ \-t " <seconds>"]
.RB [ \-v ]
.SH DESCRIPTION
.SS Overview
@ -12,6 +18,24 @@ It manages huge amounts (up to 10.000 and more) of user defined menu items
efficiently.
.SS Options
.TP
.B \-font <name>
defines the font.
.TP
.B \-normbg <color>
defines the normal background color (#RGB, #RRGGBB, and color names are supported).
.TP
.B \-normfg <color>
defines the normal foreground color (#RGB, #RRGGBB, and color names are supported).
.TP
.B \-selbg <color>
defines the selected background color (#RGB, #RRGGBB, and color names are supported).
.TP
.B \-selfg <color>
defines the selected foreground color (#RGB, #RRGGBB, and color names are supported).
.TP
.B \-t <seconds>
defines the seconds to wait for standard input, before exiting (default is 3).
.TP
.B \-v
prints version information to standard output, then exits.
.SH USAGE
@ -52,8 +76,5 @@ Remove enough characters from the input field to change its filtering effect.
.TP
.B Control-u
Remove all characters from the input field.
.SH CUSTOMIZATION
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
.BR dwm (1)

View File

@ -1,12 +1,15 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "config.h"
#include <X11/Xlib.h>
#include <X11/Xlocale.h>
#define FONT "fixed"
#define NORMBGCOLOR "#333366"
#define NORMFGCOLOR "#cccccc"
#define SELBGCOLOR "#666699"
#define SELFGCOLOR "#eeeeee"
#define SPACE 30 /* px */
/* color */

13
draw.c
View File

@ -1,5 +1,4 @@
/*
* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
/* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dmenu.h"
@ -32,21 +31,17 @@ drawtext(const char *text, unsigned long col[ColLast]) {
XSetForeground(dpy, dc.gc, col[ColBG]);
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
if(!text)
return;
w = 0;
olen = len = strlen(text);
if(len >= sizeof(buf))
len = sizeof(buf) - 1;
memcpy(buf, text, len);
buf[len] = 0;
h = dc.font.ascent + dc.font.descent;
y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
x = dc.x + (h / 2);
/* shorten text if necessary */
while(len && (w = textnw(buf, len)) > dc.w - h)
buf[--len] = 0;
@ -58,10 +53,8 @@ drawtext(const char *text, unsigned long col[ColLast]) {
if(len > 3)
buf[len - 3] = '.';
}
if(w > dc.w)
return; /* too long */
gcv.foreground = col[ColFG];
if(dc.font.set) {
XChangeGC(dpy, dc.gc, GCForeground, &gcv);
@ -80,7 +73,8 @@ getcolor(const char *colstr) {
Colormap cmap = DefaultColormap(dpy, screen);
XColor color;
XAllocNamedColor(dpy, cmap, colstr, &color, &color);
if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
eprint("error, cannot allocate color '%s'\n", colstr);
return color.pixel;
}
@ -105,7 +99,6 @@ setfont(const char *fontstr) {
XFontSetExtents *font_extents;
XFontStruct **xfonts;
char **font_names;
dc.font.ascent = dc.font.descent = 0;
font_extents = XExtentsOfFontSet(dc.font.set);
n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);

95
main.c
View File

@ -1,9 +1,7 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* (C)opyright MMVI Sander van Dijk <a dot h dot vandijk at gmail dot com>
* See LICENSE file for license details.
*/
#include "dmenu.h"
#include <ctype.h>
@ -13,7 +11,6 @@
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include <X11/cursorfont.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
@ -42,12 +39,11 @@ static Window root;
static Window win;
static void
calcoffsets() {
calcoffsets(void) {
unsigned int tw, w;
if(!curr)
return;
w = cmdw + 2 * SPACE;
for(next = curr; next; next=next->right) {
tw = textw(next->text);
@ -57,7 +53,6 @@ calcoffsets() {
if(w > mw)
break;
}
w = cmdw + 2 * SPACE;
for(prev = curr; prev && prev->left; prev=prev->left) {
tw = textw(prev->left->text);
@ -70,7 +65,7 @@ calcoffsets() {
}
static void
drawmenu() {
drawmenu(void) {
Item *i;
dc.x = 0;
@ -78,18 +73,15 @@ drawmenu() {
dc.w = mw;
dc.h = mh;
drawtext(NULL, dc.norm);
/* print command */
if(cmdw && item)
dc.w = cmdw;
drawtext(text[0] ? text : NULL, dc.norm);
dc.x += cmdw;
if(curr) {
dc.w = SPACE;
drawtext((curr && curr->left) ? "<" : NULL, dc.norm);
dc.x += dc.w;
/* determine maximum items */
for(i = curr; i != next; i=i->right) {
dc.w = textw(i->text);
@ -98,7 +90,6 @@ drawmenu() {
drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
dc.x += dc.w;
}
dc.x = mw - SPACE;
dc.w = SPACE;
drawtext(next ? ">" : NULL, dc.norm);
@ -114,11 +105,9 @@ match(char *pattern) {
if(!pattern)
return;
plen = strlen(pattern);
item = j = NULL;
nitem = 0;
for(i = allitems; i; i=i->next)
if(!plen || !strncmp(pattern, i->text, plen)) {
if(!j)
@ -142,7 +131,6 @@ match(char *pattern) {
j = i;
nitem++;
}
curr = prev = next = sel = item;
calcoffsets();
}
@ -157,12 +145,10 @@ kpress(XKeyEvent * e) {
len = strlen(text);
buf[0] = 0;
num = XLookupString(e, buf, sizeof(buf), &ksym, 0);
if(IsFunctionKey(ksym) || IsKeypadKey(ksym)
|| IsMiscFunctionKey(ksym) || IsPFKey(ksym)
|| IsPrivateKeypadKey(ksym))
return;
/* first check if a control mask is omitted */
if(e->state & ControlMask) {
switch (ksym) {
@ -208,10 +194,8 @@ kpress(XKeyEvent * e) {
}
break;
case XK_Return:
if(e->state & ShiftMask) {
if(text)
if((e->state & ShiftMask) && text)
fprintf(stdout, "%s", text);
}
else if(sel)
fprintf(stdout, "%s", sel->text);
else if(text)
@ -247,7 +231,7 @@ kpress(XKeyEvent * e) {
}
static char *
readstdin() {
readstdin(void) {
static char *maxname = NULL;
char *p, buf[1024];
unsigned int len = 0, max = 0;
@ -263,7 +247,6 @@ readstdin() {
maxname = p;
max = len;
}
new = emalloc(sizeof(Item));
new->next = new->left = new->right = NULL;
new->text = p;
@ -285,20 +268,47 @@ DC dc = {0};
int
main(int argc, char *argv[]) {
char *font = FONT;
char *maxname;
char *normbg = NORMBGCOLOR;
char *normfg = NORMFGCOLOR;
char *selbg = SELBGCOLOR;
char *selfg = SELFGCOLOR;
fd_set rd;
int i;
struct timeval timeout;
Item *i;
Item *itm;
XEvent ev;
XSetWindowAttributes wa;
if(argc == 2 && !strncmp("-v", argv[1], 3)) {
timeout.tv_usec = 0;
timeout.tv_sec = 3;
/* command line args */
for(i = 1; i < argc; i++)
if(!strncmp(argv[i], "-font", 6)) {
if(++i < argc) font = argv[i];
}
else if(!strncmp(argv[i], "-normbg", 8)) {
if(++i < argc) normbg = argv[i];
}
else if(!strncmp(argv[i], "-normfg", 8)) {
if(++i < argc) normfg = argv[i];
}
else if(!strncmp(argv[i], "-selbg", 7)) {
if(++i < argc) selbg = argv[i];
}
else if(!strncmp(argv[i], "-selfg", 7)) {
if(++i < argc) selfg = argv[i];
}
else if(!strncmp(argv[i], "-t", 3)) {
if(++i < argc) timeout.tv_sec = atoi(argv[i]);
}
else if(!strncmp(argv[i], "-v", 3)) {
fputs("dmenu-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout);
exit(EXIT_SUCCESS);
}
else if(argc != 1)
eprint("usage: dmenu [-v]\n");
else
eprint("usage: dmenu [-font <name>] [-{norm,sel}{bg,fg} <color>] [-t <seconds>] [-v]\n", stdout);
dpy = XOpenDisplay(0);
if(!dpy)
eprint("dmenu: cannot open display\n");
@ -313,46 +323,36 @@ main(int argc, char *argv[]) {
while(XGrabKeyboard(dpy, root, True, GrabModeAsync,
GrabModeAsync, CurrentTime) != GrabSuccess)
usleep(1000);
timeout.tv_usec = 0;
timeout.tv_sec = STDIN_TIMEOUT;
FD_ZERO(&rd);
FD_SET(STDIN_FILENO, &rd);
if(select(ConnectionNumber(dpy) + 1, &rd, NULL, NULL, &timeout) < 1)
goto UninitializedEnd;
maxname = readstdin();
/* style */
dc.sel[ColBG] = getcolor(SELBGCOLOR);
dc.sel[ColFG] = getcolor(SELFGCOLOR);
dc.norm[ColBG] = getcolor(NORMBGCOLOR);
dc.norm[ColFG] = getcolor(NORMFGCOLOR);
setfont(FONT);
dc.norm[ColBG] = getcolor(normbg);
dc.norm[ColFG] = getcolor(normfg);
dc.sel[ColBG] = getcolor(selbg);
dc.sel[ColFG] = getcolor(selfg);
setfont(font);
/* menu window */
wa.override_redirect = 1;
wa.background_pixmap = ParentRelative;
wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask;
mx = my = 0;
mw = DisplayWidth(dpy, screen);
mh = dc.font.height + 2;
win = XCreateWindow(dpy, root, mx, my, mw, mh, 0,
DefaultDepth(dpy, screen), CopyFromParent,
DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
XDefineCursor(dpy, win, XCreateFontCursor(dpy, XC_xterm));
/* pixmap */
dc.drawable = XCreatePixmap(dpy, root, mw, mh, DefaultDepth(dpy, screen));
dc.gc = XCreateGC(dpy, root, 0, 0);
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
if(maxname)
cmdw = textw(maxname);
if(cmdw > mw / 3)
cmdw = mw / 3;
text[0] = 0;
match(text);
XMapRaised(dpy, win);
@ -360,7 +360,7 @@ main(int argc, char *argv[]) {
XSync(dpy, False);
/* main event loop */
while(running && !XNextEvent(dpy, &ev)) {
while(running && !XNextEvent(dpy, &ev))
switch (ev.type) {
default: /* ignore all crap */
break;
@ -372,13 +372,13 @@ main(int argc, char *argv[]) {
drawmenu();
break;
}
}
/* cleanup */
while(allitems) {
i = allitems->next;
itm = allitems->next;
free(allitems->text);
free(allitems);
allitems = i;
allitems = itm;
}
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
@ -390,6 +390,5 @@ main(int argc, char *argv[]) {
UninitializedEnd:
XUngrabKeyboard(dpy, CurrentTime);
XCloseDisplay(dpy);
return ret;
}

18
util.c
View File

@ -1,5 +1,4 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dmenu.h"
@ -10,20 +9,12 @@
#include <sys/wait.h>
#include <unistd.h>
/* static */
static void
badmalloc(unsigned int size) {
eprint("fatal: could not malloc() %u bytes\n", size);
}
/* extern */
void *
emalloc(unsigned int size) {
void *res = malloc(size);
if(!res)
badmalloc(size);
eprint("fatal: could not malloc() %u bytes\n", size);
return res;
}
@ -40,7 +31,8 @@ eprint(const char *errstr, ...) {
char *
estrdup(const char *str) {
void *res = strdup(str);
if(!res)
badmalloc(strlen(str));
eprint("fatal: could not malloc() %u bytes\n", strlen(str));
return res;
}