i3 improvements wip
[distro-setup] / i3-split-push
diff --git a/i3-split-push b/i3-split-push
new file mode 100755 (executable)
index 0000000..a9f76e5
--- /dev/null
@@ -0,0 +1,87 @@
+#!/usr/bin/python3
+
+# There are only 2 cases where I want single window split containers.
+#
+# * just before creating a new window in it.
+#
+# * When I want to make 1 window a split container and bring an existing
+# window into it. In vanilla i3, this is super awkward. Usually, you are
+# starting out focused on the window you want to move into the
+# container. So, you focus the window which is to become a container,
+# split it, focus the window you want to join the container, move it
+# into that container. 4 actions, totally annoying. Lets simplify this
+# to 2 actions, a key to say what split we want, then a key to say which
+# direction to move the current window. Since we have a hook that erases
+# all single window split containers on focus change, we can consider a
+# single window split container to indicate the split we want.
+
+import sys
+from i3ipc import Connection, Event
+# for debugging
+from pprint import pprint
+import os
+
+
+def find_parent(i3, window_id):
+    """
+        Find the parent of a given window id
+    """
+
+    def finder(con, parent, gp):
+        if con.id == window_id:
+            return (parent, gp)
+        for node in con.nodes:
+            res = finder(node, con, parent)
+            if res:
+                return res
+        return None
+
+    return finder(i3.get_tree(), None, None)
+
+
+def set_layout(i3):
+    """
+        Set the layout/split for the currently
+        focused window to either vertical or
+        horizontal, depending on its width/height
+    """
+
+    direction = sys.argv[1]
+
+    win = i3.get_tree().find_focused()
+    parent, gp = find_parent(i3, win.id)
+    layout = parent.layout
+
+    if (parent and gp and len(parent.nodes) == 1):
+        i3.command('focus ' + direction)
+
+        exists = False
+        if os.path.exists('/tmp/iank-i3-no-auto'):
+            exists = True
+        else:
+            open('/tmp/iank-i3-no-auto', 'a')
+
+        if (layout == 'splith'):
+            i3.command('split horizontal')
+        elif (layout == 'splitv'):
+            i3.command('split vertical')
+        elif (layout == 'tabbed'):
+            i3.command('split vertical')
+            i3.command('layout tabbed')
+
+        i3.command('[con_id=%s] focus' % win.id)
+        i3.command('move ' + direction)
+        if (not exists):
+            os.remove('/tmp/iank-i3-no-auto')
+    else:
+        i3.command('move ' + direction)
+
+
+
+def main():
+    i3 = Connection()
+    set_layout(i3)
+
+
+if __name__ == "__main__":
+    main()