You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
5.9 KiB
232 lines
5.9 KiB
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)); |
|
} |
|
|
|
|