summaryrefslogtreecommitdiff
path: root/push.c
diff options
context:
space:
mode:
Diffstat (limited to 'push.c')
-rw-r--r--push.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/push.c b/push.c
new file mode 100644
index 0000000..26ed462
--- /dev/null
+++ b/push.c
@@ -0,0 +1,63 @@
+static Client *
+nexttiled(Client *sel) {
+ Client *c;
+ wl_list_for_each(c, &sel->link, link) {
+ if (&c->link == &clients)
+ break; /* don't wrap */
+ if (!c->isfloating && VISIBLEON(c, selmon))
+ return c;
+ }
+ return NULL;
+}
+
+static Client *
+prevtiled(Client *sel) {
+ Client *c;
+ wl_list_for_each_reverse(c, &sel->link, link) {
+ if (&c->link == &clients)
+ break; /* don't wrap */
+ if (!c->isfloating && VISIBLEON(c, selmon))
+ return c;
+ }
+ return NULL;
+}
+
+static void
+pushup(const Arg *arg) {
+ Client *sel = selclient();
+ Client *c;
+
+ if(!sel || sel->isfloating)
+ return;
+ if((c = prevtiled(sel))) {
+ /* attach before c */
+ wl_list_remove(&sel->link);
+ wl_list_insert(c->link.prev, &sel->link);
+ } else {
+ /* move to the end */
+ wl_list_remove(&sel->link);
+ wl_list_insert(clients.prev, &sel->link);
+ }
+ focusclient(sel, 1);
+ arrange(selmon);
+}
+
+static void
+pushdown(const Arg *arg) {
+ Client *sel = selclient();
+ Client *c;
+
+ if(!sel || sel->isfloating)
+ return;
+ if((c = nexttiled(sel))) {
+ /* attach after c */
+ wl_list_remove(&sel->link);
+ wl_list_insert(&c->link, &sel->link);
+ } else {
+ /* move to the front */
+ wl_list_remove(&sel->link);
+ wl_list_insert(&clients, &sel->link);
+ }
+ focusclient(sel, 1);
+ arrange(selmon);
+}