Compare commits

..

33 Commits
1.0 ... 1.6

Author SHA1 Message Date
c69f397bb9 found compromise 2006-12-07 14:38:31 +01:00
b9fbd59c8a people should define fixed being compatible with their locale 2006-12-07 12:03:47 +01:00
da2b90ddd1 using -*-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-* fixed by default 2006-12-07 11:55:46 +01:00
dd7ee0dae1 also fixing dmenu accordingly 2006-12-07 10:06:06 +01:00
250aa199bb only setting LC_CTYPE 2006-12-05 13:30:37 +01:00
5d43e9243c enforcing using imcomplete fonsets anyways 2006-12-05 10:31:20 +01:00
1026eb8308 Added tag 1.5 for changeset e071fb045bd9e8574947acff7196360bc0270e68 2006-11-30 09:21:14 +01:00
c65fdd6252 next version will be 1.5 2006-11-26 15:49:47 +01:00
8c20e5dbd3 fixing sizeof stuff 2006-11-26 15:49:33 +01:00
26fbf124fa Added tag 1.4 for changeset df3fbb050004c544d14e43c36f6a94cca6ed4a69 2006-10-26 12:14:03 +02:00
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 111 additions and 136 deletions

View File

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

View File

@ -19,11 +19,7 @@ options:
@echo CC $< @echo CC $<
@${CC} -c ${CFLAGS} $< @${CC} -c ${CFLAGS} $<
${OBJ}: dmenu.h config.h config.mk ${OBJ}: dmenu.h config.mk
config.h:
@echo creating $@ from config.default.h
@cp config.default.h $@
dmenu: ${OBJ} dmenu: ${OBJ}
@echo LD $@ @echo LD $@
@ -37,8 +33,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.*.h config.mk \ @cp -R LICENSE Makefile README 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
@rm -rf dmenu-${VERSION} @rm -rf dmenu-${VERSION}

8
README
View File

@ -1,5 +1,5 @@
dmenu - dynamic menu dmenu - dynamic menu
-------------------- ====================
dmenu is a generic and efficient menu for X. dmenu is a generic and efficient menu for X.
@ -22,9 +22,3 @@ necessary as root):
Running dmenu Running dmenu
------------- -------------
See the man page for details. 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 # dmenu version
VERSION = 1.0 VERSION = 1.6
# Customize below to fit your system # Customize below to fit your system

27
dmenu.1
View File

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

12
dmenu.h
View File

@ -1,13 +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. * See LICENSE file for license details.
*/ */
#include "config.h"
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/Xlocale.h>
#define SPACE 30 /* px */ #define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*"
#define NORMBGCOLOR "#333366"
#define NORMFGCOLOR "#cccccc"
#define SELBGCOLOR "#666699"
#define SELFGCOLOR "#eeeeee"
#define SPACE 30 /* px */
/* color */ /* color */
enum { ColFG, ColBG, ColLast }; enum { ColFG, ColBG, ColLast };

28
draw.c
View File

@ -1,11 +1,9 @@
/* /* (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. * See LICENSE file for license details.
*/ */
#include "dmenu.h" #include "dmenu.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <X11/Xlocale.h>
/* static */ /* static */
@ -32,21 +30,17 @@ drawtext(const char *text, unsigned long col[ColLast]) {
XSetForeground(dpy, dc.gc, col[ColBG]); XSetForeground(dpy, dc.gc, col[ColBG]);
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
if(!text) if(!text)
return; return;
w = 0; w = 0;
olen = 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);
buf[len] = 0; buf[len] = 0;
h = dc.font.ascent + dc.font.descent; h = dc.font.ascent + dc.font.descent;
y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
x = dc.x + (h / 2); x = dc.x + (h / 2);
/* 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;
@ -58,10 +52,8 @@ drawtext(const char *text, unsigned long col[ColLast]) {
if(len > 3) if(len > 3)
buf[len - 3] = '.'; buf[len - 3] = '.';
} }
if(w > dc.w) if(w > dc.w)
return; /* too long */ return; /* too long */
gcv.foreground = col[ColFG]; gcv.foreground = col[ColFG];
if(dc.font.set) { if(dc.font.set) {
XChangeGC(dpy, dc.gc, GCForeground, &gcv); XChangeGC(dpy, dc.gc, GCForeground, &gcv);
@ -80,32 +72,26 @@ getcolor(const char *colstr) {
Colormap cmap = DefaultColormap(dpy, screen); Colormap cmap = DefaultColormap(dpy, screen);
XColor color; 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; return color.pixel;
} }
void void
setfont(const char *fontstr) { setfont(const char *fontstr) {
char **missing, *def; char *def, **missing;
int i, n; int i, n;
missing = NULL; missing = NULL;
setlocale(LC_ALL, "");
if(dc.font.set) if(dc.font.set)
XFreeFontSet(dpy, dc.font.set); XFreeFontSet(dpy, dc.font.set);
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
if(missing) { if(missing)
XFreeStringList(missing); XFreeStringList(missing);
if(dc.font.set) {
XFreeFontSet(dpy, dc.font.set);
dc.font.set = NULL;
}
}
if(dc.font.set) { if(dc.font.set) {
XFontSetExtents *font_extents; XFontSetExtents *font_extents;
XFontStruct **xfonts; XFontStruct **xfonts;
char **font_names; char **font_names;
dc.font.ascent = dc.font.descent = 0; dc.font.ascent = dc.font.descent = 0;
font_extents = XExtentsOfFontSet(dc.font.set); font_extents = XExtentsOfFontSet(dc.font.set);
n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);

115
main.c
View File

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