@@ -6,3 +6,4 @@ | |||||
#define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*" | #define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*" | ||||
#define BGCOLOR "#eeeeee" | #define BGCOLOR "#eeeeee" | ||||
#define FGCOLOR "#666699" | #define FGCOLOR "#666699" | ||||
#define BORDERCOLOR "#9999CC" |
@@ -6,3 +6,4 @@ | |||||
#define FONT "fixed" | #define FONT "fixed" | ||||
#define BGCOLOR "#666699" | #define BGCOLOR "#666699" | ||||
#define FGCOLOR "#eeeeee" | #define FGCOLOR "#eeeeee" | ||||
#define BORDERCOLOR "#9999CC" |
@@ -24,6 +24,7 @@ struct DC { /* draw context */ | |||||
int x, y, w, h; | int x, y, w, h; | ||||
unsigned long bg; | unsigned long bg; | ||||
unsigned long fg; | unsigned long fg; | ||||
unsigned long border; | |||||
Drawable drawable; | Drawable drawable; | ||||
Fnt font; | Fnt font; | ||||
GC gc; | GC gc; | ||||
@@ -34,7 +35,7 @@ extern Display *dpy; | |||||
extern DC dc; | extern DC dc; | ||||
/* draw.c */ | /* draw.c */ | ||||
extern void drawtext(const char *text, Bool sel); | |||||
extern void drawtext(const char *text, Bool invert, Bool border); | |||||
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); | ||||
@@ -9,6 +9,26 @@ | |||||
/* static */ | /* static */ | ||||
static void | |||||
drawborder(void) | |||||
{ | |||||
XPoint points[5]; | |||||
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); | |||||
} | |||||
static unsigned int | static unsigned int | ||||
textnw(const char *text, unsigned int len) | textnw(const char *text, unsigned int len) | ||||
{ | { | ||||
@@ -24,18 +44,21 @@ textnw(const char *text, unsigned int len) | |||||
/* extern */ | /* extern */ | ||||
void | void | ||||
drawtext(const char *text, Bool sel) | |||||
drawtext(const char *text, Bool invert, Bool border) | |||||
{ | { | ||||
int x, y, w, h; | int x, y, w, h; | ||||
static char buf[256]; | static char buf[256]; | ||||
unsigned int len; | unsigned int len; | ||||
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, sel ? dc.fg : dc.bg); | |||||
XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); | |||||
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); | XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); | ||||
w = 0; | w = 0; | ||||
if(border) | |||||
drawborder(); | |||||
if(!text) | if(!text) | ||||
return; | return; | ||||
@@ -56,8 +79,8 @@ drawtext(const char *text, Bool sel) | |||||
if(w > dc.w) | if(w > dc.w) | ||||
return; /* too long */ | return; /* too long */ | ||||
gcv.foreground = sel ? dc.bg : dc.fg; | |||||
gcv.background = sel ? dc.fg : dc.bg; | |||||
gcv.foreground = invert ? dc.bg : dc.fg; | |||||
gcv.background = invert ? dc.fg : dc.bg; | |||||
if(dc.font.set) { | if(dc.font.set) { | ||||
XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); | XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); | ||||
XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, | XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, | ||||
@@ -68,21 +91,6 @@ drawtext(const char *text, Bool sel) | |||||
XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); | XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); | ||||
XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); | XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); | ||||
} | } | ||||
if(sel) { | |||||
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); | |||||
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); | |||||
} | |||||
} | } | ||||
unsigned long | unsigned long | ||||
@@ -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); | |||||
drawtext(NULL, False, False); | |||||
/* print command */ | /* print command */ | ||||
if(cmdw && item) | if(cmdw && item) | ||||
dc.w = cmdw; | dc.w = cmdw; | ||||
drawtext(text[0] ? text : NULL, False); | |||||
drawtext(text[0] ? text : NULL, False, False); | |||||
dc.x += cmdw; | dc.x += cmdw; | ||||
if(curr) { | if(curr) { | ||||
dc.w = SPACE; | dc.w = SPACE; | ||||
drawtext((curr && curr->left) ? "<" : NULL, False); | |||||
drawtext((curr && curr->left) ? "<" : NULL, False, False); | |||||
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); | |||||
drawtext(i->text, sel == i, sel == i); | |||||
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); | |||||
drawtext(next ? ">" : NULL, False, False); | |||||
} | } | ||||
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); | ||||
@@ -316,6 +316,7 @@ main(int argc, char *argv[]) | |||||
/* style */ | /* style */ | ||||
dc.bg = getcolor(BGCOLOR); | dc.bg = getcolor(BGCOLOR); | ||||
dc.fg = getcolor(FGCOLOR); | dc.fg = getcolor(FGCOLOR); | ||||
dc.border = getcolor(BORDERCOLOR); | |||||
setfont(FONT); | setfont(FONT); | ||||
wa.override_redirect = 1; | wa.override_redirect = 1; | ||||