From f94a825c826494bed1fde56eccdf32737d5a05ba Mon Sep 17 00:00:00 2001 From: The_miro Date: Tue, 21 Jul 2026 19:38:36 +0200 Subject: [PATCH] feat(hyprdrive): dark holo scanlines for kitty + caffeine widget in station-bar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit kitty: regenerate scanlines.png — the old tile was a washed-out near-white overlay that milked out the terminal. Replace it with a dark holographic tile (gentle violet #5018DD tint + crisp violet scanlines every 4px + sparse magenta/crimson grain) on a transparent base, so the window's own opacity/blur still show the wallpaper through it. Seamlessly tileable; matches the suite's HologramOverlay palette. station-bar: add a caffeine badge to the right zone, a faithful port of hyprlua's 4-state eww caffeine widget. Click toggles the shared idle-inhibit lock via the same scripts/caffeine.sh; the glyph tracks manual inhibit (coffee) / webcam presence (eye) / idle (sleep) and glows magenta while presence holds the lock, reading the same lock/flag files the status scripts do. Nerd Font codepoints verified against Agave's cmap. Co-Authored-By: Claude Opus 4.8 --- desktopenvs/hyprdrive/kitty/kitty.conf | 9 +- desktopenvs/hyprdrive/kitty/scanlines.png | Bin 47186 -> 2275 bytes desktopenvs/hyprdrive/station-bar/bar.py | 85 ++++++++++++++++++ .../hyprdrive/station-bar/style/style.css | 7 ++ 4 files changed, 97 insertions(+), 4 deletions(-) diff --git a/desktopenvs/hyprdrive/kitty/kitty.conf b/desktopenvs/hyprdrive/kitty/kitty.conf index 18dea78..2ab17e9 100644 --- a/desktopenvs/hyprdrive/kitty/kitty.conf +++ b/desktopenvs/hyprdrive/kitty/kitty.conf @@ -12,11 +12,12 @@ scrollback_lines 20000 background_opacity 0.4 background_blur 1 -# Holographic scanlines + noise grain + soft ambient violet/crimson bloom, +# Holographic scanlines + gentle violet tint + sparse magenta/crimson grain, # matching the suite's HologramOverlay treatment (orbit-menu/astro-menu/ -# station-bar/beacon) — a static tiled equivalent since kitty has no -# per-frame draw hook to animate it, and no shader hook to bloom glyphs -# directly, so the "glow" comes from ambient light behind the text instead. +# station-bar/beacon) — a static, seamlessly-tiled equivalent since kitty has +# no per-frame draw hook to animate it and no shader hook to bloom glyphs +# directly. Regenerate with scratch gen_scanlines.py (violet #5018DD stripes on +# a transparent base, so the window's own translucency/blur still show through). background_image scanlines.png background_image_layout tiled background_tint 0.3 diff --git a/desktopenvs/hyprdrive/kitty/scanlines.png b/desktopenvs/hyprdrive/kitty/scanlines.png index 71ca6e09eeb2a9d8a44d9b2da4aefb6ce435e8d3..6603ac84d31eea888d637c944a14f74983d2b750 100644 GIT binary patch literal 2275 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 qdXAUAtCe?`UzFox None: super().__init__() @@ -153,9 +173,11 @@ class StationBar(Gtk.Window): GLib.timeout_add_seconds(self.BATTERY_POLL_S, self._refresh_battery) GLib.timeout_add_seconds(self.CLOCK_POLL_S, self._refresh_clock) GLib.timeout_add_seconds(self.VOLUME_POLL_S, self._refresh_volume) + GLib.timeout_add_seconds(self.CAFFEINE_POLL_S, self._refresh_caffeine) self._refresh_battery() self._refresh_clock() self._refresh_volume() + self._refresh_caffeine() self.set_visible(True) self._ensure_tick() @@ -411,6 +433,16 @@ class StationBar(Gtk.Window): self._volume_btn.add_controller(scroll) self._right.append(self._volume_btn) + # Caffeine — clicking toggles the shared idle-inhibit lock via the same + # scripts/caffeine.sh hyprlua's eww bar drives. Glyph and colour track + # the same two inputs as that widget (manual inhibit + camera presence). + self._caffeine_btn = Gtk.Button(label=ICON_SLEEP) + self._caffeine_btn.add_css_class("station-badge") + self._caffeine_btn.add_css_class("station-caffeine") + self._caffeine_btn.set_has_frame(False) + self._caffeine_btn.connect("clicked", self._on_caffeine_clicked) + self._right.append(self._caffeine_btn) + self._clock_label = Gtk.Label() self._clock_label.add_css_class("station-badge") self._clock_label.add_css_class("station-clock") @@ -465,6 +497,59 @@ class StationBar(Gtk.Window): self._refresh_volume() return False + # -- caffeine (shared idle-inhibit lock) ------------------------------------- + @staticmethod + def _pid_alive(pid_file: str) -> bool: + """True if pid_file holds the PID of a still-running process (kill -0).""" + try: + with open(pid_file) as fh: + pid = int(fh.read().strip()) + except (OSError, ValueError): + return False + try: + os.kill(pid, 0) # signal 0 = liveness probe, sends nothing + except OSError: + return False + return True + + def _caffeine_state(self) -> tuple[bool, bool]: + """(manual, presence) — same two inputs as hyprlua's eww caffeine widget: + a manual toggle holding the lock, and the webcam presence flag.""" + manual = self._pid_alive(_CAFFEINE_PID_FILE) and not os.path.exists(_PRESENCE_OWNED_FLAG) + presence = os.path.exists(_PRESENCE_FLAG) + return manual, presence + + def _refresh_caffeine(self) -> bool: + manual, presence = self._caffeine_state() + if manual: + icon = ICON_COFFEE + tip = "Caffeine: ON (manual + presence)" if presence else "Caffeine: ON (manual)" + elif presence: + icon = ICON_EYE + tip = "Awake: presence detected" + else: + icon = ICON_SLEEP + tip = "Idle: no inhibit" + self._caffeine_btn.set_label(icon) + self._caffeine_btn.set_tooltip_text(tip) + # Colour tracks presence (magenta), exactly like eww's .caffeine-presence; + # the glyph carries the manual/presence/idle distinction on its own. + if presence: + self._caffeine_btn.add_css_class("station-caffeine-active") + else: + self._caffeine_btn.remove_css_class("station-caffeine-active") + return True + + def _on_caffeine_clicked(self, *_a) -> None: + subprocess.Popen(["bash", "-c", "$HOME/.config/scripts/caffeine.sh"], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + # caffeine.sh flips the lock synchronously; give it a beat, then reflect it. + GLib.timeout_add(250, self._refresh_caffeine_once) + + def _refresh_caffeine_once(self) -> bool: + self._refresh_caffeine() + return False + def _refresh_clock(self) -> bool: self._clock_label.set_label(time.strftime("%H:%M")) return True diff --git a/desktopenvs/hyprdrive/station-bar/style/style.css b/desktopenvs/hyprdrive/station-bar/style/style.css index b6ef45b..28717c6 100644 --- a/desktopenvs/hyprdrive/station-bar/style/style.css +++ b/desktopenvs/hyprdrive/station-bar/style/style.css @@ -75,6 +75,13 @@ button.station-badge, .station-clock { color: @glow_amber; text-shadow: 0 0 7px alpha(@glow_amber, 0.85); } .station-volume:hover { text-shadow: 0 0 13px @glow_cyan; } +/* caffeine — dim violet at rest (idle/manual), magenta glow while the webcam + * presence daemon is keeping the screen awake, mirroring eww's .caffeine-presence */ +.station-caffeine { color: alpha(@glow_violet, 0.8); text-shadow: 0 0 7px alpha(@glow_violet, 0.55); } +.station-caffeine:hover { color: @glow_violet; text-shadow: 0 0 13px @glow_violet; } +.station-caffeine-active { color: @glow_magenta; text-shadow: 0 0 8px alpha(@glow_magenta, 0.9); } +.station-caffeine-active:hover { text-shadow: 0 0 14px @glow_magenta, 0 0 4px @glow_magenta; } + /* Orbit / Astro launchers — larger glowing icon glyphs */ .station-launcher { font-size: 17pt;