Border resizing by dragging.

Thanks to Axel Belinfante.
This commit is contained in:
rsc 2004-03-29 12:00:15 +00:00
parent d99b2f34e6
commit 1cb3fa8093
10 changed files with 268 additions and 45 deletions

View file

@ -223,7 +223,7 @@ selectwin(int release, int *shift, ScreenInfo *s)
}
void
sweepcalc(Client *c, int x, int y)
sweepcalc(Client *c, int x, int y, BorderLocation bl)
{
int dx, dy, sx, sy;
@ -267,12 +267,55 @@ sweepcalc(Client *c, int x, int y)
}
void
dragcalc(Client *c, int x, int y)
dragcalc(Client *c, int x, int y, BorderLocation bl)
{
c->x += x;
c->y += y;
}
void
pullcalc(Client *c, int x, int y, BorderLocation bl)
{
switch(bl) {
case BorderN:
c->y += y;
c->dy -= y;
break;
case BorderS:
c->dy += y;
break;
case BorderE:
c->dx += x;
break;
case BorderW:
c->x += x;
c->dx -= x;
break;
case BorderNW:
c->x += x;
c->dx -= x;
c->y += y;
c->dy -= y;
break;
case BorderNE:
c->dx += x;
c->y += y;
c->dy -= y;
break;
case BorderSE:
c->dx += x;
c->dy += y;
break;
case BorderSW:
c->x += x;
c->dx -= x;
c->dy += y;
break;
default:
break;
}
}
static void
xcopy(int fwd, Display *dpy, Drawable src, Drawable dst, GC gc, int x, int y, int dx, int dy, int x1, int y1)
{
@ -350,7 +393,7 @@ misleep(int msec)
}
int
sweepdrag(Client *c, XButtonEvent *e0, void (*recalc)(Client*, int, int))
sweepdrag(Client *c, int but, XButtonEvent *e0, BorderLocation bl, void (*recalc)(Client*, int, int, BorderLocation))
{
XEvent ev;
int idle;
@ -366,7 +409,9 @@ sweepdrag(Client *c, XButtonEvent *e0, void (*recalc)(Client*, int, int))
c->y -= BORDER;
c->dx += 2*BORDER;
c->dy += 2*BORDER;
if (e0)
if (bl)
getmouse(&cx, &cy, c->screen);
else if (e0)
getmouse(&c->x, &c->y, c->screen);
else
getmouse(&cx, &cy, c->screen);
@ -386,9 +431,9 @@ sweepdrag(Client *c, XButtonEvent *e0, void (*recalc)(Client*, int, int))
idle = 0;
}
if(e0)
recalc(c, rx, ry);
recalc(c, rx, ry, bl);
else
recalc(c, rx-cx, ry-cy);
recalc(c, rx-cx, ry-cy, bl);
cx = rx;
cy = ry;
drawbound(c, 1);
@ -404,7 +449,7 @@ sweepdrag(Client *c, XButtonEvent *e0, void (*recalc)(Client*, int, int))
drawbound(c, 0);
ungrab(e);
XUngrabServer(dpy);
if (e->button != Button3 && c->init)
if (e->button != but && c->init)
goto bad;
if (c->dx < 0) {
c->x += c->dx;
@ -424,6 +469,7 @@ sweepdrag(Client *c, XButtonEvent *e0, void (*recalc)(Client*, int, int))
}
}
bad:
if (debug) fprintf(stderr, "sweepdrag bad\n");
c->x = ox;
c->y = oy;
c->dx = odx;
@ -433,7 +479,7 @@ bad:
}
int
sweep(Client *c)
sweep(Client *c, int but, XButtonEvent *ignored)
{
XEvent ev;
int status;
@ -449,16 +495,34 @@ sweep(Client *c)
XMaskEvent(dpy, ButtonMask, &ev);
e = &ev.xbutton;
if (e->button != Button3) {
if (e->button != but) {
ungrab(e);
return 0;
}
XChangeActivePointerGrab(dpy, ButtonMask, s->boxcurs, e->time);
return sweepdrag(c, e, sweepcalc);
return sweepdrag(c, but, e, 0, sweepcalc);
}
int
drag(Client *c)
pull(Client *c, int but, XButtonEvent *e)
{
int status;
ScreenInfo *s;
BorderLocation bl;
bl = borderlocation(c, e->x, e->y);
s = c->screen;
status = grab(s->root, s->root, ButtonMask, s->bordcurs[bl], 0);
if (status != GrabSuccess) {
graberror("pull", status); /* */
return 0;
}
return sweepdrag(c, but, 0, bl, pullcalc);
}
int
drag(Client *c, int but)
{
int status;
ScreenInfo *s;
@ -469,7 +533,7 @@ drag(Client *c)
graberror("drag", status); /* */
return 0;
}
return sweepdrag(c, 0, dragcalc);
return sweepdrag(c, but, 0, 0, dragcalc);
}
void