event.c
changeset 476 3e4596240abb
parent 473 2d8af0d7920d
child 478 635b58a87d20
equal deleted inserted replaced
475:898c54484cb2 476:3e4596240abb
    19 KEYS
    19 KEYS
    20 
    20 
    21 #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
    21 #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
    22 
    22 
    23 static void
    23 static void
       
    24 synconfig(Client *c, int x, int y, int w, int h, unsigned int border) {
       
    25 	XEvent synev;
       
    26 
       
    27 	synev.type = ConfigureNotify;
       
    28 	synev.xconfigure.display = dpy;
       
    29 	synev.xconfigure.event = c->win;
       
    30 	synev.xconfigure.window = c->win;
       
    31 	synev.xconfigure.x = x;
       
    32 	synev.xconfigure.y = y;
       
    33 	synev.xconfigure.width = w;
       
    34 	synev.xconfigure.height = h;
       
    35 	synev.xconfigure.border_width = border;
       
    36 	synev.xconfigure.above = None;
       
    37 	XSendEvent(dpy, c->win, True, NoEventMask, &synev);
       
    38 }
       
    39 
       
    40 static void
    24 movemouse(Client *c) {
    41 movemouse(Client *c) {
    25 	int x1, y1, ocx, ocy, di;
    42 	int x1, y1, ocx, ocy, di;
    26 	unsigned int dui;
    43 	unsigned int dui;
    27 	Window dummy;
    44 	Window dummy;
    28 	XEvent ev;
    45 	XEvent ev;
    32 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
    49 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
    33 			None, cursor[CurMove], CurrentTime) != GrabSuccess)
    50 			None, cursor[CurMove], CurrentTime) != GrabSuccess)
    34 		return;
    51 		return;
    35 	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    52 	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    36 	for(;;) {
    53 	for(;;) {
    37 		XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev);
    54 		XMaskEvent(dpy, MOUSEMASK | ExposureMask | StructureNotifyMask, &ev);
    38 		switch (ev.type) {
    55 		switch (ev.type) {
    39 		default:
    56 		default:
       
    57 			break;
       
    58 		case ConfigureRequest:
       
    59 			synconfig(c, c->x, c->y, c->w, c->h, ev.xconfigure.border_width);
       
    60 			XSync(dpy, False);
    40 			break;
    61 			break;
    41 		case Expose:
    62 		case Expose:
    42 			handler[Expose](&ev);
    63 			handler[Expose](&ev);
    43 			break;
    64 			break;
    44 		case MotionNotify:
    65 		case MotionNotify:
    47 			c->y = ocy + (ev.xmotion.y - y1);
    68 			c->y = ocy + (ev.xmotion.y - y1);
    48 			resize(c, False, TopLeft);
    69 			resize(c, False, TopLeft);
    49 			break;
    70 			break;
    50 		case ButtonRelease:
    71 		case ButtonRelease:
    51 			XUngrabPointer(dpy, CurrentTime);
    72 			XUngrabPointer(dpy, CurrentTime);
       
    73 			return;
       
    74 		case DestroyNotify:
       
    75 		case UnmapNotify:
       
    76 			XUngrabPointer(dpy, CurrentTime);
       
    77 			handler[ev.type](&ev);
    52 			return;
    78 			return;
    53 		}
    79 		}
    54 	}
    80 	}
    55 }
    81 }
    56 
    82 
    66 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
    92 	if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
    67 				None, cursor[CurResize], CurrentTime) != GrabSuccess)
    93 				None, cursor[CurResize], CurrentTime) != GrabSuccess)
    68 		return;
    94 		return;
    69 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
    95 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
    70 	for(;;) {
    96 	for(;;) {
    71 		XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev);
    97 		XMaskEvent(dpy, MOUSEMASK | ExposureMask | StructureNotifyMask, &ev);
    72 		switch(ev.type) {
    98 		switch(ev.type) {
    73 		default:
    99 		default:
       
   100 			break;
       
   101 		case ConfigureRequest:
       
   102 			synconfig(c, c->x, c->y, c->w, c->h, ev.xconfigure.border_width);
       
   103 			XSync(dpy, False);
    74 			break;
   104 			break;
    75 		case Expose:
   105 		case Expose:
    76 			handler[Expose](&ev);
   106 			handler[Expose](&ev);
    77 			break;
   107 			break;
    78 		case MotionNotify:
   108 		case MotionNotify:
    89 				sticky = (ocy <= ev.xmotion.y) ? TopRight : BotRight;
   119 				sticky = (ocy <= ev.xmotion.y) ? TopRight : BotRight;
    90 			resize(c, True, sticky);
   120 			resize(c, True, sticky);
    91 			break;
   121 			break;
    92 		case ButtonRelease:
   122 		case ButtonRelease:
    93 			XUngrabPointer(dpy, CurrentTime);
   123 			XUngrabPointer(dpy, CurrentTime);
       
   124 			return;
       
   125 		case DestroyNotify:
       
   126 		case UnmapNotify:
       
   127 			XUngrabPointer(dpy, CurrentTime);
       
   128 			handler[ev.type](&ev);
    94 			return;
   129 			return;
    95 		}
   130 		}
    96 	}
   131 	}
    97 }
   132 }
    98 
   133 
   141 		else if(ev->button == Button3 && (arrange == dofloat || c->isfloat)) {
   176 		else if(ev->button == Button3 && (arrange == dofloat || c->isfloat)) {
   142 			restack(c);
   177 			restack(c);
   143 			resizemouse(c);
   178 			resizemouse(c);
   144 		}
   179 		}
   145 	}
   180 	}
   146 }
       
   147 
       
   148 static void
       
   149 synconfig(Client *c, int x, int y, int w, int h, unsigned int border) {
       
   150 	XEvent synev;
       
   151 
       
   152 	synev.type = ConfigureNotify;
       
   153 	synev.xconfigure.display = dpy;
       
   154 	synev.xconfigure.event = c->win;
       
   155 	synev.xconfigure.window = c->win;
       
   156 	synev.xconfigure.x = x;
       
   157 	synev.xconfigure.y = y;
       
   158 	synev.xconfigure.width = w;
       
   159 	synev.xconfigure.height = h;
       
   160 	synev.xconfigure.border_width = border;
       
   161 	synev.xconfigure.above = None;
       
   162 	XSendEvent(dpy, c->win, True, NoEventMask, &synev);
       
   163 }
   181 }
   164 
   182 
   165 static void
   183 static void
   166 configurerequest(XEvent *e) {
   184 configurerequest(XEvent *e) {
   167 	unsigned long newmask;
   185 	unsigned long newmask;