From da1506c156c06f9baf4506d9848334869a39288e Mon Sep 17 00:00:00 2001 From: Florian Egger Date: Mon, 13 Jul 2026 16:51:07 +0200 Subject: [PATCH] Replace AstalBrightness with brightnessctl and update app defaults Switch brightness control from AstalBrightness to `brightnessctl` for better hardware support, with async system sync when the shell opens. Also change default launchers to foot, firefox, and koreader, and update the refresh command to the local pinenote-refresh script. --- pinenote-shell/src/main.js | 54 +++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 18 deletions(-) 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]