event.c
changeset 708 a2d568a5cdb8
parent 707 c3c57faef013
child 709 6c2fcf88dd9f
equal deleted inserted replaced
707:c3c57faef013 708:a2d568a5cdb8
    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, &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, TopLeft);
    41 			resize(c, True);
    42 			XUngrabPointer(dpy, CurrentTime);
    42 			XUngrabPointer(dpy, CurrentTime);
    43 			return;
    43 			return;
       
    44 		case ConfigureRequest:
    44 		case Expose:
    45 		case Expose:
    45 			handler[Expose](&ev);
    46 		case MapRequest:
       
    47 			handler[ev.type](&ev);
    46 			break;
    48 			break;
    47 		case MotionNotify:
    49 		case MotionNotify:
    48 			XSync(dpy, False);
    50 			XSync(dpy, False);
    49 			c->x = ocx + (ev.xmotion.x - x1);
    51 			c->x = ocx + (ev.xmotion.x - x1);
    50 			c->y = ocy + (ev.xmotion.y - y1);
    52 			c->y = ocy + (ev.xmotion.y - y1);
    51 			if(abs(wax + c->x) < SNAP)
    53 			if(abs(wax + c->x) < SNAP)
    52 				c->x = wax;
    54 				c->x = wax;
    53 			else if(abs((wax + waw) - (c->x + c->w)) < SNAP)
    55 			else if(abs((wax + waw) - (c->x + c->w + 2 * c->border)) < SNAP)
    54 				c->x = wax + waw - c->w - 2 * BORDERPX;
    56 				c->x = wax + waw - c->w - 2 * c->border;
    55 			if(abs(way - c->y) < SNAP)
    57 			if(abs(way - c->y) < SNAP)
    56 				c->y = way;
    58 				c->y = way;
    57 			else if(abs((way + wah) - (c->y + c->h)) < SNAP)
    59 			else if(abs((way + wah) - (c->y + c->h + 2 * c->border)) < SNAP)
    58 				c->y = way + wah - c->h - 2 * BORDERPX;
    60 				c->y = way + wah - c->h - 2 * c->border;
    59 			resize(c, False, TopLeft);
    61 			resize(c, False);
    60 			break;
    62 			break;
    61 		}
    63 		}
    62 	}
    64 	}
    63 }
    65 }
    64 
    66 
    65 static void
    67 static void
    66 resizemouse(Client *c) {
    68 resizemouse(Client *c) {
    67 	int ocx, ocy;
    69 	int ocx, ocy;
    68 	int nw, nh;
    70 	int nw, nh;
    69 	Corner sticky;
       
    70 	XEvent ev;
    71 	XEvent ev;
    71 
    72 
    72 	ocx = c->x;
    73 	ocx = c->x;
    73 	ocy = c->y;
    74 	ocy = c->y;
    74 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
    75 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
    75 			None, cursor[CurResize], CurrentTime) != GrabSuccess)
    76 			None, cursor[CurResize], CurrentTime) != GrabSuccess)
    76 		return;
    77 		return;
    77 	c->ismax = False;
    78 	c->ismax = False;
    78 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
    79 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1);
    79 	for(;;) {
    80 	for(;;) {
    80 		XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev);
    81 		XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask , &ev);
    81 		switch(ev.type) {
    82 		switch(ev.type) {
    82 		case ButtonRelease:
    83 		case ButtonRelease:
    83 			resize(c, True, TopLeft);
    84 			resize(c, True);
    84 			XUngrabPointer(dpy, CurrentTime);
    85 			XUngrabPointer(dpy, CurrentTime);
    85 			return;
    86 			return;
       
    87 		case ConfigureRequest:
    86 		case Expose:
    88 		case Expose:
    87 			handler[Expose](&ev);
    89 		case MapRequest:
       
    90 			handler[ev.type](&ev);
    88 			break;
    91 			break;
    89 		case MotionNotify:
    92 		case MotionNotify:
    90 			XSync(dpy, False);
    93 			XSync(dpy, False);
    91 			if((nw = abs(ocx - ev.xmotion.x)))
    94 			nw = ev.xmotion.x - ocx - 2 * c->border + 1;
    92 				c->w = nw;
    95 			c->w = nw > 0 ? nw : 1;
    93 			if((nh = abs(ocy - ev.xmotion.y)))
    96 			nh = ev.xmotion.y - ocy - 2 * c->border + 1;
    94 				c->h = nh;
    97 			c->h = nh > 0 ? nh : 1;
    95 			c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w;
    98 			resize(c, True);
    96 			c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h;
       
    97 			if(ocx <= ev.xmotion.x)
       
    98 				sticky = (ocy <= ev.xmotion.y) ? TopLeft : BotLeft;
       
    99 			else
       
   100 				sticky = (ocy <= ev.xmotion.y) ? TopRight : BotRight;
       
   101 			resize(c, True, sticky);
       
   102 			break;
    99 			break;
   103 		}
   100 		}
   104 	}
   101 	}
   105 }
   102 }
   106 
   103 
   192 			XConfigureWindow(dpy, c->win, newmask, &wc);
   189 			XConfigureWindow(dpy, c->win, newmask, &wc);
   193 		else
   190 		else
   194 			configure(c);
   191 			configure(c);
   195 		XSync(dpy, False);
   192 		XSync(dpy, False);
   196 		if(c->isfloat) {
   193 		if(c->isfloat) {
   197 			resize(c, False, TopLeft);
   194 			resize(c, False);
   198 			if(!isvisible(c))
   195 			if(!isvisible(c))
   199 				XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
   196 				XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
   200 		}
   197 		}
   201 		else
   198 		else
   202 			arrange();
   199 			arrange();
   232 		return;
   229 		return;
   233 	if((c = getclient(ev->window)) && isvisible(c))
   230 	if((c = getclient(ev->window)) && isvisible(c))
   234 		focus(c);
   231 		focus(c);
   235 	else if(ev->window == root) {
   232 	else if(ev->window == root) {
   236 		issel = True;
   233 		issel = True;
   237 		focus(sel);
   234 		for(c = stack; c && !isvisible(c); c = c->snext);
       
   235 		focus(c);
   238 	}
   236 	}
   239 }
   237 }
   240 
   238 
   241 static void
   239 static void
   242 expose(XEvent *e) {
   240 expose(XEvent *e) {