wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 3d6a47bba9d8ab346b683ac9db0aab24cdb84104
parent 9e7804fda21530b8350d48a3d3816be28a95a0c1
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Thu,  6 Jul 2006 14:11:09 +0200

now using pointer grabs in bpress handling of input widgets


Diffstat:
cmd/wm/event.c | 19++++++-------------
cmd/wm/frame.c | 3+++
cmd/wm/wm.c | 1+
cmd/wm/wm.h | 1+
liblitz/blitz.h | 11+++++++----
liblitz/input.c | 93++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
6 files changed, 82 insertions(+), 46 deletions(-)

diff --git a/cmd/wm/event.c b/cmd/wm/event.c @@ -78,8 +78,7 @@ handle_buttonrelease(XEvent *e) ev->button, b->name); } else if((f = frame_of_win(ev->window))) { - if(blitz_brelease_input(&f->tagbar, ev->button, ev->x, ev->y, ev->time)) - draw_frame(f); + blitz_brelease_input(&f->tagbar, ev->button, ev->x, ev->y, ev->time); write_event("ClientClick %d %d\n", idx_of_client(f->client), ev->button); } } @@ -89,10 +88,8 @@ handle_motionnotify(XEvent *e) { Frame *f; XMotionEvent *ev = &e->xmotion; - if((f = frame_of_win(ev->window))) { - if(blitz_bmotion_input(&f->tagbar, ev->x, ev->y)) - draw_frame(f); - } + if((f = frame_of_win(ev->window))) + blitz_bmotion_input(&f->tagbar, ev->x, ev->y); } static void @@ -103,10 +100,8 @@ handle_buttonpress(XEvent *e) if((f = frame_of_win(ev->window))) { ev->state &= valid_mask; - if(blitz_bpress_input(&f->tagbar, ev->button, ev->x, ev->y)) { - draw_frame(f); - } - else if((ev->state & def.mod) == def.mod) { + blitz_bpress_input(&f->tagbar, ev->button, ev->x, ev->y); + if((ev->state & def.mod) == def.mod) { focus(f->client, True); switch(ev->button) { case Button1: @@ -275,9 +270,7 @@ handle_keypress(XEvent *e) || IsPFKey(k) || IsPrivateKeypadKey(k)) return; buf[n] = 0; - - if(blitz_kpress_input(&f->tagbar, ev->state, k, buf)) - draw_frame(f); + blitz_kpress_input(&f->tagbar, ev->state, k, buf); } else handle_key(blz.root, ev->state, (KeyCode) ev->keycode); diff --git a/cmd/wm/frame.c b/cmd/wm/frame.c @@ -44,10 +44,13 @@ create_frame(Client *c, View *v) f->tagbar.win = c->framewin; f->tagbar.gc = c->gc; f->tagbar.font = &def.font; + f->tagbar.cursor = cursor[CurInput]; f->tagbar.color = def.normcolor; f->tagbar.bcolor[0] = def.bcolor[0]; f->tagbar.bcolor[1] = def.bcolor[1]; f->tagbar.bcolor[2] = def.bcolor[2]; + f->tagbar.aux = f; + f->tagbar.draw = (void (*)(void *))draw_frame; blitz_setinput(&f->tagbar, c->tags); return f; diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c @@ -147,6 +147,7 @@ init_cursors() cursor[CurNormal] = XCreateFontCursor(blz.dpy, XC_left_ptr); cursor[CurResize] = XCreateFontCursor(blz.dpy, XC_sizing); cursor[CurMove] = XCreateFontCursor(blz.dpy, XC_fleur); + cursor[CurInput] = XCreateFontCursor(blz.dpy, XC_xterm); } static void diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -38,6 +38,7 @@ enum { CurNormal, CurResize, CurMove, + CurInput, CurLast }; diff --git a/liblitz/blitz.h b/liblitz/blitz.h @@ -69,6 +69,7 @@ struct BlitzInput { char *text; char *curstart; char *curend; + Cursor cursor; unsigned int size; unsigned int len; unsigned long tdbclk; @@ -82,6 +83,8 @@ struct BlitzInput { BlitzColor bcolor[3]; BlitzFont *font; XRectangle rect; /* relative rect */ + void *aux; + void (*draw)(void *aux); }; /* brush.c */ @@ -105,9 +108,9 @@ void blitz_loadfont(Blitz *blitz, BlitzFont *font); /* input.c */ void blitz_draw_input(BlitzInput *i); /* blitz_b* functions return True on expose */ -Bool blitz_bpress_input(BlitzInput *i, int button, int x, int y); -Bool blitz_brelease_input(BlitzInput *i, int button, int x, int y, unsigned long time); -Bool blitz_bmotion_input(BlitzInput *i, int x, int y); +void blitz_bpress_input(BlitzInput *i, int button, int x, int y); +void blitz_brelease_input(BlitzInput *i, int button, int x, int y, unsigned long time); +void blitz_bmotion_input(BlitzInput *i, int x, int y); Bool blitz_ispointinrect(int x, int y, XRectangle * r); void blitz_setinput(BlitzInput *i, char *text); -Bool blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks); +void blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks); diff --git a/liblitz/input.c b/liblitz/input.c @@ -161,13 +161,21 @@ charof(BlitzInput *i, int x, int y) return xcharof(i, x, i->text, i->len); } -Bool +void +xdraw(BlitzInput *i) +{ + if(i->aux && i->draw) + i->draw(i->aux); +} + +void blitz_bpress_input(BlitzInput *i, int button, int x, int y) { + XEvent ev; char *ostart, *oend; if(!(i->drag = blitz_ispointinrect(x, y, &i->rect))) - return False; + return; XSetInputFocus(i->blitz->dpy, i->win, RevertToPointerRoot, CurrentTime); ostart = i->curstart; @@ -175,7 +183,32 @@ blitz_bpress_input(BlitzInput *i, int button, int x, int y) i->curstart = i->curend = charof(i, x, y); if((i->button = button - Button1) > 2) i->button = 0; - return (i->curstart == ostart) && (i->curend == oend); + + if((i->curstart != ostart) || (i->curend != oend)) + xdraw(i); + + if(XGrabPointer(i->blitz->dpy, i->win, False, + ButtonPressMask | ButtonReleaseMask | PointerMotionMask, + GrabModeAsync, GrabModeAsync, None, + i->cursor, CurrentTime) != GrabSuccess) + return; + + for(;;) { + XMaskEvent(i->blitz->dpy, + ButtonPressMask | ButtonReleaseMask | PointerMotionMask, &ev); + switch (ev.type) { + default: break; + case ButtonRelease: + XUngrabPointer(i->blitz->dpy, CurrentTime); + blitz_brelease_input(i, ev.xbutton.button, + ev.xbutton.x, ev.xbutton.y, ev.xbutton.time); + return; + break; + case MotionNotify: + blitz_bmotion_input(i, ev.xbutton.x, ev.xbutton.y); + break; + } + } } static void @@ -213,13 +246,13 @@ mark(BlitzInput *i, int x, int y) i->curend = end; } -Bool +void blitz_brelease_input(BlitzInput *i, int button, int x, int y, unsigned long time) { char *oend; - if(!(i->drag = blitz_ispointinrect(x, y, &i->rect))) - return False; + if(!blitz_ispointinrect(x, y, &i->rect)) + goto Drop; XSetInputFocus(i->blitz->dpy, i->win, RevertToPointerRoot, CurrentTime); oend = i->curend; @@ -231,24 +264,24 @@ blitz_brelease_input(BlitzInput *i, int button, int x, int y, unsigned long time && (x == i->xdbclk && y == i->ydbclk)) { mark(i, x, y); - i->drag = False; i->tdbclk = 0; i->xdbclk = i->ydbclk = 0; - return True; + goto Drop; } i->curend = charof(i, x, y); - if(i->button) - i->curstart = i->curend; i->tdbclk = time; i->xdbclk = x; i->ydbclk = y; - i->drag = False; - return i->curend == oend; +Drop: + if(i->button) + i->curstart = i->curend; + i->drag = False; + xdraw(i); } -Bool +void blitz_bmotion_input(BlitzInput *i, int x, int y) { char *oend; @@ -260,16 +293,18 @@ blitz_bmotion_input(BlitzInput *i, int x, int y) XSetInputFocus(i->blitz->dpy, i->win, RevertToPointerRoot, CurrentTime); else - return False; + return; if(!i->drag) - return False; + return; oend = i->curend; i->curend = charof(i, x, y); - return i->curend == oend; + + if(i->curend != oend) + xdraw(i); } -Bool +void blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks) { char *start, *end; @@ -280,6 +315,8 @@ blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks) end = curend(i); if(mod & ControlMask) { switch (k) { + default: /* ignore other control sequences */ + return; case XK_A: case XK_a: k = XK_Begin; @@ -304,8 +341,6 @@ blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks) while(start > i->text && (*(start - 1) != ' ')) --start; break; - default: /* ignore other control sequences */ - return False; } } @@ -313,10 +348,10 @@ blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks) switch(k) { case XK_Begin: i->curstart = i->curend = i->text; - return True; + goto Draw; case XK_End: i->curstart = i->curend = i->text + i->len; - return True; + goto Draw; case XK_Left: if(start != end) i->curstart = i->curend = start; @@ -324,7 +359,7 @@ blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks) i->curstart = i->curend = --start; else i->curstart = i->curend = i->text; - return True; + goto Draw; case XK_Right: if(start != end) i->curstart = i->curend = end; @@ -332,14 +367,14 @@ blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks) i->curstart = i->curend = ++start; else i->curstart = i->curend = i->text + i->len; - return True; + goto Draw; } } else { switch(k) { case XK_BackSpace: if(!start) - return False; + return; else if((start == end) && (start != i->text)) { i->curstart = i->curend = --start; memmove(start, start + 1, strlen(start + 1)); @@ -351,13 +386,13 @@ blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks) i->len -= (end - start); } i->text[i->len] = 0; - return True; + goto Draw; default: if(!(len = strlen(ks))) - return False; + return; if(!start) { blitz_setinput(i, ks); - return True; + goto Draw; } i->len = i->len - (end - start) + len; if(i->len + 1 > i->size) { @@ -372,8 +407,8 @@ blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks) memcpy(start, ks, len); i->curstart = i->curend = start + len; i->text[i->len] = 0; - return True; } } - return False; +Draw: + xdraw(i); }