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);
}