sander check this
9eb226ff
1 file(s) · +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 |
|