parent
27c8542e48
commit
19bee17823
1 changed files with 106 additions and 0 deletions
@ -0,0 +1,106 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
|
||||||
|
import i3 |
||||||
|
import re |
||||||
|
import subprocess |
||||||
|
import getopt |
||||||
|
import sys |
||||||
|
import os |
||||||
|
|
||||||
|
|
||||||
|
def find_parent(window_id): |
||||||
|
""" |
||||||
|
Find the parent of a given window id |
||||||
|
""" |
||||||
|
root_window = i3.get_tree() |
||||||
|
result = [None] |
||||||
|
|
||||||
|
def finder(n, p=None): |
||||||
|
if result[0] is not None: |
||||||
|
return |
||||||
|
for node in n: |
||||||
|
if node['id'] == window_id: |
||||||
|
result[0] = p |
||||||
|
return |
||||||
|
if len(node['nodes']): |
||||||
|
finder(node['nodes'], node) |
||||||
|
|
||||||
|
finder(root_window['nodes']) |
||||||
|
return result[0] |
||||||
|
|
||||||
|
|
||||||
|
def set_layout(): |
||||||
|
""" |
||||||
|
Set the layout/split for the currently |
||||||
|
focused window to either vertical or |
||||||
|
horizontal, depending on its width/height |
||||||
|
""" |
||||||
|
current_win = i3.filter(nodes=[], focused=True) |
||||||
|
for win in current_win: |
||||||
|
parent = find_parent(win['id']) |
||||||
|
|
||||||
|
if (parent and "rect" in parent |
||||||
|
and parent['layout'] != 'tabbed' |
||||||
|
and parent['layout'] != 'stacked'): |
||||||
|
height = parent['rect']['height'] |
||||||
|
width = parent['rect']['width'] |
||||||
|
|
||||||
|
if height > width: |
||||||
|
new_layout = 'vertical' |
||||||
|
else: |
||||||
|
new_layout = 'horizontal' |
||||||
|
|
||||||
|
i3.split(new_layout) |
||||||
|
|
||||||
|
|
||||||
|
def print_help(): |
||||||
|
print("Usage: " + sys.argv[0] + " [-p path/to/pid.file]") |
||||||
|
print("") |
||||||
|
print("Options:") |
||||||
|
print(" -p path/to/pid.file Saves the PID for this program in the filename specified") |
||||||
|
print("") |
||||||
|
|
||||||
|
|
||||||
|
def main(): |
||||||
|
""" |
||||||
|
Main function - listen for window focus |
||||||
|
changes and call set_layout when focus |
||||||
|
changes |
||||||
|
""" |
||||||
|
opt_list, args = getopt.getopt(sys.argv[1:], 'hp:') |
||||||
|
pid_file = None |
||||||
|
for opt in opt_list: |
||||||
|
if opt[0] == "-h": |
||||||
|
print_help() |
||||||
|
sys.exit() |
||||||
|
if opt[0] == "-p": |
||||||
|
pid_file = opt[1] |
||||||
|
|
||||||
|
if pid_file: |
||||||
|
with open(pid_file, 'w') as f: |
||||||
|
f.write(str(os.getpid())) |
||||||
|
|
||||||
|
|
||||||
|
process = subprocess.Popen( |
||||||
|
['xprop', '-root', '-spy'], |
||||||
|
stdout=subprocess.PIPE, |
||||||
|
stderr=subprocess.PIPE |
||||||
|
) |
||||||
|
regex = re.compile(b'^_NET_CLIENT_LIST_STACKING|^_NET_ACTIVE_WINDOW') |
||||||
|
|
||||||
|
last_line = "" |
||||||
|
while True: |
||||||
|
line = process.stdout.readline() |
||||||
|
if line == b'': #X is dead |
||||||
|
break |
||||||
|
if line == last_line: |
||||||
|
continue |
||||||
|
if regex.match(line): |
||||||
|
set_layout() |
||||||
|
last_line = line |
||||||
|
|
||||||
|
process.kill() |
||||||
|
sys.exit() |
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
main() |
Loading…
Reference in new issue