all repos — dwm @ 8a8b7956b6de80decbfd3bff6d2ad6e5bb69b2bd

fork of suckless dynamic window manager

event.c (view raw)

  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 */
 14static void configurerequest(XEvent *e);
 15static void destroynotify(XEvent *e);
 16static void enternotify(XEvent *e);
 17static void leavenotify(XEvent *e);
 18static void expose(XEvent *e);
 19static void keypress(XEvent *e);
 20static void keymapnotify(XEvent *e);
 21static void maprequest(XEvent *e);
 22static void propertynotify(XEvent *e);
 23static void unmapnotify(XEvent *e);
 24
 25void (*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
 38unsigned int
 39flush_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
 47static void
 48configurerequest(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
126static void
127destroynotify(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
138static void
139enternotify(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
162static void
163leavenotify(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
173static void
174expose(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
184static void
185keypress(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
210static void
211keymapnotify(XEvent *e)
212{
213#if 0
214	update_keys();
215#endif
216}
217
218static void
219maprequest(XEvent *e)
220{
221	XMapRequestEvent *ev = &e->xmaprequest;
222	static XWindowAttributes wa;
223
224	if(!XGetWindowAttributes(dpy, ev->window, &wa))
225		return;
226
227	if(wa.override_redirect) {
228		XSelectInput(dpy, ev->window,
229				(StructureNotifyMask | PropertyChangeMask));
230		return;
231	}
232
233	/*if(!client_of_win(ev->window))*/
234		manage(create_client(ev->window, &wa));
235}
236
237static void
238propertynotify(XEvent *e)
239{
240#if 0
241	XPropertyEvent *ev = &e->xproperty;
242	Client *c;
243
244	if(ev->state == PropertyDelete)
245		return; /* ignore */
246
247	if((c = client_of_win(ev->window)))
248		prop_client(c, ev);
249#endif
250}
251
252static void
253unmapnotify(XEvent *e)
254{
255#if 0
256	Client *c;
257	XUnmapEvent *ev = &e->xunmap;
258
259	if((c = client_of_win(ev->window)))
260		destroy_client(c);
261#endif
262}