void dragmfact(const Arg *arg) { unsigned int n; int py, px; // pointer coordinates int ax, ay, aw, ah; // area position, width and height int center = 0, horizontal = 0, mirror = 0, fixed = 0; // layout configuration double fact; Monitor *m; XEvent ev; Time lasttime = 0; m = selmon; #if VANITYGAPS_PATCH int oh, ov, ih, iv; getgaps(m, &oh, &ov, &ih, &iv, &n); #else Client *c; for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); #endif // VANITYGAPS_PATCH ax = m->wx; ay = m->wy; ah = m->wh; aw = m->ww; if (!n) return; #if FLEXTILE_DELUXE_LAYOUT else if (m->lt[m->sellt]->arrange == &flextile) { int layout = m->ltaxis[LAYOUT]; if (layout < 0) { mirror = 1; layout *= -1; } if (layout > FLOATING_MASTER) { layout -= FLOATING_MASTER; fixed = 1; } if (layout == SPLIT_HORIZONTAL || layout == SPLIT_HORIZONTAL_DUAL_STACK) horizontal = 1; else if (layout == SPLIT_CENTERED_VERTICAL && (fixed || n - m->nmaster > 1)) center = 1; else if (layout == FLOATING_MASTER) { center = 1; if (aw < ah) horizontal = 1; } else if (layout == SPLIT_CENTERED_HORIZONTAL) { if (fixed || n - m->nmaster > 1) center = 1; horizontal = 1; } } #endif // FLEXTILE_DELUXE_LAYOUT #if CENTEREDMASTER_LAYOUT else if (m->lt[m->sellt]->arrange == ¢eredmaster && (fixed || n - m->nmaster > 1)) center = 1; #endif // CENTEREDMASTER_LAYOUT #if CENTEREDFLOATINGMASTER_LAYOUT else if (m->lt[m->sellt]->arrange == ¢eredfloatingmaster) center = 1; #endif // CENTEREDFLOATINGMASTER_LAYOUT #if BSTACK_LAYOUT else if (m->lt[m->sellt]->arrange == &bstack) horizontal = 1; #endif // BSTACK_LAYOUT #if BSTACKHORIZ_LAYOUT else if (m->lt[m->sellt]->arrange == &bstackhoriz) horizontal = 1; #endif // BSTACKHORIZ_LAYOUT /* do not allow mfact to be modified under certain conditions */ if (!m->lt[m->sellt]->arrange // floating layout || (!fixed && m->nmaster && n <= m->nmaster) // no master #if MONOCLE_LAYOUT || m->lt[m->sellt]->arrange == &monocle #endif // MONOCLE_LAYOUT #if GRIDMODE_LAYOUT || m->lt[m->sellt]->arrange == &grid #endif // GRIDMODE_LAYOUT #if HORIZGRID_LAYOUT || m->lt[m->sellt]->arrange == &horizgrid #endif // HORIZGRID_LAYOUT #if GAPPLESSGRID_LAYOUT || m->lt[m->sellt]->arrange == &gaplessgrid #endif // GAPPLESSGRID_LAYOUT #if NROWGRID_LAYOUT || m->lt[m->sellt]->arrange == &nrowgrid #endif // NROWGRID_LAYOUT #if FLEXTILE_DELUXE_LAYOUT || (m->lt[m->sellt]->arrange == &flextile && m->ltaxis[LAYOUT] == NO_SPLIT) #endif // FLEXTILE_DELUXE_LAYOUT ) return; #if VANITYGAPS_PATCH ay += oh; ax += ov; aw -= 2*ov; ah -= 2*oh; #endif // VANITYGAPS_PATCH if (center) { if (horizontal) { px = ax + aw / 2; #if VANITYGAPS_PATCH py = ay + ah / 2 + (ah - 2*ih) * (m->mfact / 2.0) + ih / 2; #else py = ay + ah / 2 + ah * m->mfact / 2.0; #endif // VANITYGAPS_PATCH } else { // vertical split #if VANITYGAPS_PATCH px = ax + aw / 2 + (aw - 2*iv) * m->mfact / 2.0 + iv / 2; #else px = ax + aw / 2 + aw * m->mfact / 2.0; #endif // VANITYGAPS_PATCH py = ay + ah / 2; } } else if (horizontal) { px = ax + aw / 2; if (mirror) #if VANITYGAPS_PATCH py = ay + (ah - ih) * (1.0 - m->mfact) + ih / 2; #else py = ay + (ah * (1.0 - m->mfact)); #endif // VANITYGAPS_PATCH else #if VANITYGAPS_PATCH py = ay + ((ah - ih) * m->mfact) + ih / 2; #else py = ay + (ah * m->mfact); #endif // VANITYGAPS_PATCH } else { // vertical split if (mirror) #if VANITYGAPS_PATCH px = ax + (aw - iv) * (1.0 - m->mfact) + iv / 2; #else px = ax + (aw * m->mfact); #endif // VANITYGAPS_PATCH else #if VANITYGAPS_PATCH px = ax + ((aw - iv) * m->mfact) + iv / 2; #else px = ax + (aw * m->mfact); #endif // VANITYGAPS_PATCH py = ay + ah / 2; } if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, None, cursor[horizontal ? CurResizeVertArrow : CurResizeHorzArrow]->cursor, CurrentTime) != GrabSuccess) return; #if WARP_PATCH ignore_warp = 1; #endif // WARP_PATCH XWarpPointer(dpy, None, root, 0, 0, 0, 0, px, py); do { XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); switch(ev.type) { case ConfigureRequest: case Expose: case MapRequest: handler[ev.type](&ev); break; case MotionNotify: if ((ev.xmotion.time - lasttime) <= (1000 / 40)) continue; if (lasttime != 0) { px = ev.xmotion.x; py = ev.xmotion.y; } lasttime = ev.xmotion.time; #if VANITYGAPS_PATCH if (center) if (horizontal) if (py - ay > ah / 2) fact = (double) 1.0 - (ay + ah - py - ih / 2) * 2 / (double) (ah - 2*ih); else fact = (double) 1.0 - (py - ay - ih / 2) * 2 / (double) (ah - 2*ih); else if (px - ax > aw / 2) fact = (double) 1.0 - (ax + aw - px - iv / 2) * 2 / (double) (aw - 2*iv); else fact = (double) 1.0 - (px - ax - iv / 2) * 2 / (double) (aw - 2*iv); else if (horizontal) fact = (double) (py - ay - ih / 2) / (double) (ah - ih); else fact = (double) (px - ax - iv / 2) / (double) (aw - iv); #else if (center) if (horizontal) if (py - ay > ah / 2) fact = (double) 1.0 - (ay + ah - py) * 2 / (double) ah; else fact = (double) 1.0 - (py - ay) * 2 / (double) ah; else if (px - ax > aw / 2) fact = (double) 1.0 - (ax + aw - px) * 2 / (double) aw; else fact = (double) 1.0 - (px - ax) * 2 / (double) aw; else if (horizontal) fact = (double) (py - ay) / (double) ah; else fact = (double) (px - ax) / (double) aw; #endif // VANITYGAPS_PATCH if (!center && mirror) fact = 1.0 - fact; setmfact(&((Arg) { .f = 1.0 + fact })); px = ev.xmotion.x; py = ev.xmotion.y; break; } } while (ev.type != ButtonRelease); #if WARP_PATCH ignore_warp = 0; #endif // WARP_PATCH XUngrabPointer(dpy, CurrentTime); while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); }