| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 | 
							- /*
 
-  * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
 
-  * See LICENSE file for license details.
 
-  */
 
- #include <fcntl.h>
 
- #include <stdlib.h>
 
- #include <string.h>
 
- #include <X11/keysym.h>
 
- #include <X11/Xatom.h>
 
- #include "wm.h"
 
- /* local functions */
 
- static void buttonpress(XEvent *e);
 
- static void configurerequest(XEvent *e);
 
- static void destroynotify(XEvent *e);
 
- static void enternotify(XEvent *e);
 
- static void leavenotify(XEvent *e);
 
- static void expose(XEvent *e);
 
- static void keymapnotify(XEvent *e);
 
- static void maprequest(XEvent *e);
 
- static void propertynotify(XEvent *e);
 
- static void unmapnotify(XEvent *e);
 
- void (*handler[LASTEvent]) (XEvent *) = {
 
- 	[ButtonPress] = buttonpress,
 
- 	[ConfigureRequest] = configurerequest,
 
- 	[DestroyNotify] = destroynotify,
 
- 	[EnterNotify] = enternotify,
 
- 	[LeaveNotify] = leavenotify,
 
- 	[Expose] = expose,
 
- 	[KeyPress] = keypress,
 
- 	[KeymapNotify] = keymapnotify,
 
- 	[MapRequest] = maprequest,
 
- 	[PropertyNotify] = propertynotify,
 
- 	[UnmapNotify] = unmapnotify
 
- };
 
- void
 
- discard_events(long even_mask)
 
- {
 
- 	XEvent ev;
 
- 	while(XCheckMaskEvent(dpy, even_mask, &ev));
 
- }
 
- static void
 
- buttonpress(XEvent *e)
 
- {
 
- 	XButtonPressedEvent *ev = &e->xbutton;
 
- 	Client *c;
 
- 	if((c = getclient(ev->window))) {
 
- 		raise(c);
 
- 		switch(ev->button) {
 
- 		default:
 
- 			break;
 
- 		case Button1:
 
- 			mmove(c);
 
- 			break;
 
- 		case Button2:
 
- 			lower(c);
 
- 			break;
 
- 		case Button3:
 
- 			mresize(c);
 
- 			break;
 
- 		}
 
- 	}
 
- }
 
- static void
 
- configurerequest(XEvent *e)
 
- {
 
- 	XConfigureRequestEvent *ev = &e->xconfigurerequest;
 
- 	XWindowChanges wc;
 
- 	Client *c;
 
- 	ev->value_mask &= ~CWSibling;
 
- 	if((c = getclient(ev->window))) {
 
- 		if(ev->value_mask & CWX)
 
- 			c->x = ev->x;
 
- 		if(ev->value_mask & CWY)
 
- 			c->y = ev->y;
 
- 		if(ev->value_mask & CWWidth)
 
- 			c->w = ev->width;
 
- 		if(ev->value_mask & CWHeight)
 
- 			c->h = ev->height;
 
- 	}
 
- 	wc.x = ev->x;
 
- 	wc.y = ev->y;
 
- 	wc.width = ev->width;
 
- 	wc.height = ev->height;
 
- 	wc.border_width = 1;
 
- 	wc.sibling = None;
 
- 	wc.stack_mode = Above;
 
- 	ev->value_mask &= ~CWStackMode;
 
- 	ev->value_mask |= CWBorderWidth;
 
- 	XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
 
- 	XFlush(dpy);
 
- }
 
- static void
 
- destroynotify(XEvent *e)
 
- {
 
- 	Client *c;
 
- 	XDestroyWindowEvent *ev = &e->xdestroywindow;
 
- 	if((c = getclient(ev->window)))
 
- 		unmanage(c);
 
- }
 
- static void
 
- enternotify(XEvent *e)
 
- {
 
- 	XCrossingEvent *ev = &e->xcrossing;
 
- 	Client *c;
 
- 	if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
 
- 		return;
 
- 	if((c = getclient(ev->window)))
 
- 		focus(c);
 
- 	else if(ev->window == root)
 
- 		sel_screen = True;
 
- }
 
- static void
 
- leavenotify(XEvent *e)
 
- {
 
- 	XCrossingEvent *ev = &e->xcrossing;
 
- 	if((ev->window == root) && !ev->same_screen)
 
- 		sel_screen = True;
 
- }
 
- static void
 
- expose(XEvent *e)
 
- {
 
- 	XExposeEvent *ev = &e->xexpose;
 
- 	Client *c;
 
- 	if(ev->count == 0) {
 
- 		if((c = gettitle(ev->window)))
 
- 			draw_client(c);
 
- 		else if(ev->window == barwin)
 
- 			draw_bar();
 
- 	}
 
- }
 
- static void
 
- keymapnotify(XEvent *e)
 
- {
 
- 	update_keys();
 
- }
 
- static void
 
- maprequest(XEvent *e)
 
- {
 
- 	XMapRequestEvent *ev = &e->xmaprequest;
 
- 	static XWindowAttributes wa;
 
- 	if(!XGetWindowAttributes(dpy, ev->window, &wa))
 
- 		return;
 
- 	if(wa.override_redirect) {
 
- 		XSelectInput(dpy, ev->window,
 
- 				(StructureNotifyMask | PropertyChangeMask));
 
- 		return;
 
- 	}
 
- 	if(!getclient(ev->window))
 
- 		manage(ev->window, &wa);
 
- }
 
- static void
 
- propertynotify(XEvent *e)
 
- {
 
- 	XPropertyEvent *ev = &e->xproperty;
 
- 	Client *c;
 
- 	if(ev->state == PropertyDelete)
 
- 		return; /* ignore */
 
- 	if(ev->atom == wm_atom[WMProtocols]) {
 
- 		c->proto = win_proto(c->win);
 
- 		return;
 
- 	}
 
- 	if((c = getclient(ev->window))) {
 
- 		switch (ev->atom) {
 
- 			default: break;
 
- 			case XA_WM_TRANSIENT_FOR:
 
- 				XGetTransientForHint(dpy, c->win, &c->trans);
 
- 				break;
 
- 				update_size(c);
 
- 			case XA_WM_NORMAL_HINTS:
 
- 				update_size(c);
 
- 				break;
 
- 		}
 
- 		if(ev->atom == XA_WM_NAME || ev->atom == net_atom[NetWMName]) {
 
- 			update_name(c);
 
- 			if(c == stack)
 
- 				draw_bar();
 
- 			else
 
- 				draw_client(c);
 
- 		}
 
- 	}
 
- }
 
- static void
 
- unmapnotify(XEvent *e)
 
- {
 
- 	Client *c;
 
- 	XUnmapEvent *ev = &e->xunmap;
 
- 	if((c = getclient(ev->window)))
 
- 		unmanage(c);
 
- }
 
 
  |