diff options
author | Justine Smithies <justine@smithies.me.uk> | 2023-08-22 19:35:23 +0100 |
---|---|---|
committer | Justine Smithies <justine@smithies.me.uk> | 2023-08-22 19:35:23 +0100 |
commit | 3058d6df77817de298a207d36b8b0871893c417a (patch) | |
tree | 2f3cbb973751e0f829ad3e00dd52bc5a081936d5 /.local/bin/qtile-window-switcher.py | |
parent | 1125d4a4ee25de42f3223d612a50a1256bd222d3 (diff) |
Initial commit
Diffstat (limited to '.local/bin/qtile-window-switcher.py')
-rwxr-xr-x | .local/bin/qtile-window-switcher.py | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/.local/bin/qtile-window-switcher.py b/.local/bin/qtile-window-switcher.py new file mode 100755 index 0000000..000a176 --- /dev/null +++ b/.local/bin/qtile-window-switcher.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +# +# Qtile window switcher for Wayland only +# +# Justine Smithies - 2021 +# +# Requirements are: qtile running under Wayland and fuzzel-git + +import subprocess +import os +import re +from libqtile.command.client import InteractiveCommandClient + +client = InteractiveCommandClient() +windows = client.windows() +# Get the number of open windows +lines = (len(windows)) +x = 0 +names = [] +ids = [] +groups = [] +appids = [] +while x < lines: + # client.window[window_id].focus() etc + win = windows[x] + name = win.get("name") + names.append(name) + id = win.get("id") + ids.append(id) + group = win.get("group") + groups.append(group) + appid = win.get("wm_class")[0] + appids.append(appid) + print(name, id, group, appid) + x += 1 +print(windows) + +# Reverse the tuples +ids = ids[::-1] +groups = groups[::-1] +names = names[::-1] +appids = appids[::-1] + +# Combine all the information into a string to be piped through rofi -dmenu +d = dict(os.environ) +outputs = [] +output = [] +icon = [] +x = 0 +print(lines) +while x < lines: + id = ids[x] + id = str(id) + appid = (appids[x]).strip('\n') + name = names[x] + # If name is > 40 characters then shorten it to max 40 and append ... + if len(name) > 40: + name = name[:40] + '...' + group = groups[x] + # Hacky fix to get correct icon for appids that begin with org. + if 'org.' in appid: + icon = appid.split(".") + icon = str(icon[2].lower()) + else: + icon = appid + output = ' ' + appid + ' - ' + name + ' on group: ' + group + ' (' + id + ')' + r'\0icon\x1f' + icon + '\n' + outputs.append(str(output)) + x += 1 + +outputs = ''.join(outputs) +# Remove last blank line +outputs = os.linesep.join([s for s in outputs.splitlines() if s]) +print(outputs) + +# Send options to rofi +d["OPTIONS"] = outputs +d["LINES"] = str(lines) +result = subprocess.Popen('echo -e "$OPTIONS" | fuzzel -d -w 100 -l $LINES', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=d) + +# Get selected option and process +selected_option = str(result.communicate()) +print(selected_option) +# Search for the content between the last set of brackets +selected_option = re.sub('^.*\((.*?)\)[^\(]*$', '\g<1>', selected_option) +print(selected_option) +if True in [char.isdigit() for char in selected_option]: + selected_option = int(selected_option) + client.window[selected_option].group.toscreen() + client.window[selected_option].focus() + exit() +else: + exit() |