80 lines
1.8 KiB
JavaScript
80 lines
1.8 KiB
JavaScript
import { Service, Utils } from "../imports.js";
|
|
import Gio from "gi://Gio";
|
|
import GLib from "gi://GLib";
|
|
|
|
const clamp = (num, min, max) => Math.min(Math.max(num, min), max);
|
|
|
|
class BrightnessService extends Service {
|
|
static {
|
|
Service.register(
|
|
this,
|
|
{ "screen-changed": ["float"] },
|
|
{ "screen-value": ["float", "rw"] },
|
|
);
|
|
}
|
|
|
|
#screenValue = 0;
|
|
|
|
#interface = Utils.exec("sh -c 'ls -w1 /sys/class/backlight | head -1'");
|
|
#path = `/sys/class/backlight/${this.#interface}`;
|
|
#brightness = `${this.#path}/brightness`;
|
|
|
|
#max = Number(Utils.readFile(`${this.#path}/max_brightness`));
|
|
|
|
get screen_value() {
|
|
return this.#screenValue;
|
|
}
|
|
|
|
set screen_value(percent) {
|
|
percent = clamp(percent, 0, 1);
|
|
this.#screenValue = percent;
|
|
|
|
const file = Gio.File.new_for_path(this.#brightness);
|
|
const string = `${Math.round(percent * this.#max)}`;
|
|
|
|
new Promise((resolve, _) => {
|
|
file.replace_contents_bytes_async(
|
|
new GLib.Bytes(new TextEncoder().encode(string)),
|
|
null,
|
|
false,
|
|
Gio.FileCreateFlags.NONE,
|
|
null,
|
|
(self, res) => {
|
|
try {
|
|
self.replace_contents_finish(res);
|
|
resolve(self);
|
|
} catch (error) {
|
|
print(error);
|
|
}
|
|
},
|
|
);
|
|
});
|
|
}
|
|
|
|
constructor() {
|
|
super();
|
|
|
|
this.#updateScreenValue();
|
|
Utils.monitorFile(this.#brightness, () => this.#onChange());
|
|
}
|
|
|
|
#updateScreenValue() {
|
|
this.#screenValue = Number(Utils.readFile(this.#brightness)) / this.#max;
|
|
}
|
|
|
|
#onChange() {
|
|
this.#updateScreenValue();
|
|
|
|
this.notify("screen-value");
|
|
this.emit("screen-changed", this.#screenValue);
|
|
}
|
|
|
|
connectWidget(widget, callback, event = "screen-changed") {
|
|
super.connectWidget(widget, callback, event);
|
|
}
|
|
}
|
|
|
|
const service = new BrightnessService();
|
|
|
|
export default service;
|