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:
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);
}