summaryrefslogtreecommitdiffstats
path: root/.config/nvim/pywal/chadwal.py
diff options
context:
space:
mode:
Diffstat (limited to '.config/nvim/pywal/chadwal.py')
-rw-r--r--.config/nvim/pywal/chadwal.py120
1 files changed, 120 insertions, 0 deletions
diff --git a/.config/nvim/pywal/chadwal.py b/.config/nvim/pywal/chadwal.py
new file mode 100644
index 0000000..8b82b48
--- /dev/null
+++ b/.config/nvim/pywal/chadwal.py
@@ -0,0 +1,120 @@
+#!/usr/bin/env python3
+
+import os
+import shutil
+import sys
+import time
+import subprocess
+from watchdog.observers import Observer
+from watchdog.events import FileSystemEventHandler
+
+# Constants
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+HOME_DIR = os.path.expanduser("~")
+TEMPLATE_SRC = {
+ "dark": os.path.join(SCRIPT_DIR, "dark.lua"),
+ "light": os.path.join(SCRIPT_DIR, "light.lua"),
+}
+TEMPLATE_DST = {
+ "dark": f"{HOME_DIR}/.config/wal/templates/base46-dark.lua",
+ "light": f"{HOME_DIR}/.config/wal/templates/base46-light.lua",
+}
+CACHE_SRC = {
+ "dark": f"{HOME_DIR}/.cache/wal/base46-dark.lua",
+ "light": f"{HOME_DIR}/.cache/wal/base46-light.lua",
+}
+CACHE_DST = f"{HOME_DIR}/.local/share/nvim/lazy/base46/lua/base46/themes/chadwal.lua"
+FALLBACK_THEME = (
+ f"{HOME_DIR}/.local/share/nvim/lazy/base46/lua/base46/themes/gruvchad.lua"
+)
+LOCK_FILE = "/tmp/wal_nvim_lock"
+COLORS_FILE = f"{HOME_DIR}/.cache/wal/colors"
+
+
+# Utility functions
+def is_dark(hex_color):
+ """Determine if the color is dark based on luminance."""
+ hex_color = hex_color.lstrip("#")
+ r, g, b = (int(hex_color[i : i + 2], 16) for i in (0, 2, 4))
+ brightness = (r * 299 + g * 587 + b * 114) / 1000
+ return brightness < 128
+
+
+def get_hex_from_colors_file():
+ """Read the first color from the colors file."""
+ try:
+ with open(COLORS_FILE, "r") as file:
+ return file.readline().strip()
+ except FileNotFoundError:
+ sys.exit(f"Error: Colors file not found: {COLORS_FILE}")
+
+
+def acquire_lock():
+ """Create a lock file to prevent multiple instances."""
+ if os.path.exists(LOCK_FILE):
+ sys.exit("Another instance is already running. Exiting...")
+ open(LOCK_FILE, "w").close()
+
+
+def release_lock():
+ """Remove the lock file."""
+ if os.path.exists(LOCK_FILE):
+ os.remove(LOCK_FILE)
+
+
+def copy_file(src, dst, skip_if_exists=False):
+ """Copy a file from src to dst, optionally skipping if dst exists."""
+ if skip_if_exists and os.path.exists(dst):
+ print(f"File already exists at {dst}, skipping copy.")
+ return
+
+ try:
+ os.makedirs(os.path.dirname(dst), exist_ok=True)
+ shutil.copy(src, dst)
+ print(f"File copied from {src} to {dst}.")
+ except Exception as e:
+ sys.exit(f"Error copying file from {src} to {dst}: {e}")
+
+
+def on_file_modified():
+ """Handle file modifications based on current color scheme."""
+ is_dark_theme = is_dark(get_hex_from_colors_file())
+ mode = "dark" if is_dark_theme else "light"
+
+ copy_file(FALLBACK_THEME, CACHE_SRC[mode], skip_if_exists=True)
+ copy_file(TEMPLATE_SRC[mode], TEMPLATE_DST[mode])
+ copy_file(CACHE_SRC[mode], CACHE_DST)
+
+ subprocess.run(["killall", "-SIGUSR1", "nvim"])
+
+
+# Watchdog event handler
+class MyHandler(FileSystemEventHandler):
+ def on_modified(self, event):
+ if event.src_path == CACHE_SRC["dark"]:
+ on_file_modified()
+
+
+def monitor_file(file_path):
+ """Monitor the specified file for changes."""
+ event_handler = MyHandler()
+ observer = Observer()
+ observer.schedule(event_handler, os.path.dirname(file_path), recursive=False)
+ observer.start()
+
+ try:
+ while True:
+ time.sleep(1)
+ except KeyboardInterrupt:
+ observer.stop()
+ observer.join()
+
+
+if __name__ == "__main__":
+ on_file_modified()
+ acquire_lock()
+ try:
+ on_file_modified()
+ monitor_file(CACHE_SRC["dark"])
+ finally:
+ release_lock()