147 lines
4.2 KiB
Python
147 lines
4.2 KiB
Python
#!/usr/bin/env python3
|
|
|
|
"""
|
|
This command has two purposes:
|
|
|
|
1. Execute commands from ~./config/nwg-panel/autostart-dwl.sh file (if found);
|
|
2. save data provided by dwl (title, tags, layout for each output) to the cache file
|
|
in json format, for further use by the dwl module.
|
|
|
|
You need to start dwl with `dwl -s nwg-dwl-interface`.
|
|
"""
|
|
|
|
import subprocess
|
|
import fileinput
|
|
import os
|
|
import sys
|
|
import json
|
|
from time import sleep
|
|
|
|
|
|
def is_command(cmd):
|
|
cmd = cmd.split()[0] # strip arguments
|
|
cmd = "command -v {}".format(cmd)
|
|
try:
|
|
is_cmd = subprocess.check_output(cmd, shell=True).decode("utf-8").strip()
|
|
if is_cmd:
|
|
return True
|
|
|
|
except subprocess.CalledProcessError:
|
|
return False
|
|
|
|
|
|
def list_outputs():
|
|
print("Checking outputs...")
|
|
outputs = []
|
|
if is_command("wlr-randr"):
|
|
lines = subprocess.check_output("wlr-randr", shell=True).decode("utf-8").strip().splitlines()
|
|
for line in lines:
|
|
if not line.startswith(" "):
|
|
name = line.split()[0]
|
|
print(name)
|
|
outputs.append(name)
|
|
else:
|
|
print("Missing wlr-randr dependency")
|
|
return outputs
|
|
|
|
|
|
def get_cache_dir():
|
|
if os.getenv("XDG_CACHE_HOME"):
|
|
return os.getenv("XDG_CACHE_HOME")
|
|
elif os.getenv("HOME") and os.path.isdir(os.path.join(os.getenv("HOME"), ".cache")):
|
|
return os.path.join(os.getenv("HOME"), ".cache")
|
|
else:
|
|
return None
|
|
|
|
|
|
def get_config_dir():
|
|
xdg_config_home = os.getenv('XDG_CONFIG_HOME')
|
|
config_home = xdg_config_home if xdg_config_home else os.path.join(os.getenv("HOME"), ".config")
|
|
config_dir = os.path.join(config_home, "nwg-panel")
|
|
if os.path.isdir(config_dir):
|
|
return config_dir
|
|
else:
|
|
return None
|
|
|
|
|
|
def main():
|
|
refresh_signal = os.getenv("SIG") if os.getenv("SIG") else 10
|
|
|
|
outputs = list_outputs()
|
|
if len(outputs) > 0:
|
|
num_lines = len(outputs) * 4
|
|
else:
|
|
print("No output detected, terminating")
|
|
sys.exit(1)
|
|
|
|
data = {}
|
|
|
|
# Determine output file location
|
|
cache_dir = get_cache_dir()
|
|
if not cache_dir:
|
|
print("Couldn't detect cache directory")
|
|
sys.exit(1)
|
|
else:
|
|
output_file = os.path.join(cache_dir, "nwg-dwl-data")
|
|
|
|
# Run autostart script if present
|
|
config_dir = get_config_dir()
|
|
if not config_dir:
|
|
print("Couldn't detect nwg-panel config directory")
|
|
else:
|
|
autostart = os.path.join(config_dir, "autostart-dwl.sh")
|
|
if os.path.isfile(autostart):
|
|
print("Running {}".format(autostart))
|
|
os.system(autostart)
|
|
|
|
sleep(1)
|
|
|
|
# remove stale data file, if any
|
|
if os.path.isfile(output_file):
|
|
os.remove(output_file)
|
|
|
|
# read stdin, parse data, save in json format
|
|
cnt = 0
|
|
print("num_lines = {}".format(num_lines))
|
|
for line in fileinput.input():
|
|
parts = line.split()
|
|
|
|
output = parts[0]
|
|
if output not in data:
|
|
data[output] = {}
|
|
|
|
if parts[1] == "title":
|
|
if len(parts) >= 3:
|
|
title = ' '.join(parts[2:])
|
|
if "title" not in data[output] or data[output]["title"] != title:
|
|
data[output]["title"] = title
|
|
else:
|
|
if "title" not in data[output] or data[output]["title"] != "":
|
|
data[output]["title"] = ""
|
|
|
|
elif parts[1] == "selmon":
|
|
if "selmon" not in data[output] or data[output]["selmon"] != parts[2]:
|
|
data[output]["selmon"] = parts[2]
|
|
|
|
elif parts[1] == "tags":
|
|
tags = line.split("{} tags".format(output))[1].strip()
|
|
if "tags" not in data[output] or data[output]["tags"] != tags:
|
|
data[output]["tags"] = tags
|
|
|
|
elif parts[1] == "layout":
|
|
if "layout" not in data[output] or data[output]["layout"] != parts[2]:
|
|
data[output]["layout"] = parts[2]
|
|
|
|
cnt += 1
|
|
|
|
if cnt == num_lines:
|
|
with open(output_file, 'w') as fp:
|
|
json.dump(data, fp, indent=4)
|
|
|
|
subprocess.Popen("pkill -f -{} nwg-panel".format(refresh_signal), shell=True)
|
|
cnt = 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|