220 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			220 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
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 FLEXTILE_DELUXE_LAYOUT
 | 
						|
	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
 | 
						|
		|| (!n || (!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;
 | 
						|
	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);
 | 
						|
 | 
						|
	XUngrabPointer(dpy, CurrentTime);
 | 
						|
	while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | 
						|
} |