diff --git a/pinenote-shell/src/main.js b/pinenote-shell/src/main.js index 034c9ce..8ee64f1 100644 --- a/pinenote-shell/src/main.js +++ b/pinenote-shell/src/main.js @@ -6,7 +6,6 @@ import { execAsync } from "ags/process" import { readFile } from "ags/file" import { createBinding, createState, createComputed, createEffect } from "ags" import Hyprland from "gi://AstalHyprland" -import Brightness from "gi://AstalBrightness" const { TOP, BOTTOM, LEFT, RIGHT } = Astal.WindowAnchor @@ -32,20 +31,34 @@ function einkRefresh() { class BrightnessController { constructor() { - this.astal = Brightness.get_default() - this.screen = this.astal?.screen + const [level, setLevel] = createState(100) + this.level = level + this.setLevel = setLevel + this.updateFromSystem() } - get current() { - if (!this.screen) return 0 - return Math.round(this.screen.brightness * 100) + async updateFromSystem() { + try { + const info = await execAsync(["brightnessctl", "-m"]) + const parts = info.split(",") + // brightnessctl -m output: device,class,current%,value,max + const percent = parseInt(parts[2], 10) + this.setLevel(Number.isNaN(percent) ? 100 : percent) + } catch (err) { + console.log(`Could not read brightness: ${err.message}`) + } } - set(level) { - if (!this.screen) return - this.screen.brightness = level / 100 - // PineNote: force an e-ink refresh so the brightness change is visible - einkRefresh() + async set(level) { + try { + await execAsync(["brightnessctl", "set", `${level}%`]) + this.setLevel(level) + notify(`Brightness set to ${level}%`) + // PineNote: force an e-ink refresh so the brightness change is visible + einkRefresh() + } catch (err) { + notify(`Failed to set brightness: ${err.message}`) + } } } @@ -110,9 +123,9 @@ class PowerManager { class LauncherManager { launch(appType) { const launchers = { - terminal: "alacritty", - browser: "brave-browser", - "e-reader": "calibre", + terminal: "foot", + browser: "firefox", + "e-reader": "koreader", } const cmd = launchers[appType] @@ -126,7 +139,7 @@ class LauncherManager { class RefreshController { async triggerRefresh() { try { - await execAsync(["pdlc-cli", "--refresh"]) + await execAsync(["bash", "-c", "/home/fegger/.local/bin/pinenote-refresh"]) notify("E-ink display refreshed") } catch (err) { console.log(`Failed to refresh display: ${err.message}`) @@ -176,9 +189,14 @@ function PinenoteShell() { if (visible()) einkRefresh() }) - const brightnessLevel = brightness.screen - ? createBinding(brightness.screen, "brightness")((v) => Math.round((v || 0) * 100)) - : createState(100)[0] + const brightnessLevel = brightness.level + + // Keep the reactive value in sync with the system whenever the widget opens. + createEffect(() => { + if (visible()) { + brightness.updateFromSystem() + } + }) const currentWaveform = waveform.current[0]