hyprland-void-dots/hypr-configs/hyprland/eww/scripts/tasklist.py
2024-06-27 18:05:57 +03:30

123 lines
3.1 KiB
Python
Executable file

#!/usr/bin/env python3
from iconfetch import fetch
import subprocess
import json
import os
import i3ipc
eww_bin= [subprocess.getoutput("which eww"), "-c", f"{os.getcwd()}"]
def recurse(apps, workspace, output):
for l in workspace.descendants():
if not l.pid or not l.app_id:
continue
app_id = l.app_id.lower()
if app_id == "com.github.xournalpp.xournalpp":
app_id = "xournalpp"
rect = {
"x": 0,
"y": 0,
"width": 0,
"height": 0
}
rect["x"] = l.rect.x - output.rect.x
rect["y"] = l.rect.y - output.rect.y
rect["width"] = l.rect.width * 1920/output.rect.width
rect["height"] = l.rect.height * 1080/output.rect.height
rect["x"] *= 1920/output.rect.width
rect["y"] *= 1080/output.rect.height
apps.append({
"app_id": app_id,
"name": l.name,
"pid": l.pid,
"focused": l.focused,
"rect": rect,
"path": fetch(app_id) or fetch("unknown")
})
def update(i3, e):
root = i3.get_tree()
apps = []
windows = [[] for _ in range(10)]
for output in root.nodes:
if output.name == "__i3":
continue
for workspace in output.nodes:
found = []
recurse(found, workspace, output)
apps.extend(found)
# if output["name"] == "eDP-1":
# windows[int(workspace["name"])-1] = found
windows[int(workspace.name)-1] = found
# change this yourself lol
appsdict = {
"firefox": [],
"thunar": [],
"xournalpp": [],
"discord": [],
"foot": []
}
# translate to launch cmd
appsexec = {
"discord": "discord-wayland",
"xournalpp": "com.github.xournalpp.xournalpp",
"foot": "org.codeberg.dnkl.foot",
}
appsjson = []
for app in apps:
a = app.copy()
name = a["app_id"]
if name not in appsdict:
appsdict[name] = []
appsdict[name].append(a)
for key, value in appsdict.items():
if len(value) == 0:
appsjson.append(dict(
path = fetch(key),
name = key,
app_id = key if key not in appsexec else appsexec[key],
pid = None,
focused = []
))
else:
f = []
for v in value:
f.append(v["focused"])
appsjson.append(dict(
path = value[0]["path"],
name = value[0]["name"],
app_id = value[0]["app_id"].lower(),
pid = value[0]["pid"],
focused = f
))
subprocess.run(eww_bin + ["update", f"windows={json.dumps(windows)}"])
subprocess.run(eww_bin + ["update", f"tasksjson={json.dumps(appsjson)}"])
def main():
i3 = i3ipc.Connection(auto_reconnect=True)
update(i3, None)
i3.on(i3ipc.Event.WINDOW, update)
i3.main()
if __name__ == "__main__":
main()