[AGS] Bar progress
This commit is contained in:
71
config/astal/components/bar/util/brightness.ts
Normal file
71
config/astal/components/bar/util/brightness.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import GObject, { register, property } from "astal/gobject"
|
||||
import { monitorFile, readFileAsync } from "astal/file"
|
||||
import { exec, execAsync } from "astal/process"
|
||||
|
||||
const get = (args: string) => Number(exec(`brightnessctl ${args}`))
|
||||
const screen = exec(`bash -c "ls -w1 /sys/class/backlight | head -1"`)
|
||||
const kbd = exec(`bash -c "ls -w1 /sys/class/leds | head -1"`)
|
||||
|
||||
@register({ GTypeName: "Brightness" })
|
||||
export default class Brightness extends GObject.Object {
|
||||
static instance: Brightness
|
||||
static get_default() {
|
||||
if (!this.instance)
|
||||
this.instance = new Brightness()
|
||||
|
||||
return this.instance
|
||||
}
|
||||
|
||||
#kbdMax = get(`--device ${kbd} max`)
|
||||
#kbd = get(`--device ${kbd} get`)
|
||||
#screenMax = get("max")
|
||||
#screen = get("get") / (get("max") || 1)
|
||||
|
||||
@property(Number)
|
||||
get kbd() { return this.#kbd }
|
||||
|
||||
set kbd(value) {
|
||||
if (value < 0 || value > this.#kbdMax)
|
||||
return
|
||||
|
||||
execAsync(`brightnessctl -d ${kbd} s ${value} -q`).then(() => {
|
||||
this.#kbd = value
|
||||
this.notify("kbd")
|
||||
})
|
||||
}
|
||||
|
||||
@property(Number)
|
||||
get screen() { return this.#screen }
|
||||
|
||||
set screen(percent) {
|
||||
if (percent < 0)
|
||||
percent = 0
|
||||
|
||||
if (percent > 1)
|
||||
percent = 1
|
||||
|
||||
execAsync(`brightnessctl set ${Math.floor(percent * 100)}% -q`).then(() => {
|
||||
this.#screen = percent
|
||||
this.notify("screen")
|
||||
})
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
|
||||
const screenPath = `/sys/class/backlight/${screen}/brightness`
|
||||
const kbdPath = `/sys/class/leds/${kbd}/brightness`
|
||||
|
||||
monitorFile(screenPath, async f => {
|
||||
const v = await readFileAsync(f)
|
||||
this.#screen = Number(v) / this.#screenMax
|
||||
this.notify("screen")
|
||||
})
|
||||
|
||||
monitorFile(kbdPath, async f => {
|
||||
const v = await readFileAsync(f)
|
||||
this.#kbd = Number(v) / this.#kbdMax
|
||||
this.notify("kbd")
|
||||
})
|
||||
}
|
||||
}
|
@@ -1,68 +0,0 @@
|
||||
import AstalHyprland from "gi://AstalHyprland";
|
||||
|
||||
const getAvailableWorkspaces = (): number[] => {
|
||||
const workspaces: number[] = [];
|
||||
AstalHyprland.get_default().get_workspaces().forEach( val => {
|
||||
workspaces.push( val.get_id() );
|
||||
} )
|
||||
return workspaces;
|
||||
}
|
||||
|
||||
const getCurrentWorkspaceID = (): number => {
|
||||
return AstalHyprland.get_default().get_focused_workspace().get_id();
|
||||
}
|
||||
|
||||
const getCurrentWindowTitle = (): string => {
|
||||
return AstalHyprland.get_default().get_focused_client().get_title();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the workspace ID of a window by its address
|
||||
* @param address - The address of the window
|
||||
* @returns The workspace ID
|
||||
*/
|
||||
const getWorkspaceIDOfWindowByAddress = ( address: string ): number => {
|
||||
AstalHyprland.get_default().get_clients().forEach( client => {
|
||||
if ( client.get_address() === address ) {
|
||||
return client.get_workspace().get_id();
|
||||
}
|
||||
} );
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
interface HyprlandSubscriptions {
|
||||
[key: string]: ( data: string ) => void;
|
||||
}
|
||||
const hooks: HyprlandSubscriptions = {};
|
||||
|
||||
/**
|
||||
* Add an event listener for Hyprland events.
|
||||
* @param event - A hyprland IPC event. See https://wiki.hyprland.org/IPC/. Useful events include: urgent, windowtitlev2, workspace, createworkspacev2, destroyworkspacev2, activewindowv2
|
||||
* @param cb - The callback function
|
||||
*/
|
||||
const subscribeToUpdates = ( event: string, cb: ( data: string ) => void ): void => {
|
||||
hooks[ event ] = cb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Listen to events. Must be called at some point if events are to be listened for
|
||||
*/
|
||||
const listen = () => {
|
||||
AstalHyprland.get_default().connect( "event", ( name: string, data: string ) => {
|
||||
if ( hooks[ name ] ) {
|
||||
hooks[ name ]( data );
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
|
||||
export default {
|
||||
getAvailableWorkspaces,
|
||||
getCurrentWorkspaceID,
|
||||
getCurrentWindowTitle,
|
||||
getWorkspaceIDOfWindowByAddress,
|
||||
subscribeToUpdates,
|
||||
listen
|
||||
}
|
Reference in New Issue
Block a user