Compare commits

...

30 Commits
0.4 ... 0.8

Author SHA1 Message Date
32ea45084b fixed man page 2006-09-04 19:47:09 +02:00
cc7d863b6e Added tag 0.7 for changeset 5fc20d7158bd16b4d5f8d1c25e177680b6d54252 2006-09-04 17:17:08 +02:00
04eade6a76 small change of main event loop 2006-09-04 07:28:03 +02:00
49ce444d32 updated version 2006-08-28 12:26:25 +02:00
2e9515ee27 Added tag 0.6 for changeset 25f679fb19686140a907684ffcb423b9e9d44b53 2006-08-28 10:20:10 +02:00
d4a4cc1ab8 updated man page 2006-08-28 07:22:38 +02:00
11bda99968 fixed 2006-08-25 18:15:24 +02:00
82b0bc83f8 switching back to a dark color scheme with larger font 2006-08-25 18:03:30 +02:00
bd1172e689 small color fixes 2006-08-25 17:44:40 +02:00
13ef97e65e updated dmenu to borderless drawing as well 2006-08-25 14:45:17 +02:00
65be999a3f back to 3 colors 2006-08-25 07:54:20 +02:00
37faefb1aa removed useless call 2006-08-24 12:04:41 +02:00
18ec376aa9 fixed minor bug 2006-08-24 12:03:40 +02:00
6c1e46654d small color change 2006-08-24 11:57:58 +02:00
e980c7ff18 migrated dmenu to use 4 instead of 3 colors 2006-08-24 11:47:08 +02:00
7848b53dc3 Added tag 0.5 for changeset 4a0ecd881c4fc15de4a0bebd79308b064be020ef 2006-08-24 10:22:51 +02:00
865c938856 prepared dmenu-0.5 2006-08-24 10:22:30 +02:00
30d72e5f87 removed unnecessary Xlib call 2006-08-24 09:27:01 +02:00
0ffd139f2c sanitizing my colorscheme 2006-08-23 19:05:20 +02:00
86512ce930 back to terminus font 2006-08-23 18:55:48 +02:00
d3206194c1 font fix 2006-08-22 10:01:45 +02:00
8148b515a1 fixed 2006-08-22 09:49:56 +02:00
35210e3998 applied OpenBSD changes.. 2006-08-21 17:45:46 +02:00
df85dd743c renamed bad_malloc into badmalloc as well 2006-08-21 07:34:16 +02:00
d9f6fa426b small changes in dmenu.1 2006-08-21 07:31:33 +02:00
bbb2cc2a72 fixed a typo in config.mk, fixed cleanup code in dmenu (now frees all allocated stuff) 2006-08-16 19:25:04 +02:00
02ddc93c94 applied sanders patch 2006-08-16 12:37:01 +02:00
0faf441367 applied sanders Makefile patch 2006-08-16 08:57:10 +02:00
be6b534520 fixed the same issue in dmenu 2006-08-15 16:56:55 +02:00
db76b0f9a5 Added tag 0.4 for changeset 7acf0dde1120542917bae12e0e42293f9d2cc899 2006-08-15 10:39:26 +02:00
11 changed files with 69 additions and 67 deletions

View File

@ -1,3 +1,7 @@
fcc8a282cb52c6a9343b461026b386825590cd31 0.1
656be0f47df545dfdd2e1e0663663b8b1b26f031 0.2
d352e9dc112ee96aa5cad961a0ed880ae9ce7276 0.3
7acf0dde1120542917bae12e0e42293f9d2cc899 0.4
4a0ecd881c4fc15de4a0bebd79308b064be020ef 0.5
25f679fb19686140a907684ffcb423b9e9d44b53 0.6
5fc20d7158bd16b4d5f8d1c25e177680b6d54252 0.7

View File

@ -19,7 +19,7 @@ options:
@echo CC $<
@${CC} -c ${CFLAGS} $<
${OBJ}: dmenu.h config.h
${OBJ}: dmenu.h config.h config.mk
config.h:
@echo creating $@ from config.default.h

3
README
View File

@ -1,7 +1,6 @@
dmenu - dynamic menu
--------------------
dmenu is a generic, highly customizable, and efficient menu for the
X Window System.
dmenu is a generic, highly customizable, and efficient menu for X.
Requirements

View File

@ -4,6 +4,7 @@
*/
#define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*"
#define BGCOLOR "#0d121d"
#define FGCOLOR "#eeeeee"
#define BORDERCOLOR "#3f484d"
#define SELBGCOLOR "#333366"
#define SELFGCOLOR "#eeeeee"
#define NORMBGCOLOR "#333333"
#define NORMFGCOLOR "#dddddd"

View File

@ -4,6 +4,7 @@
*/
#define FONT "fixed"
#define BGCOLOR "#666699"
#define FGCOLOR "#eeeeee"
#define BORDERCOLOR "#9999CC"
#define SELBGCOLOR "#666699"
#define SELFGCOLOR "#eeeeee"
#define NORMBGCOLOR "#333366"
#define NORMFGCOLOR "#cccccc"

View File

@ -1,5 +1,5 @@
# dmenu version
VERSION = 0.4
VERSION = 0.8
# Customize below to fit your system
@ -11,7 +11,7 @@ X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib
# includes and libs
INCS = -I/usr/lib -I${X11INC}
INCS = -I. -I/usr/include -I${X11INC}
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
# flags

16
dmenu.1
View File

@ -7,19 +7,19 @@ dmenu \- dynamic menu
.SH DESCRIPTION
.SS Overview
.B dmenu
is a generic, highly customizable, and efficient menu for the X Window System,
originally designed for
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 \-v
prints version information to stdout, then exits.
prints version information to standard output, then exits.
.SH USAGE
.B dmenu
reads a list of newline-separated items from stdin and creates a menu.
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 stdout and
is printed to standard output and
.B dmenu
terminates.
.B dmenu
@ -36,10 +36,10 @@ Tab
Copy the selected item to the input field.
.TP
Return
Confirm selection and quit (print the selected item to stdout).
Confirm selection and quit (print the selected item to standard output).
.TP
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 standard output).
.TP
Escape
Quit without selecting an item.

10
dmenu.h
View File

@ -9,6 +9,9 @@
#define SPACE 30 /* px */
/* color */
enum { ColFG, ColBG, ColLast };
typedef struct DC DC;
typedef struct Fnt Fnt;
@ -22,9 +25,8 @@ struct Fnt {
struct DC { /* draw context */
int x, y, w, h;
unsigned long bg;
unsigned long fg;
unsigned long border;
unsigned long norm[ColLast];
unsigned long sel[ColLast];
Drawable drawable;
Fnt font;
GC gc;
@ -35,7 +37,7 @@ extern Display *dpy;
extern DC dc;
/* draw.c */
extern void drawtext(const char *text, Bool invert, Bool border);
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);

34
draw.c
View File

@ -24,38 +24,21 @@ textnw(const char *text, unsigned int len)
/* extern */
void
drawtext(const char *text, Bool invert, Bool border)
drawtext(const char *text, unsigned long col[ColLast])
{
int x, y, w, h;
static char buf[256];
unsigned int len, olen;
XGCValues gcv;
XPoint points[5];
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
XSetForeground(dpy, dc.gc, col[ColBG]);
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
w = 0;
if(border) {
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)
return;
w = 0;
olen = len = strlen(text);
if(len >= sizeof(buf))
len = sizeof(buf) - 1;
@ -81,17 +64,16 @@ drawtext(const char *text, Bool invert, Bool border)
if(w > dc.w)
return; /* too long */
gcv.foreground = invert ? dc.bg : dc.fg;
gcv.background = invert ? dc.fg : dc.bg;
gcv.foreground = col[ColFG];
if(dc.font.set) {
XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv);
XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc,
XChangeGC(dpy, dc.gc, GCForeground, &gcv);
XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc,
x, y, buf, len);
}
else {
gcv.font = dc.font.xfont->fid;
XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);
XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
}
}

43
main.c
View File

@ -29,7 +29,7 @@ static int mx, my, mw, mh;
static int ret = 0;
static int nitem = 0;
static unsigned int cmdw = 0;
static Bool done = False;
static Bool running = True;
static Item *allitems = NULL; /* first of all items */
static Item *item = NULL; /* first of pattern matching items */
static Item *sel = NULL;
@ -77,17 +77,17 @@ drawmenu()
dc.y = 0;
dc.w = mw;
dc.h = mh;
drawtext(NULL, False, False);
drawtext(NULL, dc.norm);
/* print command */
if(cmdw && item)
dc.w = cmdw;
drawtext(text[0] ? text : NULL, False, False);
drawtext(text[0] ? text : NULL, dc.norm);
dc.x += cmdw;
if(curr) {
dc.w = SPACE;
drawtext((curr && curr->left) ? "<" : NULL, False, False);
drawtext((curr && curr->left) ? "<" : NULL, dc.norm);
dc.x += dc.w;
/* determine maximum items */
@ -95,13 +95,13 @@ drawmenu()
dc.w = textw(i->text);
if(dc.w > mw / 3)
dc.w = mw / 3;
drawtext(i->text, sel == i, sel == i);
drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
dc.x += dc.w;
}
dc.x = mw - SPACE;
dc.w = SPACE;
drawtext(next ? ">" : NULL, False, False);
drawtext(next ? ">" : NULL, dc.norm);
}
XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0);
XFlush(dpy);
@ -219,11 +219,11 @@ kpress(XKeyEvent * e)
else if(text)
fprintf(stdout, "%s", text);
fflush(stdout);
done = True;
running = False;
break;
case XK_Escape:
ret = 1;
done = True;
running = False;
break;
case XK_BackSpace:
if((i = len)) {
@ -290,6 +290,7 @@ int
main(int argc, char *argv[])
{
char *maxname;
Item *i;
XEvent ev;
XSetWindowAttributes wa;
@ -314,9 +315,10 @@ main(int argc, char *argv[])
usleep(1000);
/* style */
dc.bg = getcolor(BGCOLOR);
dc.fg = getcolor(FGCOLOR);
dc.border = getcolor(BORDERCOLOR);
dc.sel[ColBG] = getcolor(SELBGCOLOR);
dc.sel[ColFG] = getcolor(SELFGCOLOR);
dc.norm[ColBG] = getcolor(NORMBGCOLOR);
dc.norm[ColFG] = getcolor(NORMFGCOLOR);
setfont(FONT);
wa.override_redirect = 1;
@ -325,7 +327,7 @@ main(int argc, char *argv[])
mx = my = 0;
mw = DisplayWidth(dpy, screen);
mh = dc.font.height + 4;
mh = dc.font.height + 2;
win = XCreateWindow(dpy, root, mx, my, mw, mh, 0,
DefaultDepth(dpy, screen), CopyFromParent,
@ -336,6 +338,7 @@ main(int argc, char *argv[])
/* 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);
@ -349,8 +352,10 @@ main(int argc, char *argv[])
XSync(dpy, False);
/* main event loop */
while(!done && !XNextEvent(dpy, &ev)) {
while(running && !XNextEvent(dpy, &ev)) {
switch (ev.type) {
default: /* ignore all crap */
break;
case KeyPress:
kpress(&ev.xkey);
break;
@ -358,12 +363,20 @@ main(int argc, char *argv[])
if(ev.xexpose.count == 0)
drawmenu();
break;
default:
break;
}
}
XUngrabKeyboard(dpy, CurrentTime);
while(allitems) {
i = allitems->next;
free(allitems->text);
free(allitems);
allitems = i;
}
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
else
XFreeFont(dpy, dc.font.xfont);
XFreePixmap(dpy, dc.drawable);
XFreeGC(dpy, dc.gc);
XDestroyWindow(dpy, win);

6
util.c
View File

@ -13,7 +13,7 @@
/* static */
static void
bad_malloc(unsigned int size)
badmalloc(unsigned int size)
{
eprint("fatal: could not malloc() %u bytes\n", size);
}
@ -25,7 +25,7 @@ emalloc(unsigned int size)
{
void *res = malloc(size);
if(!res)
bad_malloc(size);
badmalloc(size);
return res;
}
@ -45,6 +45,6 @@ estrdup(const char *str)
{
void *res = strdup(str);
if(!res)
bad_malloc(strlen(str));
badmalloc(strlen(str));
return res;
}