+resizemouse(Client *c) {
+ int ocx, ocy;
+ int nw, nh;
+ XEvent ev;
+
+ ocx = c->x;
+ ocy = c->y;
+ if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
+ None, cursor[CurResize], CurrentTime) != GrabSuccess)
+ return;
+ c->ismax = False;
+ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1);
+ for(;;) {
+ XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask , &ev);
+ switch(ev.type) {
+ case ButtonRelease:
+ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0,
+ c->w + c->border - 1, c->h + c->border - 1);
+ XUngrabPointer(dpy, CurrentTime);
+ while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
+ return;
+ case ConfigureRequest:
+ case Expose:
+ case MapRequest:
+ handler[ev.type](&ev);
+ break;
+ case MotionNotify:
+ XSync(dpy, False);
+ if((nw = ev.xmotion.x - ocx - 2 * c->border + 1) <= 0)
+ nw = 1;
+ if((nh = ev.xmotion.y - ocy - 2 * c->border + 1) <= 0)
+ nh = 1;
+ resize(c, c->x, c->y, nw, nh, True);
+ break;
+ }
+ }
+}
+
+static void
+buttonpress(XEvent *e) {
+ int x;
+ Arg a;
+ Client *c;
+ XButtonPressedEvent *ev = &e->xbutton;
+
+ if(barwin == ev->window) {
+ x = 0;
+ for(a.i = 0; a.i < ntags; a.i++) {
+ x += textw(tags[a.i]);
+ if(ev->x < x) {
+ if(ev->button == Button1) {
+ if(ev->state & MODKEY)
+ tag(&a);
+ else
+ view(&a);
+ }
+ else if(ev->button == Button3) {
+ if(ev->state & MODKEY)
+ toggletag(&a);
+ else
+ toggleview(&a);
+ }
+ return;
+ }
+ }
+ if(ev->x < x + bmw)
+ switch(ev->button) {
+ case Button1:
+ togglemode(NULL);
+ break;
+ case Button4:
+ a.i = 1;
+ incnmaster(&a);
+ break;
+ case Button5:
+ a.i = -1;
+ incnmaster(&a);
+ break;
+ }
+ }
+ else if((c = getclient(ev->window))) {
+ focus(c);
+ if(CLEANMASK(ev->state) != MODKEY)
+ return;
+ if(ev->button == Button1 && (arrange == dofloat || c->isfloat)) {
+ restack();
+ movemouse(c);
+ }
+ else if(ev->button == Button2)
+ zoom(NULL);
+ else if(ev->button == Button3
+ && (arrange == dofloat || c->isfloat) && !c->isfixed)
+ {
+ restack();
+ resizemouse(c);
+ }
+ }
+}
+
+static void
+configurerequest(XEvent *e) {
+ Client *c;