84 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.8 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;
 | |
| 
 | |
| 	#if WARP_PATCH
 | |
| 	ignore_warp = 1;
 | |
| 	#endif // WARP_PATCH
 | |
| 
 | |
| 	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);
 | |
| 
 | |
| 	#if WARP_PATCH
 | |
| 	ignore_warp = 0;
 | |
| 	#endif // WARP_PATCH
 | |
| 
 | |
| 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2);
 | |
| 
 | |
| 	XUngrabPointer(dpy, CurrentTime);
 | |
| 	while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 | |
| }
 | |
| 
 |