feat: initial implementation of scr33ny OLED screensaver

Screensavers: blank (pure black), GIF animation, static image, text
with float/typewriter/fade animations.

Widgets: digital/analog clock, date, weather (OpenWeatherMap API).
Anti burn-in pixel shift with configurable interval.
Wayland-native via winit 0.29 + softbuffer 0.4.
TOML config with serde, full CLI via clap, idle daemon mode.
This commit is contained in:
kilyabin
2026-06-18 00:17:51 +04:00
commit 95c0373db6
18 changed files with 1830 additions and 0 deletions
+94
View File
@@ -0,0 +1,94 @@
# scr33ny — OLED screensaver config
# Copy to ~/.config/scr33ny/config.toml
# ── Screensaver ───────────────────────────────────────────────────────────────
# type: blank | gif | image | text
[screensaver]
type = "blank" # pure black (default, OLED-optimal)
# ── GIF example ───────────────────────────────────────────────────────────────
# [screensaver]
# type = "gif"
# path = "~/.config/scr33ny/cat.gif"
# scale = "fit" # fit | fill | original
# ── Image example ─────────────────────────────────────────────────────────────
# [screensaver]
# type = "image"
# path = "~/.config/scr33ny/wallpaper.png"
# scale = "fill"
# ── Text animation example ────────────────────────────────────────────────────
# [screensaver]
# type = "text"
# content = "scr33ny"
# font_size = 96.0
# color = "#ffffff"
# animation = "float" # float | typewriter | fade
# ── Display settings ─────────────────────────────────────────────────────────
[display]
monitor = 0 # monitor index (0 = primary). See: scr33ny monitors
burn_shift = 2 # pixel shift for OLED burn-in prevention
shift_interval = 120 # seconds between shifts
# ── Idle daemon ───────────────────────────────────────────────────────────────
[daemon]
enabled = false # set true to use: scr33ny daemon
idle_timeout = 300 # seconds of inactivity before activating
# ── Widgets ───────────────────────────────────────────────────────────────────
# Each widget is a [[widgets]] block.
# position.x: left | center | right | <percent 0-100>
# position.y: top | center | bottom | <percent 0-100>
# Digital clock (center screen)
[[widgets]]
type = "clock"
style = "digital" # digital | analog
font_size = 72.0
color = "#ffffff"
show_seconds = true
[widgets.position]
x = "center"
y = "center"
# Date below the clock
[[widgets]]
type = "date"
font_size = 28.0
color = "#aaaaaa"
format = "%A, %B %d" # chrono strftime format
[widgets.position]
x = "center"
y = 62.0 # 62% from top
# Weather widget (requires OpenWeatherMap API key)
# [[widgets]]
# type = "weather"
# api_key = "YOUR_OWM_API_KEY" # openweathermap.org
# location = "Moscow"
# units = "metric" # metric | imperial
# font_size = 22.0
# color = "#cccccc"
#
# [widgets.position]
# x = "right"
# y = "top"
# Analog clock example
# [[widgets]]
# type = "clock"
# style = "analog"
# font_size = 40.0 # controls clock size
# color = "#ffffff"
# show_seconds = true
#
# [widgets.position]
# x = "center"
# y = "center"