config/eww/bar/scripts/get-workspaces

87 lines
2.2 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env python
"""
Utility to generate the workspace buttons for eww bar widget.
Currently it fetches information from monitor 0. If all monitors have
synchronised workspaces this should not be a problem.
"""
import os, sys, socket, json
WORKSPACE_ICONS = [
(1, '☱'),
(2, '☲'),
(3, '☳'),
(4, '☴'),
(5, '☵'),
(6, '☶'),
(7, '☷'),
(8, '☰'),
]
EXTRA_WORKSPACE_ICONS = [
(0, '⚌'),
(1, '⚍'),
(2, '⚎'),
(3, '⚏'),
]
def get_workspace_info():
workspaces = json.loads(os.popen('hyprctl workspaces -j').read())
monitors = json.loads(os.popen('hyprctl monitors -j').read())
if not monitors:
print("No monitor found!", file=sys.stderr)
return []
monitor, active = [(m['name'], m['activeWorkspace']['id'])
for m in monitors if m['id'] == 0][0]
workspaces = [(w['id'], w['id'] == active)
for w in workspaces
if w['monitor'] == monitor]
return workspaces
def get_widgets():
# get all workspace keys
workspaces = {k: v for k, v in get_workspace_info()}
def get_class(k):
key = workspaces.get(k, None)
if key is None:
return 'inactive'
elif key:
return 'focused'
else:
return 'active'
buttons = [
f'"id": "{k}", "text": "{icon}", "class": "{get_class(k)}"'
for k, icon in WORKSPACE_ICONS
]
buttons = ', '.join(['{' + b + '}' for b in buttons])
return '[' + buttons + ']'
def listen():
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
KEY = 'HYPRLAND_INSTANCE_SIGNATURE'
signature = os.environ.get(KEY, None)
if signature is None:
print("Hyprland variable uninitialised.", file=sys.stderr)
return
server_address = f"/tmp/hypr/{signature}/.socket2.sock"
try:
sock.connect(server_address)
except:
print(f"Could not connect to {server_address}", file=sys.stderr)
raise
# The flush here is very important since python by default buffers!
print(get_widgets(), flush=True)
while sock:
data = sock.recv(1024)
if b'workspace' in data:
print(get_widgets(), flush=True)
listen()