event.c
changeset 489 d34374cbe926
parent 488 0d2559f46b9e
child 490 303d3384720e
equal deleted inserted replaced
488:0d2559f46b9e 489:d34374cbe926
    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
       
    41 movemouse(Client *c) {
    24 movemouse(Client *c) {
    42 	int x1, y1, ocx, ocy, di;
    25 	int x1, y1, ocx, ocy, di;
    43 	unsigned int dui;
    26 	unsigned int dui;
    44 	Window dummy;
    27 	Window dummy;
    45 	XEvent ev;
    28 	XEvent ev;
    50 			None, cursor[CurMove], CurrentTime) != GrabSuccess)
    33 			None, cursor[CurMove], CurrentTime) != GrabSuccess)
    51 		return;
    34 		return;
    52 	c->ismax = False;
    35 	c->ismax = False;
    53 	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    36 	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    54 	for(;;) {
    37 	for(;;) {
    55 		XMaskEvent(dpy, MOUSEMASK | ExposureMask | StructureNotifyMask, &ev);
    38 		XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev);
    56 		switch (ev.type) {
    39 		switch (ev.type) {
    57 		default:
       
    58 			break;
       
    59 		case ConfigureRequest:
       
    60 			synconfig(c, c->x, c->y, c->w, c->h, ev.xconfigure.border_width);
       
    61 			XSync(dpy, False);
       
    62 			break;
       
    63 		case Expose:
    40 		case Expose:
    64 			handler[Expose](&ev);
    41 			handler[Expose](&ev);
    65 			break;
    42 			break;
    66 		case MotionNotify:
    43 		case MotionNotify:
    67 			XSync(dpy, False);
    44 			XSync(dpy, False);
    70 			resize(c, False, TopLeft);
    47 			resize(c, False, TopLeft);
    71 			break;
    48 			break;
    72 		case ButtonRelease:
    49 		case ButtonRelease:
    73 			XUngrabPointer(dpy, CurrentTime);
    50 			XUngrabPointer(dpy, CurrentTime);
    74 			return;
    51 			return;
    75 		case DestroyNotify:
       
    76 		case UnmapNotify:
       
    77 			XUngrabPointer(dpy, CurrentTime);
       
    78 			handler[ev.type](&ev);
       
    79 			return;
       
    80 		}
    52 		}
    81 	}
    53 	}
    82 }
    54 }
    83 
    55 
    84 static void
    56 static void
    94 				None, cursor[CurResize], CurrentTime) != GrabSuccess)
    66 				None, cursor[CurResize], CurrentTime) != GrabSuccess)
    95 		return;
    67 		return;
    96 	c->ismax = False;
    68 	c->ismax = False;
    97 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
    69 	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
    98 	for(;;) {
    70 	for(;;) {
    99 		XMaskEvent(dpy, MOUSEMASK | ExposureMask | StructureNotifyMask, &ev);
    71 		XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev);
   100 		switch(ev.type) {
    72 		switch(ev.type) {
   101 		default:
       
   102 			break;
       
   103 		case ConfigureRequest:
       
   104 			synconfig(c, c->x, c->y, c->w, c->h, ev.xconfigure.border_width);
       
   105 			XSync(dpy, False);
       
   106 			break;
       
   107 		case Expose:
    73 		case Expose:
   108 			handler[Expose](&ev);
    74 			handler[Expose](&ev);
   109 			break;
    75 			break;
   110 		case MotionNotify:
    76 		case MotionNotify:
   111 			XSync(dpy, False);
    77 			XSync(dpy, False);
   122 			resize(c, True, sticky);
    88 			resize(c, True, sticky);
   123 			break;
    89 			break;
   124 		case ButtonRelease:
    90 		case ButtonRelease:
   125 			XUngrabPointer(dpy, CurrentTime);
    91 			XUngrabPointer(dpy, CurrentTime);
   126 			return;
    92 			return;
   127 		case DestroyNotify:
       
   128 		case UnmapNotify:
       
   129 			XUngrabPointer(dpy, CurrentTime);
       
   130 			handler[ev.type](&ev);
       
   131 			return;
       
   132 		}
    93 		}
   133 	}
    94 	}
   134 }
    95 }
   135 
    96 
   136 static void
    97 static void
   185 static void
   146 static void
   186 configurerequest(XEvent *e) {
   147 configurerequest(XEvent *e) {
   187 	unsigned long newmask;
   148 	unsigned long newmask;
   188 	Client *c;
   149 	Client *c;
   189 	XConfigureRequestEvent *ev = &e->xconfigurerequest;
   150 	XConfigureRequestEvent *ev = &e->xconfigurerequest;
       
   151 	XEvent synev;
   190 	XWindowChanges wc;
   152 	XWindowChanges wc;
   191 
   153 
   192 	if((c = getclient(ev->window))) {
   154 	if((c = getclient(ev->window))) {
   193 		c->ismax = False;
   155 		c->ismax = False;
   194 		gravitate(c, True);
   156 		gravitate(c, True);
   208 		wc.width = c->w;
   170 		wc.width = c->w;
   209 		wc.height = c->h;
   171 		wc.height = c->h;
   210 		newmask = ev->value_mask & (~(CWSibling | CWStackMode | CWBorderWidth));
   172 		newmask = ev->value_mask & (~(CWSibling | CWStackMode | CWBorderWidth));
   211 		if(newmask)
   173 		if(newmask)
   212 			XConfigureWindow(dpy, c->win, newmask, &wc);
   174 			XConfigureWindow(dpy, c->win, newmask, &wc);
   213 		else
   175 		else {
   214 			synconfig(c, c->x, c->y, c->w, c->h, c->border);
   176 			synev.type = ConfigureNotify;
       
   177 			synev.xconfigure.display = dpy;
       
   178 			synev.xconfigure.event = c->win;
       
   179 			synev.xconfigure.window = c->win;
       
   180 			synev.xconfigure.x = c->x;
       
   181 			synev.xconfigure.y = c->y;
       
   182 			synev.xconfigure.width = c->w;
       
   183 			synev.xconfigure.height = c->h;
       
   184 			synev.xconfigure.border_width = c->border;
       
   185 			synev.xconfigure.above = None;
       
   186 			XSendEvent(dpy, c->win, True, NoEventMask, &synev);
       
   187 		}
   215 		XSync(dpy, False);
   188 		XSync(dpy, False);
   216 		if(c->isfloat)
   189 		if(c->isfloat)
   217 			resize(c, False, TopLeft);
   190 			resize(c, False, TopLeft);
   218 		else
   191 		else
   219 			arrange(NULL);
   192 			arrange(NULL);