summaryrefslogtreecommitdiffhomepage
path: root/patch/scratchpad.c
blob: c0c18738bb50909148da0de282d8305deabb511f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void
togglescratch(const Arg *arg)
{
	Client *c = NULL;
	Monitor *mon;
	unsigned int found = 0;
	unsigned int scratchtag = SPTAG(arg->ui);
	Arg sparg = {.v = scratchpads[arg->ui].cmd};

	for (mon = mons; mon && !found; mon = mon->next)
		for (c = mon->clients; c && !(found = c->tags & scratchtag); c = c->next);

	if (found) {
		if (c->mon != selmon) {
			if (c->mon->tagset[c->mon->seltags] & SPTAGMASK)
				c->mon->tagset[c->mon->seltags] ^= scratchtag;
			sendmon(c, selmon);
		}

		unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag;
		if (newtagset) {
			selmon->tagset[selmon->seltags] = newtagset;
			focus(NULL);
			arrange(selmon);
		}
		if (ISVISIBLE(c)) {
			focus(c);
			restack(selmon);
		}
	} else {
		selmon->tagset[selmon->seltags] |= scratchtag;
		spawn(&sparg);
	}
}