all repos — dwm @ 10bc0ce912eb99fec49d954c80d92e04429ed0ee

fork of suckless dynamic window manager

layout.c (view raw)

  1/* See LICENSE file for copyright and license details. */
  2#include "dwm.h"
  3#include <stdlib.h>
  4
  5/* static */
  6
  7typedef struct {
  8	const char *symbol;
  9	void (*arrange)(void);
 10} Layout;
 11
 12unsigned int blw = 0;
 13static Layout *lt = NULL;
 14
 15static void
 16floating(void) { /* default floating layout */
 17	Client *c;
 18
 19	for(c = clients; c; c = c->next)
 20		if(isvisible(c))
 21			resize(c, c->x, c->y, c->w, c->h, True);
 22}
 23
 24static unsigned int nlayouts = 0;
 25
 26LAYOUTS
 27
 28/* extern */
 29
 30void
 31arrange(void) {
 32	Client *c;
 33
 34	for(c = clients; c; c = c->next)
 35		if(isvisible(c))
 36			unban(c);
 37		else
 38			ban(c);
 39	lt->arrange();
 40	focus(NULL);
 41	restack();
 42}
 43
 44void
 45focusnext(const char *arg) {
 46	Client *c;
 47
 48	if(!sel)
 49		return;
 50	for(c = sel->next; c && !isvisible(c); c = c->next);
 51	if(!c)
 52		for(c = clients; c && !isvisible(c); c = c->next);
 53	if(c) {
 54		focus(c);
 55		restack();
 56	}
 57}
 58
 59void
 60focusprev(const char *arg) {
 61	Client *c;
 62
 63	if(!sel)
 64		return;
 65	for(c = sel->prev; c && !isvisible(c); c = c->prev);
 66	if(!c) {
 67		for(c = clients; c && c->next; c = c->next);
 68		for(; c && !isvisible(c); c = c->prev);
 69	}
 70	if(c) {
 71		focus(c);
 72		restack();
 73	}
 74}
 75
 76const char *
 77getsymbol(void)
 78{
 79	return lt->symbol;
 80}
 81
 82Bool
 83isfloating(void) {
 84	return lt->arrange == floating;
 85}
 86
 87Bool
 88isarrange(void (*func)())
 89{
 90	return func == lt->arrange;
 91}
 92
 93void
 94initlayouts(void) {
 95	unsigned int i, w;
 96
 97	lt = &layout[0];
 98	nlayouts = sizeof layout / sizeof layout[0];
 99	for(blw = i = 0; i < nlayouts; i++) {
100		w = textw(layout[i].symbol);
101		if(w > blw)
102			blw = w;
103	}
104}
105
106Client *
107nexttiled(Client *c) {
108	for(; c && (c->isfloating || !isvisible(c)); c = c->next);
109	return c;
110}
111
112void
113restack(void) {
114	Client *c;
115	XEvent ev;
116	XWindowChanges wc;
117
118	drawstatus();
119	if(!sel)
120		return;
121	if(sel->isfloating || lt->arrange == floating)
122		XRaiseWindow(dpy, sel->win);
123	if(lt->arrange != floating) {
124		wc.stack_mode = Below;
125		wc.sibling = barwin;
126		if(!sel->isfloating) {
127			XConfigureWindow(dpy, sel->win, CWSibling | CWStackMode, &wc);
128			wc.sibling = sel->win;
129		}
130		for(c = nexttiled(clients); c; c = nexttiled(c->next)) {
131			if(c == sel)
132				continue;
133			XConfigureWindow(dpy, c->win, CWSibling | CWStackMode, &wc);
134			wc.sibling = c->win;
135		}
136	}
137	XSync(dpy, False);
138	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
139}
140
141void
142setlayout(const char *arg) {
143	int i;
144
145	if(!arg) {
146		lt++;
147		if(lt == layout + nlayouts)
148			lt = layout;
149	}
150	else {
151		i = atoi(arg);
152		if(i < 0 || i >= nlayouts)
153			return;
154		lt = &layout[i];
155	}
156	if(sel)
157		arrange();
158	else
159		drawstatus();
160}
161
162void
163togglebar(const char *arg) {
164	if(bpos == BarOff)
165		bpos = (BARPOS == BarOff) ? BarTop : BARPOS;
166	else
167		bpos = BarOff;
168	updatebarpos();
169	arrange();
170}
171
172void
173togglemax(const char *arg) {
174	XEvent ev;
175
176	if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed)
177		return;
178	if((sel->ismax = !sel->ismax)) {
179		sel->rx = sel->x;
180		sel->ry = sel->y;
181		sel->rw = sel->w;
182		sel->rh = sel->h;
183		resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * sel->border, True);
184	}
185	else
186		resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
187	drawstatus();
188	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
189}