sander check this 9eb226ff
arg@mmvi · 2006-09-22 09:43 1 file(s) · +37 −19
event.c +37 −19
21 21
#define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
22 22
23 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 41
movemouse(Client *c) {
25 42
	int x1, y1, ocx, ocy, di;
26 43
	unsigned int dui;
34 51
		return;
35 52
	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
36 53
	for(;;) {
37 -
		XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev);
54 +
		XMaskEvent(dpy, MOUSEMASK | ExposureMask | StructureNotifyMask, &ev);
38 55
		switch (ev.type) {
39 56
		default:
40 57
			break;
58 +
		case ConfigureRequest:
59 +
			synconfig(c, c->x, c->y, c->w, c->h, ev.xconfigure.border_width);
60 +
			XSync(dpy, False);
61 +
			break;
41 62
		case Expose:
42 63
			handler[Expose](&ev);
43 64
			break;
49 70
			break;
50 71
		case ButtonRelease:
51 72
			XUngrabPointer(dpy, CurrentTime);
73 +
			return;
74 +
		case DestroyNotify:
75 +
		case UnmapNotify:
76 +
			XUngrabPointer(dpy, CurrentTime);
77 +
			handler[ev.type](&ev);
52 78
			return;
53 79
		}
54 80
	}
68 94
		return;
69 95
	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
70 96
	for(;;) {
71 -
		XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev);
97 +
		XMaskEvent(dpy, MOUSEMASK | ExposureMask | StructureNotifyMask, &ev);
72 98
		switch(ev.type) {
73 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 104
			break;
75 105
		case Expose:
76 106
			handler[Expose](&ev);
91 121
			break;
92 122
		case ButtonRelease:
93 123
			XUngrabPointer(dpy, CurrentTime);
124 +
			return;
125 +
		case DestroyNotify:
126 +
		case UnmapNotify:
127 +
			XUngrabPointer(dpy, CurrentTime);
128 +
			handler[ev.type](&ev);
94 129
			return;
95 130
		}
96 131
	}
143 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 183
static void