74 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
void
 | 
						|
dragcfact(const Arg *arg)
 | 
						|
{
 | 
						|
	int prev_x, prev_y, dist_x, dist_y;
 | 
						|
	float fact;
 | 
						|
	Client *c;
 | 
						|
	XEvent ev;
 | 
						|
	Time lasttime = 0;
 | 
						|
 | 
						|
	if (!(c = selmon->sel))
 | 
						|
		return;
 | 
						|
	if (c->isfloating) {
 | 
						|
		resizemouse(arg);
 | 
						|
		return;
 | 
						|
	}
 | 
						|
	#if !FAKEFULLSCREEN_PATCH
 | 
						|
	#if FAKEFULLSCREEN_CLIENT_PATCH
 | 
						|
	if (c->isfullscreen && !c->fakefullscreen) /* no support resizing fullscreen windows by mouse */
 | 
						|
		return;
 | 
						|
	#else
 | 
						|
	if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */
 | 
						|
		return;
 | 
						|
	#endif // FAKEFULLSCREEN_CLIENT_PATCH
 | 
						|
	#endif // !FAKEFULLSCREEN_PATCH
 | 
						|
	restack(selmon);
 | 
						|
 | 
						|
	if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
 | 
						|
		None, cursor[CurIronCross]->cursor, CurrentTime) != GrabSuccess)
 | 
						|
		return;
 | 
						|
	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2);
 | 
						|
 | 
						|
	prev_x = prev_y = -999999;
 | 
						|
 | 
						|
	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 / 60))
 | 
						|
				continue;
 | 
						|
			lasttime = ev.xmotion.time;
 | 
						|
			if (prev_x == -999999) {
 | 
						|
				prev_x = ev.xmotion.x_root;
 | 
						|
				prev_y = ev.xmotion.y_root;
 | 
						|
			}
 | 
						|
 | 
						|
			dist_x = ev.xmotion.x - prev_x;
 | 
						|
			dist_y = ev.xmotion.y - prev_y;
 | 
						|
 | 
						|
			if (abs(dist_x) > abs(dist_y)) {
 | 
						|
				fact = (float) 4.0 * dist_x / c->mon->ww;
 | 
						|
			} else {
 | 
						|
				fact = (float) -4.0 * dist_y / c->mon->wh;
 | 
						|
			}
 | 
						|
 | 
						|
			if (fact)
 | 
						|
				setcfact(&((Arg) { .f = fact }));
 | 
						|
 | 
						|
			prev_x = ev.xmotion.x;
 | 
						|
			prev_y = ev.xmotion.y;
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	} while (ev.type != ButtonRelease);
 | 
						|
 | 
						|
 | 
						|
	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2);
 | 
						|
 | 
						|
	XUngrabPointer(dpy, CurrentTime);
 | 
						|
	while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | 
						|
} |