summaryrefslogtreecommitdiff
path: root/patch/push.c
blob: 9410e61dcec73d557a9967ee6c6f9ac093b7c2fe (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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
static Client *
nextc(Client *c, float f)
{
	if (!f)
		return nexttiled(c);

	for (; c && !ISVISIBLE(c); c = c->next);
	return c;
}

static Client *
prevc(Client *c, float f)
{
	Client *p, *r;

	for (p = selmon->clients, r = NULL; c && p && p != c; p = p->next)
		if ((f || !p->isfloating) && ISVISIBLE(p))
			r = p;
	return r;
}

static void
pushup(const Arg *arg)
{
	Client *sel = selmon->sel;
	Client *c;

	if (!sel || (sel->isfloating && !arg->f))
		return;
	if ((c = prevc(sel, arg->f))) {
		/* attach before c */
		detach(sel);
		sel->next = c;
		if (selmon->clients == c)
			selmon->clients = sel;
		else {
			for (c = selmon->clients; c->next != sel->next; c = c->next);
			c->next = sel;
		}
	} else {
		/* move to the end */
		for (c = sel; c->next; c = c->next);
		detach(sel);
		sel->next = NULL;
		c->next = sel;
	}
	focus(sel);
	arrange(selmon);
}

static void
pushdown(const Arg *arg)
{
	Client *sel = selmon->sel;
	Client *c;

	if (!sel || (sel->isfloating && !arg->f))
		return;
	if ((c = nextc(sel->next, arg->f))) {
		/* attach after c */
		detach(sel);
		sel->next = c->next;
		c->next = sel;
	} else {
		/* move to the front */
		detach(sel);
		attach(sel);
	}
	focus(sel);
	arrange(selmon);
}