X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=i3-split-push;fp=i3-split-push;h=a9f76e52afece96693ddfb3b876b0d56d289de76;hb=dab96f8fa4c701db13ba734fa0c07b5d12fc8fae;hp=0000000000000000000000000000000000000000;hpb=e6cd2e555df3af0cf23da016b833529a34ffc84c;p=distro-setup diff --git a/i3-split-push b/i3-split-push new file mode 100755 index 0000000..a9f76e5 --- /dev/null +++ b/i3-split-push @@ -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()