nixos-flake/home-manager/jwm/ptray/state.py

85 lines
3 KiB
Python

import os
from config import STATE_DIR
def format_path(name, property):
return '{}/{}/{}'.format(STATE_DIR, name, property)
def write_file(dir, basename, content):
os.makedirs('{}/{}'.format(STATE_DIR, dir), exist_ok=True)
path = format_path(dir, basename)
with open(path, 'w') as f:
f.write(content)
def open_file(dir, basename):
path = format_path(dir, basename)
return open(path, 'r')
def add_window(tracking: dict, name, window_id: str):
new_dict = tracking.copy()
new_dict[name] = new_dict.get(name, set()) | {window_id}
return new_dict
def remove_window(tracking: dict, name, window_id: str):
new_dict = tracking.copy()
new_dict[name] = new_dict.get(name, set()) - {window_id}
return new_dict
def read_config(path):
with open(path, 'r') as f:
config = json.load(f)
return config
class StateWriter:
tracked_ids = None
visible_ids = None
config = None
def __init__(self, config):
self.config = config
self.tracked_ids = {name: set() for name in config['items'].keys()}
self.visible_ids = {name: set() for name in config['items'].keys()}
self.tiled_ids = {name: set() for name in config['items'].keys()}
for name, defn in config['items'].items():
write_file(name, 'exec', defn['exec'])
write_file(name, 'status', '')
write_file(name, 'window_ids', '')
def update_window_state(self, name):
if len(self.visible_ids[name]) != 0:
write_file(name, 'status', 'fg')
elif len(self.tracked_ids[name]) != 0:
write_file(name, 'status', 'bg')
else:
write_file(name, 'status', '')
write_file(name, 'window_ids', '\n'.join(self.tracked_ids[name]))
write_file(name, 'tiled_ids', '\n'.join(self.tiled_ids[name]))
def on_visible(self, item_name, window_id, tiled=False):
self.visible_ids[item_name] = self.visible_ids[item_name] | {window_id}
self.update_window_state(item_name)
def on_invisible(self, item_name, window_id):
self.visible_ids[item_name] = self.visible_ids[item_name] - {window_id}
self.update_window_state(item_name)
def on_create(self, item_name, window_id):
self.tracked_ids[item_name] = self.tracked_ids[item_name] | {window_id}
self.update_window_state(item_name)
def on_destroy(self, item_name, window_id):
self.tracked_ids[item_name] = self.tracked_ids[item_name] - {window_id}
self.visible_ids[item_name] = self.visible_ids[item_name] - {window_id}
self.tiled_ids[item_name] = self.tiled_ids[item_name] - {window_id}
self.update_window_state(item_name)
def on_tile(self, item_name, window_id):
self.tiled_ids[item_name] = self.tiled_ids[item_name] | {window_id}
self.update_window_state(item_name)
def on_float(self, item_name, window_id):
self.tiled_ids[item_name] = self.tiled_ids[item_name] - {window_id}
self.update_window_state(item_name)