event.c
changeset 762 140bcd4782d8
parent 760 8ed842c35e8d
child 764 759a5fbbd8b7
equal deleted inserted replaced
761:4e835c2a7a12 762:140bcd4782d8
    20 #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
    20 #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
    21 #define MOUSEMASK		(BUTTONMASK | PointerMotionMask)
    21 #define MOUSEMASK		(BUTTONMASK | PointerMotionMask)
    22 
    22 
    23 static void
    23 static void
    24 movemouse(Client *c) {
    24 movemouse(Client *c) {
    25 	int x1, y1, ocx, ocy, di;
    25 	int x1, y1, ocx, ocy, di, nx, ny;
    26 	unsigned int dui;
    26 	unsigned int dui;
    27 	Window dummy;
    27 	Window dummy;
    28 	XEvent ev;
    28 	XEvent ev;
    29 
    29 
    30 	ocx = c->x;
    30 	ocx = nx = c->x;
    31 	ocy = c->y;
    31 	ocy = ny =  c->y;
    32 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
    32 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
    33 			None, cursor[CurMove], CurrentTime) != GrabSuccess)
    33 			None, cursor[CurMove], CurrentTime) != GrabSuccess)
    34 		return;
    34 		return;
    35 	c->ismax = False;
    35 	c->ismax = False;
    36 	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    36 	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    37 	for(;;) {
    37 	for(;;) {
    38 		XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev);
    38 		XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev);
    39 		switch (ev.type) {
    39 		switch (ev.type) {
    40 		case ButtonRelease:
    40 		case ButtonRelease:
    41 			resize(c, True);
       
    42 			XUngrabPointer(dpy, CurrentTime);
    41 			XUngrabPointer(dpy, CurrentTime);
    43 			return;
    42 			return;
    44 		case ConfigureRequest:
    43 		case ConfigureRequest:
    45 		case Expose:
    44 		case Expose:
    46 		case MapRequest:
    45 		case MapRequest:
    47 			handler[ev.type](&ev);
    46 			handler[ev.type](&ev);
    48 			break;
    47 			break;
    49 		case MotionNotify:
    48 		case MotionNotify:
    50 			XSync(dpy, False);
    49 			XSync(dpy, False);
    51 			c->x = ocx + (ev.xmotion.x - x1);
    50 			nx = ocx + (ev.xmotion.x - x1);
    52 			c->y = ocy + (ev.xmotion.y - y1);
    51 			ny = ocy + (ev.xmotion.y - y1);
    53 			if(abs(wax + c->x) < SNAP)
    52 			if(abs(wax + nx) < SNAP)
    54 				c->x = wax;
    53 				nx = wax;
    55 			else if(abs((wax + waw) - (c->x + c->w + 2 * c->border)) < SNAP)
    54 			else if(abs((wax + waw) - (nx + c->w + 2 * c->border)) < SNAP)
    56 				c->x = wax + waw - c->w - 2 * c->border;
    55 				nx = wax + waw - c->w - 2 * c->border;
    57 			if(abs(way - c->y) < SNAP)
    56 			if(abs(way - ny) < SNAP)
    58 				c->y = way;
    57 				ny = way;
    59 			else if(abs((way + wah) - (c->y + c->h + 2 * c->border)) < SNAP)
    58 			else if(abs((way + wah) - (ny + c->h + 2 * c->border)) < SNAP)
    60 				c->y = way + wah - c->h - 2 * c->border;
    59 				ny = way + wah - c->h - 2 * c->border;
    61 			resize(c, False);
    60 			resize(c, nx, ny, c->w, c->h, False);
    62 			break;
    61 			break;
    63 		}
    62 		}
    64 	}
    63 	}
    65 }
    64 }
    66 
    65 
    79 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1);
    78 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1);
    80 	for(;;) {
    79 	for(;;) {
    81 		XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask , &ev);
    80 		XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask , &ev);
    82 		switch(ev.type) {
    81 		switch(ev.type) {
    83 		case ButtonRelease:
    82 		case ButtonRelease:
    84 			resize(c, True);
       
    85 			XWarpPointer(dpy, None, c->win, 0, 0, 0, 0,
    83 			XWarpPointer(dpy, None, c->win, 0, 0, 0, 0,
    86 					c->w + c->border - 1, c->h + c->border - 1);
    84 					c->w + c->border - 1, c->h + c->border - 1);
    87 			XUngrabPointer(dpy, CurrentTime);
    85 			XUngrabPointer(dpy, CurrentTime);
    88 			while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
    86 			while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
    89 			return;
    87 			return;
    92 		case MapRequest:
    90 		case MapRequest:
    93 			handler[ev.type](&ev);
    91 			handler[ev.type](&ev);
    94 			break;
    92 			break;
    95 		case MotionNotify:
    93 		case MotionNotify:
    96 			XSync(dpy, False);
    94 			XSync(dpy, False);
    97 			nw = ev.xmotion.x - ocx - 2 * c->border + 1;
    95 			if((nw = ev.xmotion.x - ocx - 2 * c->border + 1) <= 0)
    98 			c->w = nw > 0 ? nw : 1;
    96 				nw = 1;
    99 			nh = ev.xmotion.y - ocy - 2 * c->border + 1;
    97 			if((nh = ev.xmotion.y - ocy - 2 * c->border + 1) <= 0)
   100 			c->h = nh > 0 ? nh : 1;
    98 				nh = 1;
   101 			resize(c, True);
    99 			resize(c, c->x, c->y, nw, nh, True);
   102 			break;
   100 			break;
   103 		}
   101 		}
   104 	}
   102 	}
   105 }
   103 }
   106 
   104 
   185 			if(ev->value_mask & CWHeight)
   183 			if(ev->value_mask & CWHeight)
   186 				c->h = ev->height;
   184 				c->h = ev->height;
   187 			if((ev->value_mask & (CWX | CWY))
   185 			if((ev->value_mask & (CWX | CWY))
   188 			&& !(ev->value_mask & (CWWidth | CWHeight)))
   186 			&& !(ev->value_mask & (CWWidth | CWHeight)))
   189 				configure(c);
   187 				configure(c);
   190 			resize(c, False);
   188 			resize(c, c->x, c->y, c->w, c->h, False);
   191 			if(!isvisible(c))
   189 			if(!isvisible(c))
   192 				ban(c);
   190 				ban(c);
   193 		}
   191 		}
   194 		else
   192 		else
   195 			configure(c);
   193 			configure(c);