JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
added several other stuff
[dwm.git] / event.c
1 /*
2  * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
3  * See LICENSE file for license details.
4  */
5
6 #include <fcntl.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <X11/keysym.h>
10
11 #include "wm.h"
12
13 /* local functions */
14 static void configurerequest(XEvent *e);
15 static void destroynotify(XEvent *e);
16 static void enternotify(XEvent *e);
17 static void leavenotify(XEvent *e);
18 static void expose(XEvent *e);
19 static void keypress(XEvent *e);
20 static void keymapnotify(XEvent *e);
21 static void maprequest(XEvent *e);
22 static void propertynotify(XEvent *e);
23 static void unmapnotify(XEvent *e);
24
25 void (*handler[LASTEvent]) (XEvent *) = {
26         [ConfigureRequest] = configurerequest,
27         [DestroyNotify] = destroynotify,
28         [EnterNotify] = enternotify,
29         [LeaveNotify] = leavenotify,
30         [Expose] = expose,
31         [KeyPress] = keypress,
32         [KeymapNotify] = keymapnotify,
33         [MapRequest] = maprequest,
34         [PropertyNotify] = propertynotify,
35         [UnmapNotify] = unmapnotify
36 };
37
38 unsigned int
39 flush_masked_events(long even_mask)
40 {
41         XEvent ev;
42         unsigned int n = 0;
43         while(XCheckMaskEvent(dpy, even_mask, &ev)) n++;
44         return n;
45 }
46
47 static void
48 configurerequest(XEvent *e)
49 {
50 #if 0
51         XConfigureRequestEvent *ev = &e->xconfigurerequest;
52         XWindowChanges wc;
53         XRectangle *frect;
54         Client *c;
55
56         c = client_of_win(ev->window);
57         ev->value_mask &= ~CWSibling;
58         if(c) {
59                 gravitate_client(c, True);
60
61                 if(ev->value_mask & CWX)
62                         c->rect.x = ev->x;
63                 if(ev->value_mask & CWY)
64                         c->rect.y = ev->y;
65                 if(ev->value_mask & CWWidth)
66                         c->rect.width = ev->width;
67                 if(ev->value_mask & CWHeight)
68                         c->rect.height = ev->height;
69                 if(ev->value_mask & CWBorderWidth)
70                         c->border = ev->border_width;
71
72                 gravitate_client(c, False);
73
74                 if(c->frame) {
75                         if(c->sel->area->floating)
76                                 frect=&c->sel->rect;
77                         else
78                                 frect=&c->sel->revert;
79
80                         if(c->rect.width >= screen->rect.width && c->rect.height >= screen->rect.height) {
81                                 frect->y = wc.y = -height_of_bar();
82                                 frect->x = wc.x = -def.border;
83                         }
84                         else {
85                                 frect->y = wc.y = c->rect.y - height_of_bar();
86                                 frect->x = wc.x = c->rect.x - def.border;
87                         }
88                         frect->width = wc.width = c->rect.width + 2 * def.border;
89                         frect->height = wc.height = c->rect.height + def.border
90                                 + height_of_bar();
91                         wc.border_width = 1;
92                         wc.sibling = None;
93                         wc.stack_mode = ev->detail;
94                         if(c->sel->area->view != screen->sel)
95                                 wc.x += 2 * screen->rect.width;
96                         if(c->sel->area->floating) {
97                                 XConfigureWindow(dpy, c->framewin, ev->value_mask, &wc);
98                                 configure_client(c);
99                         }
100                 }
101         }
102
103         wc.x = ev->x;
104         wc.y = ev->y;
105         wc.width = ev->width;
106         wc.height = ev->height;
107
108         if(c && c->frame) {
109                 wc.x = def.border;
110                 wc.y = height_of_bar();
111                 wc.width = c->sel->rect.width - 2 * def.border;
112                 wc.height = c->sel->rect.height - def.border - height_of_bar();
113         }
114
115         wc.border_width = 0;
116         wc.sibling = None;
117         wc.stack_mode = Above;
118         ev->value_mask &= ~CWStackMode;
119         ev->value_mask |= CWBorderWidth;
120         XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
121
122         XFlush(dpy);
123 #endif
124 }
125
126 static void
127 destroynotify(XEvent *e)
128 {
129 #if 0
130         Client *c;
131         XDestroyWindowEvent *ev = &e->xdestroywindow;
132
133         if((c = client_of_win(ev->window)))
134                 destroy_client(c);
135 #endif
136 }
137
138 static void
139 enternotify(XEvent *e)
140 {
141 #if 0
142         XCrossingEvent *ev = &e->xcrossing;
143         Client *c;
144
145         if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
146                 return;
147
148         if((c = client_of_win(ev->window))) {
149                 Frame *f = c->sel;
150                 Area *a = f->area;
151                 if(a->mode == Colmax)
152                         c = a->sel->client;
153                 focus(c, False);
154         }
155         else if(ev->window == root) {
156                 sel_screen = True;
157                 draw_frames();
158         }
159 #endif
160 }
161
162 static void
163 leavenotify(XEvent *e)
164 {
165         XCrossingEvent *ev = &e->xcrossing;
166
167         if((ev->window == root) && !ev->same_screen) {
168                 sel_screen = True;
169                 /*draw_frames();*/
170         }
171 }
172
173 static void
174 expose(XEvent *e)
175 {
176         XExposeEvent *ev = &e->xexpose;
177
178         if(ev->count == 0) {
179                 if(ev->window == barwin)
180                         draw_bar();
181         }
182 }
183
184 static void
185 keypress(XEvent *e)
186 {
187 #if 0
188         XKeyEvent *ev = &e->xkey;
189         KeySym k = 0;
190         char buf[32];
191         int n;
192         static Frame *f;
193
194
195         ev->state &= valid_mask;
196         if((f = frame_of_win(ev->window))) {
197                 buf[0] = 0;
198                 n = XLookupString(ev, buf, sizeof(buf), &k, 0);
199                 if(IsFunctionKey(k) || IsKeypadKey(k) || IsMiscFunctionKey(k)
200                                 || IsPFKey(k) || IsPrivateKeypadKey(k))
201                         return;
202                 buf[n] = 0;
203                 blitz_kpress_input(&f->tagbar, ev->state, k, buf);
204         }
205         else
206                 key(root, ev->state, (KeyCode) ev->keycode);
207 #endif
208 }
209
210 static void
211 keymapnotify(XEvent *e)
212 {
213 #if 0
214         update_keys();
215 #endif
216 }
217
218 static void
219 maprequest(XEvent *e)
220 {
221 #if 0
222         XMapRequestEvent *ev = &e->xmaprequest;
223         static XWindowAttributes wa;
224
225         if(!XGetWindowAttributes(dpy, ev->window, &wa))
226                 return;
227
228         if(wa.override_redirect) {
229                 XSelectInput(dpy, ev->window,
230                                 (StructureNotifyMask | PropertyChangeMask));
231                 return;
232         }
233
234         if(!client_of_win(ev->window))
235                 manage_client(create_client(ev->window, &wa));
236 #endif
237 }
238
239 static void
240 propertynotify(XEvent *e)
241 {
242 #if 0
243         XPropertyEvent *ev = &e->xproperty;
244         Client *c;
245
246         if(ev->state == PropertyDelete)
247                 return; /* ignore */
248
249         if((c = client_of_win(ev->window)))
250                 prop_client(c, ev);
251 #endif
252 }
253
254 static void
255 unmapnotify(XEvent *e)
256 {
257 #if 0
258         Client *c;
259         XUnmapEvent *ev = &e->xunmap;
260
261         if((c = client_of_win(ev->window)))
262                 destroy_client(c);
263 #endif
264 }