| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 | /* * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> * See LICENSE file for license details. */#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <X11/keysym.h>#include <X11/Xatom.h>#include "dwm.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};static voidbuttonpress(XEvent *e){	XButtonPressedEvent *ev = &e->xbutton;	Client *c;	if(barwin == ev->window)		barclick(ev);	else if((c = getclient(ev->window))) {		craise(c);		switch(ev->button) {		default:			break;		case Button1:			mmove(c);			break;		case Button2:			lower(c);			break;		case Button3:			mresize(c);			break;		}	}}static voidconfigurerequest(XEvent *e){	XConfigureRequestEvent *ev = &e->xconfigurerequest;	XWindowChanges wc;	Client *c;	ev->value_mask &= ~CWSibling;	if((c = getclient(ev->window))) {		gravitate(c, True);		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;		if(ev->value_mask & CWBorderWidth)			c->border = 1;		gravitate(c, False);		resize(c, True);	}	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 voiddestroynotify(XEvent *e){	Client *c;	XDestroyWindowEvent *ev = &e->xdestroywindow;	if((c = getclient(ev->window)))		unmanage(c);}static voidenternotify(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)		issel = True;}static voidleavenotify(XEvent *e){	XCrossingEvent *ev = &e->xcrossing;	if((ev->window == root) && !ev->same_screen)		issel = True;}static voidexpose(XEvent *e){	XExposeEvent *ev = &e->xexpose;	Client *c;	if(ev->count == 0) {		if(barwin == ev->window)			draw_bar();		else if((c = gettitle(ev->window)))			draw_client(c);	}}static voidkeymapnotify(XEvent *e){	update_keys();}static voidmaprequest(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 voidpropertynotify(XEvent *e){	XPropertyEvent *ev = &e->xproperty;	Window trans;	Client *c;	if(ev->state == PropertyDelete)		return; /* ignore */	if((c = getclient(ev->window))) {		if(ev->atom == wm_atom[WMProtocols]) {			c->proto = win_proto(c->win);			return;		}		switch (ev->atom) {			default: break;			case XA_WM_TRANSIENT_FOR:				XGetTransientForHint(dpy, c->win, &trans);				if(!c->floating && (c->floating = (trans != 0)))					arrange(NULL);				break;			case XA_WM_NORMAL_HINTS:				update_size(c);				break;		}		if(ev->atom == XA_WM_NAME || ev->atom == net_atom[NetWMName]) {			update_name(c);			draw_client(c);		}	}}static voidunmapnotify(XEvent *e){	Client *c;	XUnmapEvent *ev = &e->xunmap;	if((c = getclient(ev->window)))		unmanage(c);}
 |