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.
This commit is contained in:
2026-07-13 16:51:07 +02:00
parent eabd92c0e3
commit da1506c156
+34 -16
View File
@@ -6,7 +6,6 @@ import { execAsync } from "ags/process"
import { readFile } from "ags/file" import { readFile } from "ags/file"
import { createBinding, createState, createComputed, createEffect } from "ags" import { createBinding, createState, createComputed, createEffect } from "ags"
import Hyprland from "gi://AstalHyprland" import Hyprland from "gi://AstalHyprland"
import Brightness from "gi://AstalBrightness"
const { TOP, BOTTOM, LEFT, RIGHT } = Astal.WindowAnchor const { TOP, BOTTOM, LEFT, RIGHT } = Astal.WindowAnchor
@@ -32,20 +31,34 @@ function einkRefresh() {
class BrightnessController { class BrightnessController {
constructor() { constructor() {
this.astal = Brightness.get_default() const [level, setLevel] = createState(100)
this.screen = this.astal?.screen this.level = level
this.setLevel = setLevel
this.updateFromSystem()
} }
get current() { async updateFromSystem() {
if (!this.screen) return 0 try {
return Math.round(this.screen.brightness * 100) 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) { async set(level) {
if (!this.screen) return try {
this.screen.brightness = level / 100 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 // PineNote: force an e-ink refresh so the brightness change is visible
einkRefresh() einkRefresh()
} catch (err) {
notify(`Failed to set brightness: ${err.message}`)
}
} }
} }
@@ -110,9 +123,9 @@ class PowerManager {
class LauncherManager { class LauncherManager {
launch(appType) { launch(appType) {
const launchers = { const launchers = {
terminal: "alacritty", terminal: "foot",
browser: "brave-browser", browser: "firefox",
"e-reader": "calibre", "e-reader": "koreader",
} }
const cmd = launchers[appType] const cmd = launchers[appType]
@@ -126,7 +139,7 @@ class LauncherManager {
class RefreshController { class RefreshController {
async triggerRefresh() { async triggerRefresh() {
try { try {
await execAsync(["pdlc-cli", "--refresh"]) await execAsync(["bash", "-c", "/home/fegger/.local/bin/pinenote-refresh"])
notify("E-ink display refreshed") notify("E-ink display refreshed")
} catch (err) { } catch (err) {
console.log(`Failed to refresh display: ${err.message}`) console.log(`Failed to refresh display: ${err.message}`)
@@ -176,9 +189,14 @@ function PinenoteShell() {
if (visible()) einkRefresh() if (visible()) einkRefresh()
}) })
const brightnessLevel = brightness.screen const brightnessLevel = brightness.level
? createBinding(brightness.screen, "brightness")((v) => Math.round((v || 0) * 100))
: createState(100)[0] // Keep the reactive value in sync with the system whenever the widget opens.
createEffect(() => {
if (visible()) {
brightness.updateFromSystem()
}
})
const currentWaveform = waveform.current[0] const currentWaveform = waveform.current[0]