126 lines
3.0 KiB
TypeScript
126 lines
3.0 KiB
TypeScript
import { bind, exec, execAsync, monitorFile, readFile, writeFile } from "astal"
|
|
import { Astal, Gtk, Gdk, Widget } from "astal/gtk3";
|
|
import { Box } from "astal/gtk3/widget";
|
|
import { popup } from "./popup"
|
|
const { TOP, LEFT } = Astal.WindowAnchor
|
|
|
|
const backlight = "/sys/class/backlight/intel_backlight/brightness"
|
|
|
|
function brightnessSlider(display) {
|
|
let slider: Widget.Slider = <box vertical={true} className="volSlider">
|
|
<box>
|
|
<icon
|
|
icon="display"
|
|
css="font-size: 32px; margin-right: 6px;"
|
|
/>
|
|
<label>{display}</label>
|
|
</box>
|
|
<slider
|
|
halign={Gtk.Align.START}
|
|
valign={Gtk.Align.CENTER}
|
|
min={0}
|
|
max={19393}
|
|
value={Number(readFile(backlight))}
|
|
onDragged={(self) => {
|
|
exec(`brightnessctl s ${self.value}`)
|
|
}}
|
|
setup={(self) => {
|
|
/*
|
|
monitorFile(backlight, (file, event) => {
|
|
self.value = Number(readFile(file))
|
|
})
|
|
*/
|
|
}}
|
|
/>
|
|
</box>
|
|
return slider
|
|
}
|
|
|
|
function sunset() {
|
|
try {
|
|
exec("pgrep -x hyprsunset")
|
|
return true
|
|
}
|
|
catch (e) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
function BrightWindow() {
|
|
let toggleIndicator: Box = <box
|
|
halign={Gtk.Align.END}
|
|
valign={Gtk.Align.CENTER}
|
|
className={(sunset()) ? "toggleIndicator active" : "toggleIndicator inactive"}
|
|
/>
|
|
return <window
|
|
className="popupWindow"
|
|
anchor={TOP | LEFT}
|
|
namespace="lazerpopup">
|
|
<box
|
|
vertical={true}
|
|
css="margin-left: 130px;">
|
|
{brightnessSlider("DP-1")}
|
|
<button
|
|
className="toggleButton"
|
|
onClicked={(self) => {
|
|
toggleIndicator.toggleClassName("active", !sunset())
|
|
execAsync("/home/protoshark/.config/scripts/sunset-toggle.sh")
|
|
.then((out) => (console.log(out)))
|
|
.catch((out) => (console.log(out)))
|
|
}}
|
|
><overlay overlay={toggleIndicator}>
|
|
<label halign={Gtk.Align.START}>Night Light</label>
|
|
</overlay></button>
|
|
</box>
|
|
</window>
|
|
}
|
|
|
|
export default function brightness() {
|
|
let brightnessBar = <levelbar
|
|
valign={Gtk.Align.CENTER}
|
|
vertical={true}
|
|
inverted={true}
|
|
minValue={0}
|
|
maxValue={19393}
|
|
heightRequest={24}
|
|
value={Number(readFile("/sys/class/backlight/intel_backlight/brightness"))}
|
|
/>
|
|
{monitorFile("/sys/class/backlight/intel_backlight/brightness", (file, event) => {
|
|
brightnessBar.value = readFile(file)
|
|
})}
|
|
return <button
|
|
className="scroller"
|
|
onScroll={(self, diff) => {
|
|
brightnessBar.value -= diff.delta_y*50
|
|
exec(`brightnessctl s ${brightnessBar.value}`)
|
|
}}
|
|
onClicked={(self) => {
|
|
if (popup.state !== "brightness") {
|
|
if (popup.window) {
|
|
popup.window.destroy()
|
|
popup.window = null
|
|
}
|
|
popup.window = BrightWindow();
|
|
popup.state = "brightness"
|
|
self.toggleClassName("selected", true)
|
|
self.hook(popup.window, "destroy", () => {
|
|
self.toggleClassName("selected", false)
|
|
})
|
|
} else {
|
|
if (popup.window) {
|
|
popup.window.destroy()
|
|
popup.window = null
|
|
}
|
|
popup.state = ""
|
|
}
|
|
}}>
|
|
<box>
|
|
<icon
|
|
icon="brightness-symbolic"
|
|
css="font-size: 22px; color: white;"
|
|
/>
|
|
{brightnessBar}
|
|
</box>
|
|
</button>
|
|
}
|