@@ -4,6 +4,7 @@ | |||||
*/ | */ | ||||
#define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*" | #define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*" | ||||
#define BGCOLOR "#666699" | |||||
#define FGCOLOR "#eeeeee" | |||||
#define BORDERCOLOR "#9999CC" | |||||
#define SELBGCOLOR "#666699" | |||||
#define SELFGCOLOR "#eeeeee" | |||||
#define NORMBGCOLOR "#333366" | |||||
#define NORMFGCOLOR "#cccccc" |
@@ -4,6 +4,7 @@ | |||||
*/ | */ | ||||
#define FONT "fixed" | #define FONT "fixed" | ||||
#define BGCOLOR "#666699" | |||||
#define FGCOLOR "#eeeeee" | |||||
#define BORDERCOLOR "#9999CC" | |||||
#define SELBGCOLOR "#666699" | |||||
#define SELFGCOLOR "#eeeeee" | |||||
#define NORMBGCOLOR "#333366" | |||||
#define NORMFGCOLOR "#cccccc" |
@@ -9,6 +9,9 @@ | |||||
#define SPACE 30 /* px */ | #define SPACE 30 /* px */ | ||||
/* color */ | |||||
enum { ColFG, ColBG, ColLast }; | |||||
typedef struct DC DC; | typedef struct DC DC; | ||||
typedef struct Fnt Fnt; | typedef struct Fnt Fnt; | ||||
@@ -22,9 +25,8 @@ struct Fnt { | |||||
struct DC { /* draw context */ | struct DC { /* draw context */ | ||||
int x, y, w, h; | int x, y, w, h; | ||||
unsigned long bg; | |||||
unsigned long fg; | |||||
unsigned long border; | |||||
unsigned long norm[ColLast]; | |||||
unsigned long sel[ColLast]; | |||||
Drawable drawable; | Drawable drawable; | ||||
Fnt font; | Fnt font; | ||||
GC gc; | GC gc; | ||||
@@ -35,7 +37,7 @@ extern Display *dpy; | |||||
extern DC dc; | extern DC dc; | ||||
/* draw.c */ | /* 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 unsigned long getcolor(const char *colstr); | ||||
extern void setfont(const char *fontstr); | extern void setfont(const char *fontstr); | ||||
extern unsigned int textw(const char *text); | extern unsigned int textw(const char *text); | ||||
@@ -24,37 +24,21 @@ textnw(const char *text, unsigned int len) | |||||
/* extern */ | /* extern */ | ||||
void | void | ||||
drawtext(const char *text, Bool invert, Bool border) | |||||
drawtext(const char *text, unsigned long col[ColLast]) | |||||
{ | { | ||||
int x, y, w, h; | int x, y, w, h; | ||||
static char buf[256]; | static char buf[256]; | ||||
unsigned int len, olen; | 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, col[ColBG]); | |||||
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); | XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); | ||||
w = 0; | |||||
if(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); | |||||
XSetForeground(dpy, dc.gc, dc.border); | |||||
XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); | |||||
} | |||||
if(!text) | if(!text) | ||||
return; | return; | ||||
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; | ||||
@@ -80,17 +64,16 @@ drawtext(const char *text, Bool invert, Bool border) | |||||
if(w > dc.w) | if(w > dc.w) | ||||
return; /* too long */ | 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) { | 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); | x, y, buf, len); | ||||
} | } | ||||
else { | else { | ||||
gcv.font = dc.font.xfont->fid; | 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); | |||||
} | } | ||||
} | } | ||||
@@ -77,17 +77,17 @@ drawmenu() | |||||
dc.y = 0; | dc.y = 0; | ||||
dc.w = mw; | dc.w = mw; | ||||
dc.h = mh; | dc.h = mh; | ||||
drawtext(NULL, False, False); | |||||
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, False, False); | |||||
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, False, False); | |||||
drawtext((curr && curr->left) ? "<" : NULL, dc.norm); | |||||
dc.x += dc.w; | dc.x += dc.w; | ||||
/* determine maximum items */ | /* determine maximum items */ | ||||
@@ -95,13 +95,13 @@ drawmenu() | |||||
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; | ||||
drawtext(i->text, sel == i, sel == i); | |||||
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, False, False); | |||||
drawtext(next ? ">" : NULL, dc.norm); | |||||
} | } | ||||
XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); | XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); | ||||
XFlush(dpy); | XFlush(dpy); | ||||
@@ -315,9 +315,10 @@ main(int argc, char *argv[]) | |||||
usleep(1000); | usleep(1000); | ||||
/* style */ | /* 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); | setfont(FONT); | ||||
wa.override_redirect = 1; | wa.override_redirect = 1; | ||||
@@ -326,7 +327,7 @@ main(int argc, char *argv[]) | |||||
mx = my = 0; | mx = my = 0; | ||||
mw = DisplayWidth(dpy, screen); | mw = DisplayWidth(dpy, screen); | ||||
mh = dc.font.height + 4; | |||||
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, | ||||