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