diff options
| -rw-r--r-- | client.c | 62 | ||||
| -rw-r--r-- | dwm.h | 4 | ||||
| -rw-r--r-- | event.c | 14 | ||||
| -rw-r--r-- | layout.c | 16 | 
4 files changed, 56 insertions, 40 deletions
| @@ -97,6 +97,14 @@ attach(Client *c) {  }  void +ban(Client *c) { +	if (c->isbanned) +		return; +	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); +	c->isbanned = True; +} + +void  configure(Client *c) {  	XConfigureEvent ce; @@ -299,6 +307,37 @@ togglefloating(const char *arg) {  }  void +unban(Client *c) { +	if (!c->isbanned) +		return; +	XMoveWindow(dpy, c->win, c->x, c->y); +	c->isbanned = False; +} + +void +unmanage(Client *c) { +	XWindowChanges wc; + +	wc.border_width = c->oldborder; +	/* The server grab construct avoids race conditions. */ +	XGrabServer(dpy); +	XSetErrorHandler(xerrordummy); +	XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ +	detach(c); +	detachstack(c); +	if(sel == c) +		focus(NULL); +	XUngrabButton(dpy, AnyButton, AnyModifier, c->win); +	setclientstate(c, WithdrawnState); +	free(c->tags); +	free(c); +	XSync(dpy, False); +	XSetErrorHandler(xerror); +	XUngrabServer(dpy); +	lt->arrange(); +} + +void  updatesizehints(Client *c) {  	long msize;  	XSizeHints size; @@ -376,26 +415,3 @@ updatetitle(Client *c) {  	c->name[sizeof c->name - 1] = '\0';  	XFree(name.value);  } - -void -unmanage(Client *c) { -	XWindowChanges wc; - -	wc.border_width = c->oldborder; -	/* The server grab construct avoids race conditions. */ -	XGrabServer(dpy); -	XSetErrorHandler(xerrordummy); -	XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ -	detach(c); -	detachstack(c); -	if(sel == c) -		focus(NULL); -	XUngrabButton(dpy, AnyButton, AnyModifier, c->win); -	setclientstate(c, WithdrawnState); -	free(c->tags); -	free(c); -	XSync(dpy, False); -	XSetErrorHandler(xerror); -	XUngrabServer(dpy); -	lt->arrange(); -} @@ -96,6 +96,7 @@ extern Window root, barwin;  /* client.c */  void attach(Client *c);			/* attaches c to global client list */ +void ban(Client *c);			/* bans c */  void configure(Client *c);		/* send synthetic configure event */  void detach(Client *c);			/* detaches c from global client list */  void focus(Client *c);			/* focus c if visible && !NULL, or focus top visible */ @@ -104,9 +105,10 @@ void manage(Window w, XWindowAttributes *wa);	/* manage new client */  void resize(Client *c, int x, int y,  		int w, int h, Bool sizehints);	/* resize with given coordinates c*/  void togglefloating(const char *arg);	/* toggles sel between floating/tiled state */ +void unban(Client *c);			/* unbans c */ +void unmanage(Client *c);		/* destroy c */  void updatesizehints(Client *c);	/* update the size hint variables of c */  void updatetitle(Client *c);		/* update the name of c */ -void unmanage(Client *c);		/* destroy c */  /* draw.c */  void drawstatus(void);			/* draw the bar */ @@ -225,6 +225,19 @@ configurenotify(XEvent *e) {  }  static void +createnotify(XEvent *e) { +	static XWindowAttributes wa; +	XCreateWindowEvent *ev = &e->xcreatewindow; + +	if(!XGetWindowAttributes(dpy, ev->window, &wa)) +		return; +	if(wa.override_redirect) +		return; +	if(!getclient(ev->window) && (wa.map_state == IsViewable)) +		manage(ev->window, &wa); +} + +static void  destroynotify(XEvent *e) {  	Client *c;  	XDestroyWindowEvent *ev = &e->xdestroywindow; @@ -350,6 +363,7 @@ void (*handler[LASTEvent]) (XEvent *) = {  	[ButtonPress] = buttonpress,  	[ConfigureRequest] = configurerequest,  	[ConfigureNotify] = configurenotify, +	[CreateNotify] = createnotify,  	[DestroyNotify] = destroynotify,  	[EnterNotify] = enternotify,  	[LeaveNotify] = leavenotify, @@ -12,22 +12,6 @@ static unsigned int masterw = MASTERWIDTH;  static unsigned int nmaster = NMASTER;  static void -ban(Client *c) { -	if (c->isbanned) -		return; -	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); -	c->isbanned = True; -} - -static void -unban(Client *c) { -	if (!c->isbanned) -		return; -	XMoveWindow(dpy, c->win, c->x, c->y); -	c->isbanned = False; -} - -static void  tile(void) {  	unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;  	Client *c; | 
