@@ -21,9 +21,8 @@ | |||||
/* forward declarations */ | /* forward declarations */ | ||||
static void cleanup(void); | static void cleanup(void); | ||||
static void drawcursor(void); | |||||
static void drawinput(void); | static void drawinput(void); | ||||
static Bool grabkeyboard(void); | |||||
static void grabkeyboard(void); | |||||
static void kpress(XKeyEvent *e); | static void kpress(XKeyEvent *e); | ||||
static void run(void); | static void run(void); | ||||
static void setup(void); | static void setup(void); | ||||
@@ -35,7 +34,7 @@ static char *prompt = NULL; | |||||
static char text[4096]; | static char text[4096]; | ||||
static int promptw = 0; | static int promptw = 0; | ||||
static int screen; | static int screen; | ||||
static unsigned int cursor = 0; | |||||
static size_t cursor = 0; | |||||
static unsigned int numlockmask = 0; | static unsigned int numlockmask = 0; | ||||
static unsigned int mw, mh; | static unsigned int mw, mh; | ||||
static unsigned long normcol[ColLast]; | static unsigned long normcol[ColLast]; | ||||
@@ -53,16 +52,6 @@ cleanup(void) { | |||||
XCloseDisplay(dpy); | XCloseDisplay(dpy); | ||||
} | } | ||||
void | |||||
drawcursor(void) { | |||||
XRectangle r = { dc.x, dc.y + 2, 1, dc.font.height - 2 }; | |||||
r.x += textnw(&dc, text, cursor) + dc.font.height / 2; | |||||
XSetForeground(dpy, dc.gc, normcol[ColFG]); | |||||
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); | |||||
} | |||||
void | void | ||||
drawinput(void) | drawinput(void) | ||||
{ | { | ||||
@@ -70,30 +59,30 @@ drawinput(void) | |||||
dc.y = 0; | dc.y = 0; | ||||
dc.w = mw; | dc.w = mw; | ||||
dc.h = mh; | dc.h = mh; | ||||
drawtext(&dc, NULL, normcol, False); | |||||
drawtext(&dc, NULL, normcol); | |||||
/* print prompt? */ | /* print prompt? */ | ||||
if(prompt) { | if(prompt) { | ||||
dc.w = promptw; | dc.w = promptw; | ||||
drawtext(&dc, prompt, selcol, False); | |||||
drawtext(&dc, prompt, selcol); | |||||
dc.x += dc.w; | dc.x += dc.w; | ||||
} | } | ||||
dc.w = mw - dc.x; | dc.w = mw - dc.x; | ||||
drawtext(&dc, *text ? text : NULL, normcol, False); | |||||
drawcursor(); | |||||
XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); | |||||
drawtext(&dc, text, normcol); | |||||
drawcursor(&dc, text, cursor, normcol); | |||||
commitdraw(&dc, win); | |||||
} | } | ||||
Bool | |||||
void | |||||
grabkeyboard(void) { | grabkeyboard(void) { | ||||
unsigned int len; | unsigned int len; | ||||
for(len = 1000; len; len--) { | for(len = 1000; len; len--) { | ||||
if(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime) | if(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime) | ||||
== GrabSuccess) | == GrabSuccess) | ||||
break; | |||||
return; | |||||
usleep(1000); | usleep(1000); | ||||
} | } | ||||
return len > 0; | |||||
exit(EXIT_FAILURE); | |||||
} | } | ||||
void | void | ||||
@@ -162,25 +162,25 @@ drawmenu(void) { | |||||
dc.y = 0; | dc.y = 0; | ||||
dc.w = mw; | dc.w = mw; | ||||
dc.h = mh; | dc.h = mh; | ||||
drawtext(&dc, NULL, normcol, False); | |||||
drawtext(&dc, NULL, normcol); | |||||
dc.h = dc.font.height + 2; | dc.h = dc.font.height + 2; | ||||
dc.y = topbar ? 0 : mh - dc.h; | dc.y = topbar ? 0 : mh - dc.h; | ||||
/* print prompt? */ | /* print prompt? */ | ||||
if(prompt) { | if(prompt) { | ||||
dc.w = promptw; | dc.w = promptw; | ||||
drawtext(&dc, prompt, selcol, False); | |||||
drawtext(&dc, prompt, selcol); | |||||
dc.x += dc.w; | dc.x += dc.w; | ||||
} | } | ||||
dc.w = mw - dc.x; | dc.w = mw - dc.x; | ||||
/* print command */ | /* print command */ | ||||
if(cmdw && item && lines == 0) | if(cmdw && item && lines == 0) | ||||
dc.w = cmdw; | dc.w = cmdw; | ||||
drawtext(&dc, *text ? text : NULL, normcol, False); | |||||
drawtext(&dc, text, normcol); | |||||
if(lines > 0) | if(lines > 0) | ||||
drawmenuv(); | drawmenuv(); | ||||
else if(curr) | else if(curr) | ||||
drawmenuh(); | drawmenuh(); | ||||
XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); | |||||
commitdraw(&dc, win); | |||||
} | } | ||||
void | void | ||||
@@ -189,16 +189,16 @@ drawmenuh(void) { | |||||
dc.x += cmdw; | dc.x += cmdw; | ||||
dc.w = spaceitem; | dc.w = spaceitem; | ||||
drawtext(&dc, curr->left ? "<" : NULL, normcol, False); | |||||
drawtext(&dc, curr->left ? "<" : NULL, normcol); | |||||
dc.x += dc.w; | dc.x += dc.w; | ||||
for(i = curr; i != next; i = i->right) { | for(i = curr; i != next; i = i->right) { | ||||
dc.w = MIN(textw(&dc, i->text), mw / 3); | dc.w = MIN(textw(&dc, i->text), mw / 3); | ||||
drawtext(&dc, i->text, (sel == i) ? selcol : normcol, False); | |||||
drawtext(&dc, i->text, (sel == i) ? selcol : normcol); | |||||
dc.x += dc.w; | dc.x += dc.w; | ||||
} | } | ||||
dc.w = spaceitem; | dc.w = spaceitem; | ||||
dc.x = mw - dc.w; | dc.x = mw - dc.w; | ||||
drawtext(&dc, next ? ">" : NULL, normcol, False); | |||||
drawtext(&dc, next ? ">" : NULL, normcol); | |||||
} | } | ||||
void | void | ||||
@@ -209,7 +209,7 @@ drawmenuv(void) { | |||||
dc.y = topbar ? dc.h : 0; | dc.y = topbar ? dc.h : 0; | ||||
dc.w = mw - dc.x; | dc.w = mw - dc.x; | ||||
for(i = curr; i != next; i = i->right) { | for(i = curr; i != next; i = i->right) { | ||||
drawtext(&dc, i->text, (sel == i) ? selcol : normcol, False); | |||||
drawtext(&dc, i->text, (sel == i) ? selcol : normcol); | |||||
dc.y += dc.h; | dc.y += dc.h; | ||||
} | } | ||||
if(!XGetWindowAttributes(dpy, win, &wa)) | if(!XGetWindowAttributes(dpy, win, &wa)) | ||||
@@ -224,11 +224,10 @@ grabkeyboard(void) { | |||||
for(len = 1000; len; len--) { | for(len = 1000; len; len--) { | ||||
if(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime) | if(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime) | ||||
== GrabSuccess) | == GrabSuccess) | ||||
break; | |||||
return; | |||||
usleep(1000); | usleep(1000); | ||||
} | } | ||||
if(!len) | |||||
exit(EXIT_FAILURE); | |||||
exit(EXIT_FAILURE); | |||||
} | } | ||||
void | void | ||||