From de345821e269073f019054f464c0b6eaa51026d9 Mon Sep 17 00:00:00 2001 From: Apex077 <143308884+Apex077@users.noreply.github.com> Date: Sun, 19 Jul 2026 04:30:28 +0530 Subject: [PATCH] feat: add apex077/eyecare eye-care reminders plugin (#41) --- eyecare/README.md | 56 +++++++++ eyecare/plugin.toml | 51 ++++++++ eyecare/service.luau | 234 +++++++++++++++++++++++++++++++++++ eyecare/thumbnail.webp | Bin 0 -> 63194 bytes eyecare/translations/en.json | 15 +++ eyecare/widget.luau | 101 +++++++++++++++ 6 files changed, 457 insertions(+) create mode 100644 eyecare/README.md create mode 100644 eyecare/plugin.toml create mode 100644 eyecare/service.luau create mode 100644 eyecare/thumbnail.webp create mode 100644 eyecare/translations/en.json create mode 100644 eyecare/widget.luau diff --git a/eyecare/README.md b/eyecare/README.md new file mode 100644 index 0000000..e9be2ac --- /dev/null +++ b/eyecare/README.md @@ -0,0 +1,56 @@ +# Eye-Care Reminders + +Periodically reminds you to take breaks using the 20-20-20 rule to reduce eye strain. + +## Plugin + +| Field | Value | +| --- | --- | +| ID | `apex077/eyecare` | +| Entries | Bar widget: `eyecare-widget`; service: `eyecare-service` | + +## Requirements + +- `dbus-monitor` on `PATH` (optional, for automatic system idle and screensaver lock detection). +- A system audio player on `PATH` (e.g., `canberra-gtk-play`, `paplay`, `pw-play`, or `aplay`) to hear sound cues. + +## Usage + +The **Eye-Care Reminders** plugin provides a status bar widget that displays either the active time countdown or the break duration. + +- **Active State**: Shows the remaining active screen time (e.g., `20:00`). Clicking the widget manually starts a break. +- **Break State**: Shows the remaining break duration (e.g., `Break: 20s`). Look 20 feet away at an object during this time. Clicking the widget aborts the break early. +- **Idle State**: Automatically pauses active timer accumulation and resets it if the user remains idle for the duration of a break. +- **Right-Click**: Resets the active/break timer back to its initial state. + +## Settings + +| Setting | Type | Default | Description | +| --- | --- | --- | --- | +| `active_duration_minutes` | `int` | `20` | Active screen time before triggering a break (minutes) | +| `break_duration_seconds` | `int` | `20` | Required duration for eye-care breaks (seconds) | +| `enable_sound` | `bool` | `true` | Play notification sound when breaks start or finish | +| `enable_notifications` | `bool` | `true` | Show system-level notifications for reminders | + +## IPC + +The service listens for compositor idle events. You can configure compositor hooks to notify the service when the system goes idle or resumes: + +```sh +noctalia msg plugin apex077/eyecare:eyecare-service all idled +noctalia msg plugin apex077/eyecare:eyecare-service all active +``` + +You can also send custom trigger/reset events to the service: + +```sh +noctalia msg plugin apex077/eyecare:eyecare-service all trigger-break +noctalia msg plugin apex077/eyecare:eyecare-service all finish-break +noctalia msg plugin apex077/eyecare:eyecare-service all reset +``` + +## Notes + +- **Zero-Config Idle Detection**: If `dbus-monitor` is installed, the service automatically monitors screensaver and login lock session state without manual compositor configuration. +- **Sound Players**: Sound notifications automatically try `canberra-gtk-play`, `paplay`, `pw-play`, and `aplay` to play system sounds. +- **Grace Period**: When starting a break, a grace period (default 10 seconds or the break duration, whichever is smaller) protects against accidental inputs aborting the break immediately. diff --git a/eyecare/plugin.toml b/eyecare/plugin.toml new file mode 100644 index 0000000..9130670 --- /dev/null +++ b/eyecare/plugin.toml @@ -0,0 +1,51 @@ +id = "apex077/eyecare" +name = "Eye-Care Reminders" +version = "1.0.0" +plugin_api = 3 +author = "Apex077" +license = "MIT" +dependencies = ["dbus-monitor", "canberra-gtk-play", "paplay", "pw-play", "aplay"] +icon = "eye" +description = "Periodically reminds you to take breaks using the 20-20-20 rule." +tags = ["service", "bar", "utility", "productivity"] + +[[service]] +id = "eyecare-service" +entry = "service.luau" + +[[widget]] +id = "eyecare-widget" +entry = "widget.luau" + +# Global settings shared by service and widget +[[setting]] +key = "active_duration_minutes" +type = "int" +label_key = "settings.eyecare-active-duration.label" +description_key = "settings.eyecare-active-duration.description" +default = 20 +min = 1 +max = 180 + +[[setting]] +key = "break_duration_seconds" +type = "int" +label_key = "settings.eyecare-break-duration.label" +description_key = "settings.eyecare-break-duration.description" +default = 20 +min = 10 +max = 300 + +[[setting]] +key = "enable_sound" +type = "bool" +label_key = "settings.eyecare-sound.label" +description_key = "settings.eyecare-sound.description" +default = true + +[[setting]] +key = "enable_notifications" +type = "bool" +label_key = "settings.eyecare-notifications.label" +description_key = "settings.eyecare-notifications.description" +default = true diff --git a/eyecare/service.luau b/eyecare/service.luau new file mode 100644 index 0000000..f5cf4ee --- /dev/null +++ b/eyecare/service.luau @@ -0,0 +1,234 @@ +--!nonstrict + +local isSystemIdle = false +local activeTime = 0 +local idleTime = 0 +local breakTimer = 0 +local breakElapsed = 0 +local inBreak = false +local lastLineWasActiveChanged = false + +-- Get setting values +local function getSettings() + return { + active_duration_minutes = tonumber(noctalia.getConfig("active_duration_minutes")) or 20, + break_duration_seconds = tonumber(noctalia.getConfig("break_duration_seconds")) or 20, + enable_sound = noctalia.getConfig("enable_sound") ~= false, + enable_notifications = noctalia.getConfig("enable_notifications") ~= false + } +end + +local settings = getSettings() + +-- Support onConfigChanged to update settings in-place +function onConfigChanged() + settings = getSettings() + noctalia.log("eyecare: settings updated") +end + +-- Play a notification sound using system players +local function playSound(soundName) + local path = "/usr/share/sounds/freedesktop/stereo/" .. soundName .. ".oga" + noctalia.runAsync("canberra-gtk-play -i " .. soundName .. " || paplay " .. path .. " || pw-play " .. path .. " || aplay " .. path .. " || true") +end + +local lastLoggedIdle = nil + +-- Update in-memory state shared with widget +local function updateState() + if isSystemIdle ~= lastLoggedIdle then + lastLoggedIdle = isSystemIdle + noctalia.log("eyecare: system idle state changed to " .. tostring(isSystemIdle)) + end + + noctalia.state.set("eyecare-in-break", inBreak) + noctalia.state.set("eyecare-active-time", activeTime) + noctalia.state.set("eyecare-break-timer", breakTimer) + noctalia.state.set("eyecare-break-elapsed", breakElapsed) + noctalia.state.set("eyecare-idle-time", idleTime) + noctalia.state.set("eyecare-is-system-idle", isSystemIdle) + noctalia.state.set("eyecare-active-duration-minutes", settings.active_duration_minutes) + noctalia.state.set("eyecare-break-duration-seconds", settings.break_duration_seconds) +end + +local wasSystemIdle = false + +-- Tick cycle actions (every 1 second) +function update() + noctalia.setUpdateInterval(1000) + + -- Detect transition from idle to active (unlock/wake up) + local transitionedToActive = (wasSystemIdle and not isSystemIdle) + wasSystemIdle = isSystemIdle + + if inBreak then + breakTimer = breakTimer + 1 + breakElapsed = breakTimer -- Keep breakElapsed in sync for backward compatibility + + if transitionedToActive then + local grace_threshold = math.min(10, settings.break_duration_seconds) + if breakTimer >= grace_threshold then + -- User was away for at least the grace threshold and now returned, + -- so consider the break completed/accepted. + inBreak = false + breakTimer = 0 + breakElapsed = 0 + activeTime = 0 + else + -- User returned almost immediately, abort/cancel the break + inBreak = false + breakTimer = 0 + breakElapsed = 0 + activeTime = 0 + end + elseif breakTimer >= settings.break_duration_seconds then + -- Break completed successfully + inBreak = false + breakTimer = 0 + breakElapsed = 0 + activeTime = 0 + + if settings.enable_notifications then + noctalia.notify( + noctalia.tr("notifications.eyecare-break-finished-title"), + noctalia.tr("notifications.eyecare-break-finished-body") + ) + end + if settings.enable_sound then + playSound("complete") + end + end + else + -- Not in break + if isSystemIdle then + idleTime = idleTime + 1 + -- Natural break detection (user rested without prompting) + if idleTime >= settings.break_duration_seconds then + activeTime = 0 + end + else + idleTime = 0 + activeTime = activeTime + 1 + if activeTime >= settings.active_duration_minutes * 60 then + -- Trigger Break Reminder + inBreak = true + breakTimer = 0 + breakElapsed = 0 + activeTime = 0 + + if settings.enable_notifications then + noctalia.notify( + noctalia.tr("notifications.eyecare-break-title"), + noctalia.tr("notifications.eyecare-break-body") + ) + end + if settings.enable_sound then + playSound("message") + end + end + end + end + + updateState() +end + +-- Helper functions for timer state transitions +local function triggerBreak() + inBreak = true + breakTimer = 0 + breakElapsed = 0 + activeTime = 0 + + if settings.enable_notifications then + noctalia.notify( + noctalia.tr("notifications.eyecare-break-title"), + noctalia.tr("notifications.eyecare-break-body") + ) + end + if settings.enable_sound then + playSound("message") + end +end + +local function abortBreak() + inBreak = false + breakTimer = 0 + breakElapsed = 0 + activeTime = 0 +end + +local function resetTimer() + inBreak = false + breakTimer = 0 + breakElapsed = 0 + activeTime = 0 + idleTime = 0 +end + +-- Listen to compositor IPC commands +function onIpc(event, payload) + if event == "idled" then + isSystemIdle = true + elseif event == "active" then + isSystemIdle = false + elseif event == "trigger-break" then + triggerBreak() + elseif event == "finish-break" or event == "abort-break" then + abortBreak() + elseif event == "reset" then + resetTimer() + end + updateState() +end + +-- Watch widget-triggered requests in-process +noctalia.state.watch("eyecare-request", function(req) + if req == "trigger-break" then + triggerBreak() + noctalia.state.set("eyecare-request", nil) + elseif req == "abort-break" then + abortBreak() + noctalia.state.set("eyecare-request", nil) + elseif req == "reset" then + resetTimer() + noctalia.state.set("eyecare-request", nil) + end + updateState() +end) + +-- Initialize automatic DBus monitor stream hooks (zero-config fallback) +if noctalia.commandExists("dbus-monitor") then + noctalia.log("eyecare: dbus-monitor found, starting automatic screensaver & lock streams") + + local sessionLoop = 'P=$PPID; while kill -0 "$P" 2>/dev/null; do dbus-monitor --session "interface=\'org.freedesktop.ScreenSaver\'" 2>/dev/null; sleep 3; done' + noctalia.runStream(sessionLoop, function(line) + if string.find(line, "ActiveChanged") then + lastLineWasActiveChanged = true + elseif lastLineWasActiveChanged then + lastLineWasActiveChanged = false + if string.find(line, "true") then + isSystemIdle = true + updateState() + elseif string.find(line, "false") then + isSystemIdle = false + updateState() + end + end + end) + + local systemLoop = 'P=$PPID; while kill -0 "$P" 2>/dev/null; do dbus-monitor --system "interface=\'org.freedesktop.login1.Session\'" 2>/dev/null; sleep 3; done' + noctalia.runStream(systemLoop, function(line) + if string.find(line, "member=Lock") then + isSystemIdle = true + updateState() + elseif string.find(line, "member=Unlock") then + isSystemIdle = false + updateState() + end + end) +else + noctalia.log("eyecare: dbus-monitor not found on system path") +end + +-- Initialize the shared state +updateState() diff --git a/eyecare/thumbnail.webp b/eyecare/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..d8f0aa34da814eb175d7b259bfb690dc4d7f4e41 GIT binary patch literal 63194 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 F1^`kQM&bYf literal 0 HcmV?d00001 diff --git a/eyecare/translations/en.json b/eyecare/translations/en.json new file mode 100644 index 0000000..58a3bc4 --- /dev/null +++ b/eyecare/translations/en.json @@ -0,0 +1,15 @@ +{ + "settings.eyecare-active-duration.label": "Active Duration", + "settings.eyecare-active-duration.description": "Active screen time before triggering a break (minutes)", + "settings.eyecare-break-duration.label": "Break Duration", + "settings.eyecare-break-duration.description": "Required duration for eye-care breaks (seconds)", + "settings.eyecare-sound.label": "Enable Audio Feedback", + "settings.eyecare-sound.description": "Play notification sound when breaks start or finish", + "settings.eyecare-notifications.label": "Enable Notifications", + "settings.eyecare-notifications.description": "Show system-level notifications for reminders", + + "notifications.eyecare-break-title": "Time for a break", + "notifications.eyecare-break-body": "Focus on an object 20 feet away for 20 seconds.", + "notifications.eyecare-break-finished-title": "Break finished", + "notifications.eyecare-break-finished-body": "Your eyes are rested. You can return to your screen." +} diff --git a/eyecare/widget.luau b/eyecare/widget.luau new file mode 100644 index 0000000..c8ab940 --- /dev/null +++ b/eyecare/widget.luau @@ -0,0 +1,101 @@ +--!nonstrict + +local inBreak = false +local activeTime = 0 +local breakTimer = 0 +local breakElapsed = 0 +local idleTime = 0 +local isSystemIdle = false +local activeDurationMinutes = 20 +local breakDurationSeconds = 20 + +local function formatTime(seconds) + local mins = math.floor(seconds / 60) + local secs = seconds % 60 + return string.format("%02d:%02d", mins, secs) +end + +local function render() + if isSystemIdle then + barWidget.setGlyph("coffee") + barWidget.setText(string.format("Idle: %ds", idleTime)) + barWidget.setTooltip("System is idle. Resting eyes...") + barWidget.setGlyphColor("#26a69a") -- Teal + barWidget.setColor("#ffffff") + return + end + + if inBreak then + barWidget.setGlyph("hourglass") + local remaining = math.max(0, breakDurationSeconds - breakTimer) + barWidget.setText(string.format("Break: %ds", remaining)) + barWidget.setTooltip(string.format("Break in progress! Look 20ft away.\nTime remaining: %ds\nClick to abort early\nRight-click to reset", remaining)) + barWidget.setGlyphColor("#ff5252") -- Soft Red + barWidget.setColor("#ff5252") + else + barWidget.setGlyph("eye") + local activeLimit = activeDurationMinutes * 60 + local remaining = math.max(0, activeLimit - activeTime) + barWidget.setText(formatTime(remaining)) + barWidget.setTooltip(string.format("Eye-Care timer active.\nTime remaining: %s\nClick to start break manually\nRight-click to reset", formatTime(remaining))) + barWidget.setGlyphColor("#00e676") -- Vibrant Green + barWidget.setColor("#ffffff") + end +end + +-- Watch state updates +noctalia.state.watch("eyecare-in-break", function(val) + inBreak = val == true + render() +end) + +noctalia.state.watch("eyecare-active-time", function(val) + activeTime = tonumber(val) or 0 + render() +end) + +noctalia.state.watch("eyecare-break-timer", function(val) + breakTimer = tonumber(val) or 0 + render() +end) + +noctalia.state.watch("eyecare-break-elapsed", function(val) + breakElapsed = tonumber(val) or 0 + render() +end) + +noctalia.state.watch("eyecare-idle-time", function(val) + idleTime = tonumber(val) or 0 + render() +end) + +noctalia.state.watch("eyecare-is-system-idle", function(val) + isSystemIdle = val == true + render() +end) + +noctalia.state.watch("eyecare-active-duration-minutes", function(val) + activeDurationMinutes = tonumber(val) or 20 + render() +end) + +noctalia.state.watch("eyecare-break-duration-seconds", function(val) + breakDurationSeconds = tonumber(val) or 20 + render() +end) + +function onClick() + if inBreak then + noctalia.state.set("eyecare-request", "abort-break") + else + noctalia.state.set("eyecare-request", "trigger-break") + end +end + +function onRightClick() + noctalia.state.set("eyecare-request", "reset") + noctalia.notify("Eye-Care", "Timer has been reset.") +end + +-- Initial render +render()