Files

136 lines
4.1 KiB
Python
Executable File

#!/usr/bin/python3
import argparse
import os
import sys
import subprocess
import json
# Check if first arg is colour
waybar = {}
waybar["SELECTED"] = '<span underline="low">'
waybar["DEFAULT"] = '<span foreground="#ffffff">'
waybar["WHITE"]='<span foreground="#ffffff">'
waybar["RED"]='<span foreground="#ff0000">'
waybar["GREEN"]='<span foreground="#60d090">'
waybar["YELLOW"]='<span foreground="#ffff00">'
waybar["BLUE"]='<span foreground="#0000ff">'
waybar["NC"]='</span>'
shell = {}
shell["SELECTED"]='\033[0;32m'
shell["WHITE"]='\033[0;37m'
shell["RED"]='\033[0;31m'
shell["GREEN"]='\033[0;32m'
shell["YELLOW"]='\033[0;33m'
shell["BLUE"]='\033[0;34m'
shell["NC"]='\033[0m'
def get_info():
state = subprocess.run(["hyprctl", "printstate"], capture_output=True, text=True)
state = state.stdout.splitlines()
state.pop(0) # Remove the first line
info = {}
while True:
if len(state) == 0:
break
line = state.pop(0)
if line == "":
continue
if "-" not in line:
break
key, value = line.split(": ")
key = key.strip().removeprefix("-").strip()
value = value.strip()
desk_id = value
info[desk_id] = {"name": key}
for i in range(4):
line = state.pop(0)
if line == "":
break
line = line.split(": ")
if len(line) == 2:
key, value = line
key = key.strip()
value = value.strip()
info[desk_id][key] = value
return info
def get_icon(desk_name, focused=False):
# Get the icon for the desk
icon = ""
desk_name = desk_name.strip().lower()
if desk_name == "coding":
return ""
if desk_name == "web" or desk_name == "internet":
return "󰖟"
if desk_name == "social":
return "󰭻"
return "" if focused else ""
if __name__ == "__main__":
# Check for arguments
parser = argparse.ArgumentParser(description="hyprland desk script")
parser.add_argument("-d", "--desk", type=int, help="Desk number to switch to")
parser.add_argument("-w", "--waybar", action="store_true", help="Waybar mode")
parser.add_argument("-i", "--info", action="store_true", help="Info mode")
parser.add_argument("-v", "--verbose", action="store_true", help="Verbose mode")
args = parser.parse_args()
if args.waybar or args.info:
colours = waybar if args.waybar else shell
# Get info from hyprctl printstate
info = get_info()
output = ""
if args.desk:
desk_num = args.desk
if str(desk_num) not in info:
print(f"Desk {desk_num} does not exist")
sys.exit(1)
desk = info[str(desk_num)]
if args.verbose:
print(desk)
if desk["Populated"] == "false" and desk["Focused"] == "false":
print(f"Desk {desk_num} is empty")
sys.exit(1)
if desk["Focused"] == "true":
output += f"{colours['SELECTED']} {desk_num}: {get_icon(desk['name'],True)} {colours['NC']} "
else:
output += f"{colours["DEFAULT"]} {desk_num}: {get_icon(desk['name'])} {colours['NC']} "
print(output)
sys.exit(0)
for i in range(1, int(max(info.keys()))+1):
if str(i) not in info:
continue
desk = info[str(i)]
if desk["Populated"] == "false" and desk["Focused"] == "false":
continue
if args.verbose:
print(desk)
if desk["Focused"] == "true":
output += f"{colours['SELECTED']} {get_icon(desk['name'],True)} {colours['NC']} "
else:
output += f"{colours["DEFAULT"]} {get_icon(desk['name'])} {colours['NC']} "
print(output)
sys.exit(0)
if args.desk:
# Switch to desk
if args.verbose:
print(f"Switching to desk {args.desk}")
subprocess.run(["hyprctl", "dispatch", "vdesk", str(args.desk)])
sys.exit(0)