wmii

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

commit eb050a2f342de2938d9413fa2ec2f38eb8fce542
parent ad9d50b3a8f90b4fae34ca8a4f40667b0c7b7d9f
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Wed, 28 Jun 2006 08:30:49 +0200

removed charof from blitz interface, added notification functions for bpress, brelease and bmotion instead which return True on expose


Diffstat:
cmd/wm/column.c | 6+++---
cmd/wm/event.c | 35++++++++---------------------------
cmd/wm/frame.c | 14+++++++++++---
cmd/wm/geom.c | 7-------
cmd/wm/wm.h | 2+-
liblitz/blitz.h | 7++++++-
liblitz/input.c | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
7 files changed, 91 insertions(+), 44 deletions(-)

diff --git a/cmd/wm/column.c b/cmd/wm/column.c @@ -332,10 +332,10 @@ frame_of_point(XPoint *pt) if(!v) return nil; - for(a=v->area->next; a && !ispointinrect(pt->x, pt->y, &a->rect); + for(a=v->area->next; a && !blitz_ispointinrect(pt->x, pt->y, &a->rect); a=a->next); if(a) - for(f=a->frame; f && !ispointinrect(pt->x, pt->y, &f->rect); + for(f=a->frame; f && !blitz_ispointinrect(pt->x, pt->y, &f->rect); f=f->anext); return f; } @@ -350,7 +350,7 @@ drop_move(Frame *f, XRectangle *new, XPoint *pt) if(!pt) return; - for(tgt=v->area->next; tgt && !ispointinrect(pt->x, pt->y, &tgt->rect); + for(tgt=v->area->next; tgt && !blitz_ispointinrect(pt->x, pt->y, &tgt->rect); tgt=tgt->next); if(tgt) { if(pt->x < 16) { diff --git a/cmd/wm/event.c b/cmd/wm/event.c @@ -61,8 +61,6 @@ flush_masked_events(long even_mask) return n; } -static Bool drag = False; - static void handle_buttonrelease(XEvent *e) { @@ -71,21 +69,18 @@ handle_buttonrelease(XEvent *e) XButtonPressedEvent *ev = &e->xbutton; if(ev->window == barwin) { for(b=lbar; b; b=b->next) - if(ispointinrect(ev->x, ev->y, &b->brush.rect)) + if(blitz_ispointinrect(ev->x, ev->y, &b->brush.rect)) return write_event("LeftBarClick %d %s\n", ev->button, b->name); for(b=rbar; b; b=b->next) - if(ispointinrect(ev->x, ev->y, &b->brush.rect)) + if(blitz_ispointinrect(ev->x, ev->y, &b->brush.rect)) return write_event("RightBarClick %d %s\n", ev->button, b->name); } else if((f = frame_of_win(ev->window))) { - if(ispointinrect(ev->x, ev->y, &f->tagbar.rect)) { - f->tagbar.curend = blitz_charof(&f->tagbar, ev->x, ev->y); - draw_frame(f); - } + if(blitz_brelease_input(&f->tagbar, ev->x, ev->y)) + map_frame(f, &f->tagbar.rect); write_event("ClientClick %d %d\n", idx_of_client(f->client), ev->button); - drag = False; } } @@ -95,19 +90,9 @@ handle_motionnotify(XEvent *e) Frame *f; XMotionEvent *ev = &e->xmotion; - if(!drag) - return; - if((f = frame_of_win(ev->window))) { - if(ispointinrect(ev->x, ev->y, &f->tagbar.rect)) { - f->tagbar.curend = blitz_charof(&f->tagbar, ev->x, ev->y); - if(f->tagbar.curend < f->tagbar.curstart) { - char *tmp = f->tagbar.curend; - f->tagbar.curend = f->tagbar.curstart; - f->tagbar.curstart = tmp; - } - draw_frame(f); - } + if(blitz_bmotion_input(&f->tagbar, ev->x, ev->y)) + map_frame(f, &f->tagbar.rect); } } @@ -119,12 +104,8 @@ handle_buttonpress(XEvent *e) if((f = frame_of_win(ev->window))) { ev->state &= valid_mask; - if(ispointinrect(ev->x, ev->y, &f->tagbar.rect)) { - f->tagbar.curstart = f->tagbar.curend - = blitz_charof(&f->tagbar, ev->x, ev->y); - draw_frame(f); - drag = True; - } + if(blitz_bpress_input(&f->tagbar, ev->x, ev->y)) + map_frame(f, &f->tagbar.rect); if((ev->state & def.mod) == def.mod) { focus(f->client, True); switch(ev->button) { diff --git a/cmd/wm/frame.c b/cmd/wm/frame.c @@ -87,10 +87,19 @@ update_frame_widget_colors(Frame *f) } void +map_frame(Frame *f, XRectangle *r) +{ + XCopyArea(blz.display, pmap, f->client->framewin, f->client->gc, + r->x, r->y, r->width, r->height, r->x, r->y); + XSync(blz.display, False); +} + +void draw_frame(Frame *f) { Frame *p; unsigned int fidx, size, w; + XRectangle r = f->rect; for(fidx=0, p=f->area->frame; p && p != f; p=p->anext, fidx++); for(size=fidx; p; p=p->anext, size++); @@ -130,9 +139,8 @@ draw_frame(Frame *f) blitz_draw_input(&f->tagbar); blitz_draw_label(&f->titlebar, f->client->name); blitz_draw_label(&f->posbar, buffer); - XCopyArea(blz.display, pmap, f->client->framewin, f->tagbar.gc, - 0, 0, f->rect.width, f->rect.height, 0, 0); - XSync(blz.display, False); + r.x = r.y = 0; + map_frame(f, &r); } void diff --git a/cmd/wm/geom.c b/cmd/wm/geom.c @@ -26,13 +26,6 @@ quadofcoord(XRectangle *rect, int x, int y) return ret; } -Bool -ispointinrect(int x, int y, XRectangle * r) -{ - return (x >= r->x) && (x <= r->x + r->width) - && (y >= r->y) && (y <= r->y + r->height); -} - /* Syntax: <x> <y> <width> <height> */ int strtorect(XRectangle *r, const char *val) diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -265,6 +265,7 @@ void insert_frame(Frame *pos, Frame *f, Bool before); void draw_frame(Frame *f); void draw_frames(); void update_frame_widget_colors(Frame *f); +void map_frame(Frame *f, XRectangle *r); /* fs.c */ void fs_attach(P9Req *r); @@ -282,7 +283,6 @@ void write_event(char *format, ...); /* geom.c */ BlitzAlign quadofcoord(XRectangle *rect, int x, int y); -Bool ispointinrect(int x, int y, XRectangle * r); int strtorect(XRectangle *r, const char *val); /* key.c */ diff --git a/liblitz/blitz.h b/liblitz/blitz.h @@ -68,6 +68,7 @@ struct BlitzInput { char *text; char *curstart; char *curend; + Bool drag; unsigned int size; Drawable drawable; GC gc; @@ -93,4 +94,8 @@ void blitz_loadfont(Blitz *blitz, BlitzFont *font); /* input.c */ void blitz_draw_input(BlitzInput *i); -char *blitz_charof(BlitzInput *i, int x, int y); +/* blitz_b* functions return True on expose */ +Bool blitz_bpress_input(BlitzInput *i, int x, int y); +Bool blitz_brelease_input(BlitzInput *i, int x, int y); +Bool blitz_bmotion_input(BlitzInput *i, int x, int y); +Bool blitz_ispointinrect(int x, int y, XRectangle * r); diff --git a/liblitz/input.c b/liblitz/input.c @@ -84,8 +84,8 @@ blitz_draw_input(BlitzInput *i) xdrawtextpart(i, i->curend, nil, &xoff, yoff, boxw); } -char * -blitz_charof(BlitzInput *i, int x, int y) +static char * +charof(BlitzInput *i, int x, int y) { int xoff, yoff; unsigned int boxw, boxh, nbox, cbox, l; @@ -104,3 +104,63 @@ blitz_charof(BlitzInput *i, int x, int y) else return i->text + l; } + +Bool +blitz_ispointinrect(int x, int y, XRectangle * r) +{ + return (x >= r->x) && (x <= r->x + r->width) + && (y >= r->y) && (y <= r->y + r->height); +} + +Bool +blitz_bpress_input(BlitzInput *i, int x, int y) +{ + char *ostart, *oend; + + if(!blitz_ispointinrect(x, y, &i->rect)) + return False; + ostart = i->curstart; + oend = i->curend; + i->curstart = i->curend = charof(i, x, y); + i->drag = True; + if((i->curstart == ostart) && (i->curend == oend)) + return False; + blitz_draw_input(i); + return True; +} + +Bool +blitz_brelease_input(BlitzInput *i, int x, int y) +{ + char *oend; + + if(!blitz_ispointinrect(x, y, &i->rect)) + return False; + oend = i->curend; + i->curend = charof(i, x, y); + i->drag = False; + if(i->curend == oend) + return False; + blitz_draw_input(i); + return True; +} + +Bool +blitz_bmotion_input(BlitzInput *i, int x, int y) +{ + char *oend; + + if(!i->drag || !blitz_ispointinrect(x, y, &i->rect)) + return False; + + oend = i->curend; + i->curend = charof(i, x, y); + if(i->curend == oend) + return False; + if(i->curstart > i->curend) { + char *tmp = i->curend; + i->curend = i->curstart; + i->curstart = tmp; + } + return True; +}