87 lines
2.2 KiB
Python
Executable File
87 lines
2.2 KiB
Python
Executable File
#!/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()
|