33 Commits
0.7 ... 1.4

Author SHA1 Message Date
Anselm R. Garbe
194d890517 removed misleading input cursor 2006-10-23 12:53:35 +02:00
Anselm R. Garbe
f633276774 fixing arg handling in dmenu (thanks to Sander for his report) 2006-10-23 10:12:09 +02:00
Anselm R. Garbe
bb480fb4b0 Added tag 1.3 for changeset 2eb9997be51cb1b11a8900728ccc0904f9371157 2006-10-13 11:08:35 +02:00
Anselm R. Garbe
95b19f75cc changing order 2006-10-12 12:59:37 +02:00
Anselm R. Garbe
3d25a327aa simplified util.c 2006-10-12 12:58:34 +02:00
Anselm R. Garbe
d78bcf247f simplified main event loop 2006-10-10 19:15:06 +02:00
Anselm R. Garbe
afaf66dc99 Added tag 1.2 for changeset bee7fe6d1189174d0204ca3195b83cdc1bb4f82e 2006-10-06 13:44:22 +02:00
Anselm R. Garbe
63be0ee22a small change 2006-10-06 12:40:49 +02:00
Anselm R. Garbe
ca973eb64e changing version info 2006-10-06 12:39:06 +02:00
Anselm R. Garbe
5fd7af18c6 removed useless newlines 2006-10-06 11:52:57 +02:00
arg@zarathustra
02238725f6 small update to man page (backported) 2006-09-26 17:51:22 +02:00
arg@zarathustra
2d5afd7c01 Added tag 1.1 for changeset e8c1e9733752db12f2dbd1fa93c46f5806242ba9 2006-09-26 17:39:04 +02:00
arg@mmvi
f7615e220e updated README 2006-09-26 14:31:42 +02:00
arg@mmvi
e7ecae0d58 removed crap from Makefile 2006-09-26 14:30:48 +02:00
arg@mmvi
b661ca75de error handling 2006-09-26 13:45:41 +02:00
arg@mmvi
c02da9f87e foo 2006-09-26 13:41:51 +02:00
arg@mmvi
14133be5bd reverting 2006-09-26 13:39:00 +02:00
arg@mmvi
3b590beda2 added fallback to color initialization 2006-09-26 13:37:36 +02:00
arg@mmvi
5c0d28e4ff removed config.h stuff, made dwm configurable due to command line options 2006-09-26 13:20:47 +02:00
arg@mmvi
e0fe9f2fca uriel didn't understood dmenu code, he broke nearly everything 2006-09-26 08:47:10 +02:00
arg@wmii.de
c9465859a6 applied a change made by Uriel to dmenu (though I didn't applied everything) 2006-09-26 08:43:41 +02:00
arg@mmvi
1716159e05 applied something similiar to Jukkas patch 2006-09-25 08:29:20 +02:00
arg@mmvi
11b6401668 Added tag 1.0 for changeset 9e11140d4cc3eecac3b0ab752f91528fd5e04be8 2006-09-16 11:20:54 +02:00
Anselm R. Garbe
81bcf078f6 made function signatures more consistent to my coding style 2006-09-12 10:59:00 +02:00
Anselm R. Garbe
0e5f467aa8 commented dmenu 2006-09-11 13:18:09 +02:00
Anselm R. Garbe
c51406b279 Added tag 0.9 for changeset d046c818ea467555cc338751c9bf3024609f1f12 2006-09-08 08:31:19 +02:00
Anselm R. Garbe
32f7fe4835 implemented early keyboard grab for dmenu with a timeout for stdin data writers to prevent endless grabbings of the keyboard 2006-09-08 07:33:20 +02:00
Anselm R. Garbe
0fa5a339ff new version of dmenu 2006-09-07 19:12:04 +02:00
Anselm R. Garbe
358f078c0b another fix 2006-09-07 09:40:09 +02:00
Anselm R. Garbe
1f207893e6 made dmenu.1 also concise 2006-09-07 09:36:53 +02:00
Anselm R. Garbe
1c5be1c553 Added tag 0.8 for changeset 409667a57221f7e50ba8b5248f638915cd61b366 2006-09-06 10:53:15 +02:00
Anselm R. Garbe
32ea45084b fixed man page 2006-09-04 19:47:09 +02:00
Anselm R. Garbe
cc7d863b6e Added tag 0.7 for changeset 5fc20d7158bd16b4d5f8d1c25e177680b6d54252 2006-09-04 17:17:08 +02:00
11 changed files with 165 additions and 185 deletions

View File

@@ -4,3 +4,10 @@ d352e9dc112ee96aa5cad961a0ed880ae9ce7276 0.3
7acf0dde1120542917bae12e0e42293f9d2cc899 0.4
4a0ecd881c4fc15de4a0bebd79308b064be020ef 0.5
25f679fb19686140a907684ffcb423b9e9d44b53 0.6
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}

10
README
View File

@@ -1,6 +1,6 @@
dmenu - dynamic menu
--------------------
dmenu is a generic, highly customizable, and efficient menu for X.
====================
dmenu is a generic and efficient menu for X.
Requirements
@@ -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,10 +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"

View File

@@ -1,10 +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"

View File

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

84
dmenu.1
View File

@@ -3,62 +3,78 @@
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
.B dmenu
is a generic, highly customizable, and efficient menu for X,
originally designed for
dmenu is a generic menu for X, originally designed for
.BR dwm (1).
It supports arbitrary, user defined menu contents.
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
.B dmenu
reads a list of newline-separated items from standard input and creates a menu.
When the user selects an item or enters any text and presses Return, his choice
is printed to standard output and
.B dmenu
terminates.
.B dmenu
is completely controlled by the keyboard. The following keys are recognized:
dmenu reads a list of newline-separated items from standard input and creates a
menu. When the user selects an item or enters any text and presses Return, his
choice is printed to standard output and dmenu terminates.
.P
dmenu is completely controlled by the keyboard. The following keys are recognized:
.TP
Any printable character
Appends the character to the text in the input field. This works as a filter:
.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
Left/Right
.B Left/Right
Select the previous/next item.
.TP
Tab
.B Tab
Copy the selected item to the input field.
.TP
Return
Confirm selection and quit (print the selected item to standard output).
.B Return
Confirm selection and quit (print the selected item to standard output). Returns
.B 0
on termination.
.TP
Shift-Return
.B Shift-Return
Confirm selection and quit (print the text in the input field to standard output).
Returns
.B 0
on termination.
.TP
Escape
Quit without selecting an item.
.B Escape
Quit without selecting an item. Returns
.B 1
on termination.
.TP
Backspace (Control-h)
.B Backspace (Control-h)
Remove enough characters from the input field to change its filtering effect.
.TP
Control-u
.B Control-u
Remove all characters from the input field.
.P
.B dmenu
returns
.B 0
if Return is pressed on termination,
.B 1
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
.BR dwm (1)

30
dmenu.h
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 */
@@ -23,26 +26,27 @@ struct Fnt {
int height;
};
struct DC { /* draw context */
struct DC {
int x, y, w, h;
unsigned long norm[ColLast];
unsigned long sel[ColLast];
Drawable drawable;
Fnt font;
GC gc;
};
}; /* draw context */
extern int screen;
extern Display *dpy;
extern DC dc;
extern DC dc; /* global drawing context */
/* draw.c */
extern void drawtext(const char *text, unsigned long col[ColLast]);
extern unsigned long getcolor(const char *colstr);
extern void setfont(const char *fontstr);
extern unsigned int textw(const char *text);
extern void drawtext(const char *text,
unsigned long col[ColLast]); /* draws text with the defined color tuple */
extern unsigned long getcolor(const char *colstr); /* returns color of colstr */
extern void setfont(const char *fontstr); /* sets global font */
extern unsigned int textw(const char *text); /* returns width of text in px */
/* util.c */
extern void *emalloc(unsigned int size);
extern void eprint(const char *errstr, ...);
extern char *estrdup(const char *str);
extern void *emalloc(unsigned int size); /* allocates memory, exits on error */
extern void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */
extern char *estrdup(const char *str); /* duplicates str, exits on allocation error */

28
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"
@@ -10,8 +9,7 @@
/* static */
static unsigned int
textnw(const char *text, unsigned int len)
{
textnw(const char *text, unsigned int len) {
XRectangle r;
if(dc.font.set) {
@@ -24,8 +22,7 @@ textnw(const char *text, unsigned int len)
/* extern */
void
drawtext(const char *text, unsigned long col[ColLast])
{
drawtext(const char *text, unsigned long col[ColLast]) {
int x, y, w, h;
static char buf[256];
unsigned int len, olen;
@@ -34,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;
@@ -60,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);
@@ -78,18 +69,17 @@ drawtext(const char *text, unsigned long col[ColLast])
}
unsigned long
getcolor(const char *colstr)
{
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;
}
void
setfont(const char *fontstr)
{
setfont(const char *fontstr) {
char **missing, *def;
int i, n;
@@ -109,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);
@@ -137,7 +126,6 @@ setfont(const char *fontstr)
}
unsigned int
textw(const char *text)
{
textw(const char *text) {
return textnw(text, strlen(text)) + dc.font.height;
}

132
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>
@@ -11,7 +9,8 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <X11/cursorfont.h>
#include <sys/select.h>
#include <sys/time.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
@@ -40,13 +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);
@@ -56,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);
@@ -69,8 +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);
@@ -108,18 +99,15 @@ drawmenu()
}
static void
match(char *pattern)
{
match(char *pattern) {
unsigned int plen;
Item *i, *j;
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)
@@ -143,14 +131,12 @@ match(char *pattern)
j = i;
nitem++;
}
curr = prev = next = sel = item;
calcoffsets();
}
static void
kpress(XKeyEvent * e)
{
kpress(XKeyEvent * e) {
char buf[32];
int num, prev_nitem;
unsigned int i, len;
@@ -159,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) {
@@ -210,10 +194,8 @@ kpress(XKeyEvent * e)
}
break;
case XK_Return:
if(e->state & ShiftMask) {
if(text)
fprintf(stdout, "%s", text);
}
if((e->state & ShiftMask) && text)
fprintf(stdout, "%s", text);
else if(sel)
fprintf(stdout, "%s", sel->text);
else if(text)
@@ -249,8 +231,7 @@ kpress(XKeyEvent * e)
}
static char *
readstdin()
{
readstdin(void) {
static char *maxname = NULL;
char *p, buf[1024];
unsigned int len = 0, max = 0;
@@ -266,7 +247,6 @@ readstdin()
maxname = p;
max = len;
}
new = emalloc(sizeof(Item));
new->next = new->left = new->right = NULL;
new->text = p;
@@ -287,64 +267,92 @@ Display *dpy;
DC dc = {0};
int
main(int argc, char *argv[])
{
main(int argc, char *argv[]) {
char *font = FONT;
char *maxname;
Item *i;
char *normbg = NORMBGCOLOR;
char *normfg = NORMFGCOLOR;
char *selbg = SELBGCOLOR;
char *selfg = SELFGCOLOR;
fd_set rd;
int i;
struct timeval timeout;
Item *itm;
XEvent ev;
XSetWindowAttributes wa;
if(argc == 2 && !strncmp("-v", argv[1], 3)) {
fputs("dmenu-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout);
exit(EXIT_SUCCESS);
}
else if(argc != 1)
eprint("usage: dmenu [-v]\n");
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
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");
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
maxname = readstdin();
/* grab as early as possible, but after reading all items!!! */
/* Note, the select() construction allows to grab all keypresses as
* early as possible, to not loose them. But if there is no standard
* input supplied, we will make sure to exit after MAX_WAIT_STDIN
* seconds. This is convenience behavior for rapid typers.
*/
while(XGrabKeyboard(dpy, root, True, GrabModeAsync,
GrabModeAsync, CurrentTime) != GrabSuccess)
usleep(1000);
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);
@@ -352,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;
@@ -364,14 +372,13 @@ main(int argc, char *argv[])
drawmenu();
break;
}
}
XUngrabKeyboard(dpy, CurrentTime);
/* 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);
@@ -380,7 +387,8 @@ main(int argc, char *argv[])
XFreePixmap(dpy, dc.drawable);
XFreeGC(dpy, dc.gc);
XDestroyWindow(dpy, win);
UninitializedEnd:
XUngrabKeyboard(dpy, CurrentTime);
XCloseDisplay(dpy);
return ret;
}

28
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,28 +9,17 @@
#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)
{
emalloc(unsigned int size) {
void *res = malloc(size);
if(!res)
badmalloc(size);
eprint("fatal: could not malloc() %u bytes\n", size);
return res;
}
void
eprint(const char *errstr, ...)
{
eprint(const char *errstr, ...) {
va_list ap;
va_start(ap, errstr);
@@ -41,10 +29,10 @@ eprint(const char *errstr, ...)
}
char *
estrdup(const char *str)
{
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;
}