comparison event.c @ 489:d34374cbe926

simplified mouse resizals
author arg@mmvi
date Mon, 25 Sep 2006 21:19:18 +0200
parents 0d2559f46b9e
children 303d3384720e
comparison
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);