diff --git a/.gitignore b/.gitignore index 4dcd5a6..37de0a3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ key.txt + +__pycache__/ diff --git a/duskwm/.Xresources b/duskwm/.Xresources new file mode 100644 index 0000000..ba04bce --- /dev/null +++ b/duskwm/.Xresources @@ -0,0 +1,8 @@ +! osc-52 support +*.allowWindowOps: true + +#include "/home/jleechpe/.config/dusk/themes/dark/zenburn.res" +#include "/home/jleechpe/.config/dusk/themes/template.txt" + +dusk.font: FiraCode Nerd Font:size=12 +*.font: FiraCode Nerd Font:size=10 diff --git a/duskwm/.config/dusk/status_scripts/duskwm_status.py b/duskwm/.config/dusk/status_scripts/duskwm_status.py new file mode 100755 index 0000000..d0c6223 --- /dev/null +++ b/duskwm/.config/dusk/status_scripts/duskwm_status.py @@ -0,0 +1,96 @@ +#!/usr/bin/python +import os +import runpy +import subprocess +import sys +import time +from distutils.util import strtobool +from pathlib import Path +from typing import Optional + +import psutil + +# Configs +main_dir = Path(sys.argv[0]).parent.resolve() +debug = strtobool(os.getenv("STATUS_DEBUG", "False")) + +# Scripts by interval +statuses = { + 5: [(2, "./scripts/get_volume.py")], + 60: [ + (0, "./scripts/clock.py"), + (4, "./scripts/get_battery.py"), + (3, "./scripts/get_wifi.py"), + (7, "./scripts/get_uptime.py"), + (1, "./scripts/unread_mail.py"), + ], + # 300: [], + 3600: [(5, "./scripts/get_publicip.py"), (6, "./scripts/get_weather.py")], +} + + +def list_statuses(): + print("Status scripts being processed") + for interval, status in statuses.items(): + period = "second" if interval == 1 else "seconds" + print(f" Updating every {interval} {period}") + for location, script in status: + print(f" {location}: {script}") + + +def kill_existing_instances(): + current_pid = os.getpid() + for proc in psutil.process_iter(["pid", "name"]): + if proc.info["name"].startswith("duskwm_status"): + pid = proc.info["pid"] + if pid != current_pid: + os.kill(pid, 9) + print(f"Killing existing instance (PID {pid})") + + +def update_status(status: Optional[int], content: Optional[str]): + status = status if status is not None else 99 + content = content if content is not None else "" + if debug: + print(f"{status:>3} : {content}") + else: + subprocess.run( + [ + "duskc", + "--ignore-reply", + "run_command", + "setstatus", + f"{status}", + f"{content}", + ] + ) + + +def get_status_data(scriptpath: str) -> Optional[str]: + path = main_dir.joinpath(scriptpath).as_posix() + result = runpy.run_path(path) + content: Optional[str] = result.get("content", None) + return content + + +# Run at startup +print(f"Running in Debug mode: {debug}") +print(f"Root script found at: {main_dir}") +kill_existing_instances() +list_statuses() + +seconds = 0 +while True: + # Run on loop + for interval, scripts in statuses.items(): + if seconds % interval == 0: + for status, script in scripts: + # try: + data = get_status_data(script) + # except Exception: + # data = f"Err: {script}" + update_status(status, data) + + # Increment count and sleep for loop + seconds += 1 + time.sleep(1) diff --git a/duskwm/.config/dusk/status_scripts/scripts/clock.py b/duskwm/.config/dusk/status_scripts/scripts/clock.py new file mode 100644 index 0000000..44a202d --- /dev/null +++ b/duskwm/.config/dusk/status_scripts/scripts/clock.py @@ -0,0 +1,12 @@ +from datetime import datetime + +from theme import current_theme, default + +if current_theme.fg == current_theme.fg_alt: + current_theme.fg_alt = current_theme.base7 + +frame = f"^v^^c{current_theme.yellow}^" +date = f"^c{current_theme.fg}^" +time = f"^c{current_theme.fg_alt}^" +data = datetime.now().strftime(f"{date}%Y-%m-%d {time}%H:%M") +content = f"{frame}[^v^{data}^t^]^t^" diff --git a/duskwm/.config/dusk/status_scripts/scripts/get_battery.py b/duskwm/.config/dusk/status_scripts/scripts/get_battery.py new file mode 100644 index 0000000..bbc21f1 --- /dev/null +++ b/duskwm/.config/dusk/status_scripts/scripts/get_battery.py @@ -0,0 +1,14 @@ +from theme import current_theme, default + +try: + charge = open("/sys/class/power_supply/BAT1/capacity").read().strip() + status = open("/sys/class/power_supply/BAT1/status").read().strip() + + if status == "Discharging": + icon = "󰁹" + else: + icon = "󰂄" + + content = f"{icon}{status}%" +except Exception: + content = None diff --git a/duskwm/.config/dusk/status_scripts/scripts/get_publicip.py b/duskwm/.config/dusk/status_scripts/scripts/get_publicip.py new file mode 100644 index 0000000..d5e74ce --- /dev/null +++ b/duskwm/.config/dusk/status_scripts/scripts/get_publicip.py @@ -0,0 +1,8 @@ +import requests +from theme import current_theme, default + +ip = requests.get("https://api64.ipify.org").text.strip() + +bright = f"^v^^c{current_theme.dark_cyan}^" +icon = f"^v^^c{current_theme.cyan}^" +content = f"{icon}󱦂 {bright}{ip}^t^" diff --git a/duskwm/.config/dusk/status_scripts/scripts/get_uptime.py b/duskwm/.config/dusk/status_scripts/scripts/get_uptime.py new file mode 100644 index 0000000..cba0e73 --- /dev/null +++ b/duskwm/.config/dusk/status_scripts/scripts/get_uptime.py @@ -0,0 +1,46 @@ +import subprocess +import time + +from theme import current_theme, default + +raw_seconds = time.clock_gettime(time.CLOCK_BOOTTIME) + +MINUTE = 60 +HOUR = 60 * MINUTE +DAY = 24 * HOUR + +days = int(raw_seconds / DAY) +hours = int((raw_seconds % DAY) / HOUR) +minutes = int((raw_seconds % HOUR / MINUTE)) + +data = "" +if days > 0: + data += f"{days}d " +data += f"{hours:02}:" +data += f"{minutes:02}" + +# Check for pending reboot +color = f"^c{current_theme.cyan}^" +time_color = f"^c{current_theme.teal}^" + +warn_color = f"^c{current_theme.orange}^" +warn_time_color = f"^c{current_theme.red}^" +prefix = "󰣇" + + +if days > 10: + color = warn_color + time_color = warn_time_color + +try: + reboot = subprocess.run( + ["please", "longoverdue"], stdout=subprocess.PIPE, encoding="utf-8" + ).stdout.split("\n") + if len(reboot) > 1: + color = warn_color + time_color = warn_time_color + prefix = "" +except Exception: + pass + +content = f"^v^{color}{prefix} {time_color}{data}^t^" diff --git a/duskwm/.config/dusk/status_scripts/scripts/get_volume.py b/duskwm/.config/dusk/status_scripts/scripts/get_volume.py new file mode 100644 index 0000000..6a17fae --- /dev/null +++ b/duskwm/.config/dusk/status_scripts/scripts/get_volume.py @@ -0,0 +1,21 @@ +import subprocess + +from theme import current_theme, default + +data = subprocess.run( + ["wpctl", "get-volume", "@DEFAULT_AUDIO_SINK@"], + stdout=subprocess.PIPE, + encoding="utf-8", +).stdout.strip() + +_, decimal, *muted = data.split(" ") + +decimal = float(decimal) +muted = muted[0] if muted else "" + +icon = "󰝟" if muted == "[MUTED]" else "󰕾" +color = ( + f"^c{current_theme.base7}^" if muted == "[MUTED]" else f"^c{current_theme.base8}^" +) +vol_string = f"{decimal:.0%}" +content = f"^v^{color}{icon} {vol_string:>4}^t^" diff --git a/duskwm/.config/dusk/status_scripts/scripts/get_weather.py b/duskwm/.config/dusk/status_scripts/scripts/get_weather.py new file mode 100644 index 0000000..866c8a6 --- /dev/null +++ b/duskwm/.config/dusk/status_scripts/scripts/get_weather.py @@ -0,0 +1,43 @@ +import requests +from theme import current_theme, default + +# WHO values +# 1-2: Low +# 3-5: Moderate +# 6-7: High +# 8-10: Very High +# 11+: Extreme +uv_index = { + 0: current_theme.green, + 2: current_theme.yellow, + 5: current_theme.orange, + 7: current_theme.red, + 10: current_theme.magenta, +} + +geodata = requests.get("https://ipinfo.io/json").json() + +location = geodata["loc"] +city = geodata["city"] +region = geodata["region"] + +weather = requests.get( + f"https://wttr.in/{location}?format=+%c+%t+%f+%h+%w+%P+%p+%u" +).text + +icon, temp, feels_like, humidity, wind, pressure, precip, uv = weather.split() + +bright = f"^v^^c{current_theme.base8}^" +uv_color = [color for index, color in uv_index.items() if int(uv) > index][-1] +uv_color = f"^v^^c{uv_color}^" +humid_color = f"^v^^c{current_theme.blue}^" +precip_color = f"^v^^c{current_theme.teal}^" + +# c_templ = t"{i}{t} {w} {h} {p}" +content = ( + f"{bright}{icon} " + + f"{uv_color}{temp}({feels_like})^t^ " + + f"{wind} " + + f"{humid_color} {humidity} " + + f"{precip_color}{precip}^t^" +) diff --git a/duskwm/.config/dusk/status_scripts/scripts/get_wifi.py b/duskwm/.config/dusk/status_scripts/scripts/get_wifi.py new file mode 100644 index 0000000..8274b5e --- /dev/null +++ b/duskwm/.config/dusk/status_scripts/scripts/get_wifi.py @@ -0,0 +1,48 @@ +import subprocess + +from theme import current_theme, default + +dbmRange = {(-10, "󰤨"), (-70, "󰤥"), (-80, "󰤢"), (-90, "󰤟")} + +# full data +try: + data = subprocess.run( + ["iwd", "station", "wlan0", "show"], stdout=subprocess.PIPE, encoding="utf-8" + ).stdout.split("\n") + + status = {} + for line in data: + line = line.strip() + if not line: + continue + + match line: + case l if l.startswith("State"): + status["state"] = l.split()[1] + case l if l.startswith("Connected network"): + status["SSID"] = l.split()[2:] + case l if l.startswith("Frequency"): + f = int(l.split()[1]) + if f >= 5925: + status["frequency"] = "6G" + elif f >= 5000: + status["frequency"] = "5G" + elif f >= 2400: + status["frequency"] = "2.4G" + else: + f = f / 1000 + status["frequency"] = f"{f}GHz" + case l if l.startswith("RSSI"): + dbm = int(l.split()[1]) + for value, icon in dbmRange: + if dbm < value: + status["icon"] = icon + + status["strength"] = dbm + + if status["state"] == "connected": + content = f"{status['icon']} {status['SSID']}({status['frequency']})" + else: + content = "󰖪" +except Exception: + content = None diff --git a/duskwm/.config/dusk/status_scripts/scripts/unread_mail.py b/duskwm/.config/dusk/status_scripts/scripts/unread_mail.py new file mode 100644 index 0000000..2a81785 --- /dev/null +++ b/duskwm/.config/dusk/status_scripts/scripts/unread_mail.py @@ -0,0 +1,13 @@ +import subprocess + +from theme import current_theme, default + +icon = "󰇮" +count = subprocess.run( + ["mu", "msgs-count", "--", "--query=flag:unread AND maildir:/Inbox/"], + stdout=subprocess.PIPE, + encoding="utf-8", +).stdout.strip() + +bright = f"^v^^c{current_theme.base8}^" +content = f"{bright}{icon} {count}^t^" diff --git a/duskwm/.config/dusk/status_scripts/theme.py b/duskwm/.config/dusk/status_scripts/theme.py new file mode 100644 index 0000000..1037492 --- /dev/null +++ b/duskwm/.config/dusk/status_scripts/theme.py @@ -0,0 +1,66 @@ +class Theme: + def __init__(self, **colors): + for name, value in colors.items(): + setattr(self, name, value) + + +themes = { + "spacegray": Theme( + bg="#2b303b", + bg_alt="#232830", + base0="#1B2229", + base1="#1c1f24", + base2="#202328", + base3="#2F3237", + base4="#4f5b66", + base5="#65737E", + base6="#73797e", + base7="#9ca0a4", + base8="#DFDFDF", + fg="#c0c5ce", + fg_alt="#c0c5ce", + grey="#4f5b66", + red="#BF616A", + orange="#D08770", + green="#A3BE8C", + blue="#8FA1B3", + violet="#b48ead", + teal="#4db5bd", + yellow="#ECBE7B", + dark_blue="#2257A0", + magenta="#c678dd", + cyan="#46D9FF", + dark_cyan="#5699AF", + ), + "zenburn": Theme( + bg="#3F3F3F", + bg_alt="#383838", + base0="#000000", + base1="#2B2B2B", + base2="#303030", + base3="#383838", + base4="#494949", + base5="#4F4F4F", + base6="#5F5F5F", + base7="#6F6F6F", + base8="#FFFFEF", + fg="#DCDCDC", + fg_alt="#989890", + grey="#494949", + red="#CC9393", + orange="#DFAF8F", + green="#7F9F7F", + teal="#4db5bd", + yellow="#F0DFAF", + blue="#8CD0D3", + dark_blue="#2257A0", + magenta="#DC8CC3", + violet="#a9a1e1", + cyan="#93E0E3", + dark_cyan="#5699AF", + ), + "default": Theme(), +} + +current_theme = themes["spacegray"] +default = themes["default"] diff --git a/duskwm/.config/dusk/themes/dark/spacegray.res b/duskwm/.config/dusk/themes/dark/spacegray.res new file mode 100644 index 0000000..586d7cf --- /dev/null +++ b/duskwm/.config/dusk/themes/dark/spacegray.res @@ -0,0 +1,39 @@ +#define COLOR0 #000000 +#define COLOR1 #b04b57 +#define COLOR2 #87b379 +#define COLOR3 #e5c179 +#define COLOR4 #7d8fa4 +#define COLOR5 #a47996 +#define COLOR6 #85a7a5 +#define COLOR7 #b3b8c3 +#define COLOR8 #000000 +#define COLOR9 #b04b57 +#define COLOR10 #87b379 +#define COLOR11 #e5c179 +#define COLOR12 #7d8fa4 +#define COLOR13 #a47996 +#define COLOR14 #85a7a5 +#define COLOR15 #ffffff +#define BASE_BACKGROUND #20242d +#define BASE_FOREGROUND #b3b8c3 +#define CURSOR #b3b8c3 + +#define SELECTED_FOREGROUND COLOR15 +#define SELECTED_BACKGROUND COLOR1 +#define SCRATCHNORM BASE_BACKGROUND +#define SCRATCHSEL SELECTED_BACKGROUND +#define HID_NORM_FG_COLOR BASE_FOREGROUND +#define HID_NORM_BG_COLOR BASE_BACKGROUND +#define HID_SEL_FG_COLOR COLOR3 +#define HID_SEL_BG_COLOR BASE_BACKGROUND +#define WS_NORM_FG_COLOR BASE_FOREGROUND +#define WS_NORM_BG_COLOR BASE_BACKGROUND +#define WS_SEL_FG_COLOR SELECTED_FOREGROUND +#define WS_SEL_BG_COLOR SELECTED_BACKGROUND +#define MARKED_FG_COLOR COLOR0 +#define MARKED_BG_COLOR COLOR3 +#define BORDER COLOR0 +#define WARNING_FG_COLOR COLOR0 +#define WARNING_BG_COLOR COLOR4 +#define URGENT_FG_COLOR COLOR0 +#define URGENT_BG_COLOR COLOR2 diff --git a/duskwm/.config/dusk/themes/dark/zenburn.res b/duskwm/.config/dusk/themes/dark/zenburn.res new file mode 100644 index 0000000..85b62d6 --- /dev/null +++ b/duskwm/.config/dusk/themes/dark/zenburn.res @@ -0,0 +1,39 @@ +#define COLOR0 #383838 +#define COLOR1 #404040 +#define COLOR2 #606060 +#define COLOR3 #6f6f6f +#define COLOR4 #808080 +#define COLOR5 #dcdccc +#define COLOR6 #c0c0c0 +#define COLOR7 #ffffff +#define COLOR8 #dca3a3 +#define COLOR9 #dfaf8f +#define COLOR10 #e0cf9f +#define COLOR11 #5f7f5f +#define COLOR12 #93e0e3 +#define COLOR13 #7cb8bb +#define COLOR14 #dc8cc3 +#define COLOR15 #000000 +#define BASE_BACKGROUND COLOR0 +#define BASE_FOREGROUND COLOR5 +#define CURSOR COLOR6 + +#define SELECTED_FOREGROUND COLOR15 +#define SELECTED_BACKGROUND COLOR1 +#define SCRATCHNORM BASE_BACKGROUND +#define SCRATCHSEL SELECTED_BACKGROUND +#define HID_NORM_FG_COLOR BASE_FOREGROUND +#define HID_NORM_BG_COLOR BASE_BACKGROUND +#define HID_SEL_FG_COLOR COLOR3 +#define HID_SEL_BG_COLOR BASE_BACKGROUND +#define WS_NORM_FG_COLOR BASE_FOREGROUND +#define WS_NORM_BG_COLOR BASE_BACKGROUND +#define WS_SEL_FG_COLOR SELECTED_FOREGROUND +#define WS_SEL_BG_COLOR SELECTED_BACKGROUND +#define MARKED_FG_COLOR COLOR6 +#define MARKED_BG_COLOR COLOR3 +#define BORDER COLOR15 +#define WARNING_FG_COLOR COLOR6 +#define WARNING_BG_COLOR COLOR4 +#define URGENT_FG_COLOR COLOR6 +#define URGENT_BG_COLOR COLOR2 diff --git a/duskwm/.config/dusk/themes/defaults.txt b/duskwm/.config/dusk/themes/defaults.txt new file mode 100644 index 0000000..b8fa813 --- /dev/null +++ b/duskwm/.config/dusk/themes/defaults.txt @@ -0,0 +1,206 @@ +#ifndef NORM_FG_COLOR +#define NORM_FG_COLOR BASE_FOREGROUND +#endif +#ifndef SEL_FG_COLOR +#define SEL_FG_COLOR SELECTED_FOREGROUND +#endif +#ifndef TITLE_NORM_FG_COLOR +#define TITLE_NORM_FG_COLOR BASE_FOREGROUND +#endif +#ifndef TITLE_SEL_FG_COLOR +#define TITLE_SEL_FG_COLOR SELECTED_FOREGROUND +#endif +#ifndef WS_NORM_FG_COLOR +#define WS_NORM_FG_COLOR BASE_FOREGROUND +#endif +#ifndef WS_OCC_FG_COLOR +#define WS_OCC_FG_COLOR WS_NORM_FG_COLOR +#endif +#ifndef WS_VIS_FG_COLOR +#define WS_VIS_FG_COLOR SELECTED_FOREGROUND +#endif +#ifndef WS_SEL_FG_COLOR +#define WS_SEL_FG_COLOR SELECTED_FOREGROUND +#endif +#ifndef HID_NORM_FG_COLOR +#define HID_NORM_FG_COLOR BASE_FOREGROUND +#endif +#ifndef HID_SEL_FG_COLOR +#define HID_SEL_FG_COLOR SELECTED_FOREGROUND +#endif +#ifndef URGENT_FG_COLOR +#define URGENT_FG_COLOR BASE_FOREGROUND +#endif +#ifndef WARNING_FG_COLOR +#ifdef WARNING +#define WARNING_FG_COLOR BASE_FOREGROUND +#endif +#endif +#ifndef MARKED_FG_COLOR +#define MARKED_FG_COLOR BASE_FOREGROUND +#endif +#ifndef SCRATCH_NORM_FG_COLOR +#define SCRATCH_NORM_FG_COLOR BASE_FOREGROUND +#endif +#ifndef SCRATCH_SEL_FG_COLOR +#define SCRATCH_SEL_FG_COLOR SELECTED_FOREGROUND +#endif + +#ifndef NORM_BG_COLOR +#define NORM_BG_COLOR BASE_BACKGROUND +#endif +#ifndef SEL_BG_COLOR +#define SEL_BG_COLOR SELECTED_BACKGROUND +#endif +#ifndef TITLE_NORM_BG_COLOR +#ifdef TITLENORM +#define TITLE_NORM_BG_COLOR TITLENORM +#else +#define TITLE_NORM_BG_COLOR BASE_BACKGROUND +#endif +#endif +#ifndef TITLE_SEL_BG_COLOR +#ifdef TITLESEL +#define TITLE_SEL_BG_COLOR TITLESEL +#else +#define TITLE_SEL_BG_COLOR SELECTED_BACKGROUND +#endif +#endif +#ifndef WS_NORM_BG_COLOR +#ifdef WSNORM +#define WS_NORM_BG_COLOR WSNORM +#else +#define WS_NORM_BG_COLOR BASE_BACKGROUND +#endif +#endif +#ifndef WS_OCC_BG_COLOR +#ifdef WSOCC +#define WS_OCC_BG_COLOR WSOCC +#else +#define WS_OCC_BG_COLOR WS_NORM_BG_COLOR +#endif +#endif +#ifndef WS_SEL_BG_COLOR +#ifdef WSSEL +#define WS_SEL_BG_COLOR WSSEL +#else +#define WS_SEL_BG_COLOR SELECTED_BACKGROUND +#endif +#endif +#ifndef WS_VIS_BG_COLOR +#ifdef WSVIS +#define WS_VIS_BG_COLOR WSVIS +#else +#define WS_VIS_BG_COLOR WS_SEL_BG_COLOR +#endif +#endif +#ifndef HID_NORM_BG_COLOR +#ifdef HIDNORM +#define HID_NORM_BG_COLOR HIDNORM +#else +#define HID_NORM_BG_COLOR BASE_BACKGROUND +#endif +#endif +#ifndef HID_SEL_BG_COLOR +#ifdef HIDSEL +#define HID_SEL_BG_COLOR HIDSEL +#else +#define HID_SEL_BG_COLOR SELECTED_BACKGROUND +#endif +#endif +#ifndef URGENT_BG_COLOR +#ifdef URGENT +#define URGENT_BG_COLOR URGENT +#else +#define URGENT_BG_COLOR BASE_BACKGROUND +#endif +#endif +#ifndef WARNING_BG_COLOR +#ifdef WARNING +#define WARNING_BG_COLOR WARNING +#endif +#endif +#ifndef MARKED_BG_COLOR +#ifdef MARKED +#define MARKED_BG_COLOR MARKED +#else +#define MARKED_BG_COLOR BASE_BACKGROUND +#endif +#endif +#ifndef SCRATCH_NORM_BG_COLOR +#ifdef SCRATCHNORM +#define SCRATCH_NORM_BG_COLOR SCRATCHNORM +#else +#define SCRATCH_NORM_BG_COLOR TITLE_NORM_BG_COLOR +#endif +#endif +#ifndef SCRATCH_SEL_BG_COLOR +#ifdef SCRATCHSEL +#define SCRATCH_SEL_BG_COLOR SCRATCHSEL +#else +#define SCRATCH_SEL_BG_COLOR TITLE_SEL_BG_COLOR +#endif +#endif + +#ifndef FLOAT_NORM_BG_COLOR +#ifdef FLOATNORM +#define FLOAT_NORM_BG_COLOR FLOATNORM +#endif +#endif +#ifndef FLOAT_SEL_BG_COLOR +#ifdef FLOATSEL +#define FLOAT_SEL_BG_COLOR FLOATSEL +#endif +#endif + +#ifndef FLOAT_NORM_FG_COLOR +#ifdef FLOAT_SEL_BG_COLOR +#define FLOAT_NORM_FG_COLOR BASE_FOREGROUND +#endif +#endif +#ifndef FLOAT_SEL_FG_COLOR +#ifdef FLOAT_NORM_BG_COLOR +#define FLOAT_SEL_FG_COLOR SELECTED_FOREGROUND +#endif +#endif + +#ifndef NORM_BORDER_COLOR +#define NORM_BORDER_COLOR BORDER +#endif +#ifndef SEL_BORDER_COLOR +#define SEL_BORDER_COLOR SEL_BG_COLOR +#endif +#ifndef TITLE_NORM_BORDER_COLOR +#define TITLE_NORM_BORDER_COLOR TITLE_NORM_BG_COLOR +#endif +#ifndef TITLE_SEL_BORDER_COLOR +#define TITLE_SEL_BORDER_COLOR TITLE_SEL_BG_COLOR +#endif +#ifndef SCRATCH_NORM_BORDER_COLOR +#define SCRATCH_NORM_BORDER_COLOR SCRATCH_NORM_BG_COLOR +#endif +#ifndef SCRATCH_SEL_BORDER_COLOR +#define SCRATCH_SEL_BORDER_COLOR SCRATCH_SEL_BG_COLOR +#endif +#ifndef URGENT_BORDER_COLOR +#define URGENT_BORDER_COLOR URGENT_BG_COLOR +#endif +#ifndef MARKED_BORDER_COLOR +#define MARKED_BORDER_COLOR MARKED_BG_COLOR +#endif + +#ifdef FLOAT_NORM_BG_COLOR +#ifndef FLOAT_NORM_BORDER_COLOR +#define FLOAT_NORM_BORDER_COLOR FLOAT_NORM_BG_COLOR +#endif +#endif + +#ifdef FLOAT_SEL_BG_COLOR +#ifndef FLOAT_SEL_BORDER_COLOR +#define FLOAT_SEL_BORDER_COLOR FLOAT_SEL_BG_COLOR +#endif +#endif + +#ifndef BORDER +#define BORDER NORM_BG_COLOR +#endif diff --git a/duskwm/.config/dusk/themes/template.txt b/duskwm/.config/dusk/themes/template.txt new file mode 100644 index 0000000..c9e6cba --- /dev/null +++ b/duskwm/.config/dusk/themes/template.txt @@ -0,0 +1,169 @@ +#include "defaults.txt" + +! === terminal colors === +! Change the scope to "dusk" if you do not want the template +! to interfere with global colors (e.g. terminals). +#define COLOR_SCOPE * +!#define COLOR_SCOPE dusk + +#ifdef COLOR0 +COLOR_SCOPE.color0: COLOR0 +COLOR_SCOPE.color1: COLOR1 +COLOR_SCOPE.color2: COLOR2 +COLOR_SCOPE.color3: COLOR3 +COLOR_SCOPE.color4: COLOR4 +COLOR_SCOPE.color5: COLOR5 +COLOR_SCOPE.color6: COLOR6 +COLOR_SCOPE.color7: COLOR7 +COLOR_SCOPE.color8: COLOR8 +COLOR_SCOPE.color9: COLOR9 +COLOR_SCOPE.color10: COLOR10 +COLOR_SCOPE.color11: COLOR11 +COLOR_SCOPE.color12: COLOR12 +COLOR_SCOPE.color13: COLOR13 +COLOR_SCOPE.color14: COLOR14 +COLOR_SCOPE.color15: COLOR15 +#endif + +! === general colors === +*.foreground: BASE_FOREGROUND +*.background: BASE_BACKGROUND +#ifdef CURSOR +*.cursor: CURSOR +#endif + +! === dusk foreground colors === +dusk.norm.fg.color: NORM_FG_COLOR +dusk.titlenorm.fg.color: TITLE_NORM_FG_COLOR +dusk.titlesel.fg.color: TITLE_SEL_FG_COLOR +dusk.scratchnorm.fg.color: SCRATCH_NORM_FG_COLOR +dusk.scratchsel.fg.color: SCRATCH_SEL_FG_COLOR +dusk.hidnorm.fg.color: HID_NORM_FG_COLOR +dusk.hidsel.fg.color: HID_SEL_FG_COLOR +dusk.urg.fg.color: URGENT_FG_COLOR +dusk.marked.fg.color: MARKED_FG_COLOR +dusk.wsnorm.fg.color: WS_NORM_FG_COLOR +dusk.wsvis.fg.color: WS_VIS_FG_COLOR +dusk.wssel.fg.color: WS_SEL_FG_COLOR +dusk.wsocc.fg.color: WS_OCC_FG_COLOR + +#ifdef FLOAT_NORM_FG_COLOR +dusk.norm.float.fg.color: FLOAT_NORM_FG_COLOR +#endif +#ifdef FLOAT_SEL_FG_COLOR +dusk.sel.float.fg.color: FLOAT_SEL_FG_COLOR +#endif + +! === dusk background colors === +dusk.norm.bg.color: NORM_BG_COLOR +dusk.titlenorm.bg.color: TITLE_NORM_BG_COLOR +dusk.titlesel.bg.color: TITLE_SEL_BG_COLOR +dusk.scratchnorm.bg.color: SCRATCH_NORM_BG_COLOR +dusk.scratchsel.bg.color: SCRATCH_SEL_BG_COLOR +dusk.hidnorm.bg.color: HID_NORM_BG_COLOR +dusk.hidsel.bg.color: HID_SEL_BG_COLOR +dusk.urg.bg.color: URGENT_BG_COLOR +dusk.marked.bg.color: MARKED_BG_COLOR +dusk.wsnorm.bg.color: WS_NORM_BG_COLOR +dusk.wsvis.bg.color: WS_VIS_BG_COLOR +dusk.wssel.bg.color: WS_SEL_BG_COLOR +dusk.wsocc.bg.color: WS_OCC_BG_COLOR + +! === dusk border colors === +dusk.norm.border.color: NORM_BORDER_COLOR +dusk.titlenorm.border.color: TITLE_NORM_BORDER_COLOR +dusk.titlesel.border.color: TITLE_SEL_BORDER_COLOR +dusk.scratchnorm.border.color: SCRATCH_NORM_BORDER_COLOR +dusk.scratchsel.border.color: SCRATCH_SEL_BORDER_COLOR +dusk.urg.border.color: URGENT_BORDER_COLOR +dusk.marked.border.color: MARKED_BORDER_COLOR + +#ifdef FLOAT_NORM_BG_COLOR +dusk.norm.float.bg.color: FLOAT_NORM_BG_COLOR +#endif +#ifdef FLOAT_SEL_BG_COLOR +dusk.sel.float.bg.color: FLOAT_SEL_BG_COLOR +#endif + +! === dmenu colors === +dmenu.norm.fg.color: BASE_FOREGROUND +dmenu.norm.bg.color: BASE_BACKGROUND +dmenu.sel.fg.color: SELECTED_FOREGROUND +dmenu.sel.bg.color: SELECTED_BACKGROUND +dmenu.border.bg.color: BORDER +dmenu.out.fg.color: MARKED_FG_COLOR +dmenu.out.bg.color: MARKED_BG_COLOR +dmenu.prompt.fg.color: TITLE_NORM_FG_COLOR +dmenu.prompt.bg.color: TITLE_NORM_BG_COLOR +dmenu.adjacent.fg.color: SELECTED_FOREGROUND +dmenu.adjacent.bg.color: SELECTED_BACKGROUND +dmenu.selhl.fg.color: URGENT_FG_COLOR +dmenu.selhl.bg.color: URGENT_BG_COLOR +dmenu.normhl.fg.color: MARKED_FG_COLOR +dmenu.normhl.bg.color: MARKED_BG_COLOR +#ifdef WARNING_FG_COLOR +dmenu.hp.fg.color: WARNING_FG_COLOR +#endif +#ifdef WARNING_BG_COLOR +dmenu.hp.bg.color: WARNING_BG_COLOR +#endif + +#ifdef FLOAT_NORM_BORDER_COLOR +dusk.norm.float.border.color: FLOAT_NORM_BORDER_COLOR +#endif +#ifdef FLOAT_SEL_BORDER_COLOR +dusk.sel.float.border.color: FLOAT_SEL_BORDER_COLOR +#endif + +! === xmenu colors === +xmenu.background_color: BASE_BACKGROUND +xmenu.foreground_color: BASE_FOREGROUND +xmenu.selforeground: SELECTED_FOREGROUND +xmenu.selbackground: SELECTED_BACKGROUND +xmenu.border: BORDER +xmenu.separator: BASE_FOREGROUND + +! === slock colors === +slock.background: BASE_BACKGROUND +slock.locked: BASE_BACKGROUND +slock.input: SELECTED_BACKGROUND +slock.failed: URGENT_BG_COLOR +#ifdef WARNING_BG_COLOR +slock.capslock: WARNING_BG_COLOR +#endif + +! === sxiv colors === +Sxiv.mark: MARKED_BG_COLOR +Sxiv.barforeground: SELECTED_FOREGROUND +Sxiv.barbackground: SELECTED_BACKGROUND + +! === nsxiv colors === + +Nsxiv.mark.foreground: MARKED_BG_COLOR +Nsxiv.window.foreground: BASE_FOREGROUND +Nsxiv.window.background: BASE_BACKGROUND +Nsxiv.bar.foreground: SELECTED_FOREGROUND +Nsxiv.bar.background: SELECTED_BACKGROUND + +! === pmenu colors === +pmenu.foreground: BASE_FOREGROUND +pmenu.background: BASE_BACKGROUND +pmenu.selbackground: SELECTED_BACKGROUND +pmenu.selforeground: SELECTED_FOREGROUND +pmenu.border: BORDER +pmenu.separator: SELECTED_BACKGROUND + +! === dunst colors === +dunst.colors.low.fg: SELECTED_FOREGROUND +dunst.colors.low.bg: SELECTED_BACKGROUND +dunst.colors.low.frame: BORDER +dunst.colors.low.highlight: MARKED_BG_COLOR +dunst.colors.norm.fg: BASE_FOREGROUND +dunst.colors.norm.bg: BASE_BACKGROUND +dunst.colors.norm.frame: BORDER +dunst.colors.norm.highlight: MARKED_BG_COLOR +dunst.colors.crit.fg: URGENT_FG_COLOR +dunst.colors.crit.bg: URGENT_BG_COLOR +dunst.colors.crit.frame: BORDER +dunst.colors.crit.highlight: MARKED_BG_COLOR +dunst.colors.frame_color: BORDER diff --git a/duskwm/bin/test-dusk.sh b/duskwm/bin/test-dusk.sh new file mode 100755 index 0000000..6b7bdb7 --- /dev/null +++ b/duskwm/bin/test-dusk.sh @@ -0,0 +1,13 @@ +#!/bin/sh +Xephyr :1 -ac -dpi 107 -fullscreen -resizeable & # -dpi 180 -screen 1920x1080 & +# sleep 2 +DISPLAY=:1 tym --daemon & +sleep 1 +DISPLAY=:1 xrdb -load $HOME/.Xresources +DISPLAY=:1 ~/sources/duskwm/dusk/dusk & +# sleep 1 +# DISPLAY=:1 duskc run_command xrdb + +wait + +pkill Xephyr