diff options
-rw-r--r-- | .github/workflows/gi-docs.yml | 4 | ||||
-rw-r--r-- | .github/workflows/vitepress.yml | 1 | ||||
-rw-r--r-- | core/gjs/src/binding.ts | 41 | ||||
-rw-r--r-- | docs/libraries/battery.md | 6 | ||||
-rw-r--r-- | flake.nix | 2 | ||||
-rw-r--r-- | lib/battery/cli.vala | 30 | ||||
-rw-r--r-- | lib/battery/device.vala | 4 | ||||
-rw-r--r-- | lib/battery/meson.build | 1 | ||||
-rw-r--r-- | lib/mpris/player.vala | 12 | ||||
-rw-r--r-- | lib/notifd/notification.vala | 16 |
10 files changed, 55 insertions, 62 deletions
diff --git a/.github/workflows/gi-docs.yml b/.github/workflows/gi-docs.yml index 48bb05f..d0ac9b8 100644 --- a/.github/workflows/gi-docs.yml +++ b/.github/workflows/gi-docs.yml @@ -46,10 +46,6 @@ jobs: rm -rf dist/libastal cp -r src/result/libastal dist/libastal - - name: Check for Changes - run: | - cd dist - - name: Push to Pages Repo run: | cd dist diff --git a/.github/workflows/vitepress.yml b/.github/workflows/vitepress.yml index 3a90827..4a9b4a5 100644 --- a/.github/workflows/vitepress.yml +++ b/.github/workflows/vitepress.yml @@ -45,7 +45,6 @@ jobs: url: ${{ steps.deployment.outputs.page_url }} needs: build-vitepress runs-on: ubuntu-latest - name: Deploy steps: - name: Deploy to GitHub Pages id: deployment diff --git a/core/gjs/src/binding.ts b/core/gjs/src/binding.ts index feec6fc..95d905f 100644 --- a/core/gjs/src/binding.ts +++ b/core/gjs/src/binding.ts @@ -21,10 +21,11 @@ export interface Connectable { } export default class Binding<Value> { - private emitter: Subscribable<Value> | Connectable - private prop?: string private transformFn = (v: any) => v + #emitter: Subscribable<Value> | Connectable + #prop?: string + static bind< T extends Connectable, P extends keyof T, @@ -37,51 +38,51 @@ export default class Binding<Value> { } private constructor(emitter: Connectable | Subscribable<Value>, prop?: string) { - this.emitter = emitter - this.prop = prop && kebabify(prop) + this.#emitter = emitter + this.#prop = prop && kebabify(prop) } toString() { - return `Binding<${this.emitter}${this.prop ? `, "${this.prop}"` : ""}>` + return `Binding<${this.#emitter}${this.#prop ? `, "${this.#prop}"` : ""}>` } as<T>(fn: (v: Value) => T): Binding<T> { - const bind = new Binding(this.emitter, this.prop) + const bind = new Binding(this.#emitter, this.#prop) bind.transformFn = (v: Value) => fn(this.transformFn(v)) return bind as unknown as Binding<T> } get(): Value { - if (typeof this.emitter.get === "function") - return this.transformFn(this.emitter.get()) + if (typeof this.#emitter.get === "function") + return this.transformFn(this.#emitter.get()) - if (typeof this.prop === "string") { - const getter = `get_${snakeify(this.prop)}` - if (typeof this.emitter[getter] === "function") - return this.transformFn(this.emitter[getter]()) + if (typeof this.#prop === "string") { + const getter = `get_${snakeify(this.#prop)}` + if (typeof this.#emitter[getter] === "function") + return this.transformFn(this.#emitter[getter]()) - return this.transformFn(this.emitter[this.prop]) + return this.transformFn(this.#emitter[this.#prop]) } throw Error("can not get value of binding") } subscribe(callback: (value: Value) => void): () => void { - if (typeof this.emitter.subscribe === "function") { - return this.emitter.subscribe(() => { + if (typeof this.#emitter.subscribe === "function") { + return this.#emitter.subscribe(() => { callback(this.get()) }) } - else if (typeof this.emitter.connect === "function") { - const signal = `notify::${this.prop}` - const id = this.emitter.connect(signal, () => { + else if (typeof this.#emitter.connect === "function") { + const signal = `notify::${this.#prop}` + const id = this.#emitter.connect(signal, () => { callback(this.get()) }) return () => { - (this.emitter.disconnect as Connectable["disconnect"])(id) + (this.#emitter.disconnect as Connectable["disconnect"])(id) } } - throw Error(`${this.emitter} is not bindable`) + throw Error(`${this.#emitter} is not bindable`) } } diff --git a/docs/libraries/battery.md b/docs/libraries/battery.md index 5c2c79f..b42d747 100644 --- a/docs/libraries/battery.md +++ b/docs/libraries/battery.md @@ -9,15 +9,15 @@ Library and CLI tool for monitoring [upowerd](https://upower.freedesktop.org/) d :::code-group ```sh [<i class="devicon-archlinux-plain"></i> Arch] -sudo pacman -Syu meson vala gobject-introspection +sudo pacman -Syu meson vala json-glib gobject-introspection ``` ```sh [<i class="devicon-fedora-plain"></i> Fedora] -sudo dnf install meson gcc valac gobject-introspection-devel +sudo dnf install meson gcc valac json-glib-devel gobject-introspection-devel ``` ```sh [<i class="devicon-ubuntu-plain"></i> Ubuntu] -sudo apt install meson valac gobject-introspection +sudo apt install meson valac libjson-glib-dev gobject-introspection ``` ::: @@ -47,7 +47,7 @@ astal = mkPkg "astal" ./core [gtk3 gtk-layer-shell]; apps = mkPkg "astal-apps" ./lib/apps [json-glib]; auth = mkPkg "astal-auth" ./lib/auth [pam]; - battery = mkPkg "astal-battery" ./lib/battery []; + battery = mkPkg "astal-battery" ./lib/battery [json-glib]; bluetooth = mkPkg "astal-bluetooth" ./lib/bluetooth []; hyprland = mkPkg "astal-hyprland" ./lib/hyprland [json-glib]; mpris = mkPkg "astal-mpris" ./lib/mpris [gvfs json-glib]; diff --git a/lib/battery/cli.vala b/lib/battery/cli.vala index 710edec..c51264b 100644 --- a/lib/battery/cli.vala +++ b/lib/battery/cli.vala @@ -37,38 +37,14 @@ int main(string[] argv) { } var battery = AstalBattery.get_default(); - print("%s\n", to_json(battery)); + print("%s\n", Json.gobject_to_data(battery, null)); if (monitor) { - battery.notify.connect((prop) => { - if (prop.get_name() == "percentage" - || prop.get_name() == "state" - || prop.get_name() == "icon-name" - || prop.get_name() == "time-to-full" - || prop.get_name() == "time-to-empty" - ) { - print("%s\n", to_json(battery)); - } + battery.notify.connect(() => { + print("%s\n", Json.gobject_to_data(battery, null)); }); new GLib.MainLoop(null, false).run(); } return 0; } - -private string to_json(AstalBattery.Device device) { - string s = "unknown"; - if (device.state == AstalBattery.State.CHARGING) - s = "charging"; - if (device.state == AstalBattery.State.DISCHARGING) - s = "discharging"; - if (device.state == AstalBattery.State.FULLY_CHARGED) - s = "fully_charged"; - - var p = device.percentage; - var i = device.icon_name; - var r = device.state == AstalBattery.State.CHARGING - ? device.time_to_full : device.time_to_empty; - - return "{ \"percentage\": %f, \"state\": \"%s\", \"icon_name\": \"%s\", \"time_remaining\": %f }".printf(p, s, i, r); -} diff --git a/lib/battery/device.vala b/lib/battery/device.vala index b6c13b8..7193118 100644 --- a/lib/battery/device.vala +++ b/lib/battery/device.vala @@ -102,10 +102,10 @@ public class Device : Object { if (!is_battery) { battery_icon_name = "battery-missing-symbolic"; } else if (percentage == 1.0 && charging) { - battery_icon_name = "battery-level-100-charged"; + battery_icon_name = "battery-level-100-charged-symbolic"; } else { var state = charging ? "-charging" : ""; - var level = (int)Math.round(percentage * 100); + var level = (int)Math.round(percentage * 10)*10; battery_icon_name = @"battery-level-$level$state-symbolic"; } diff --git a/lib/battery/meson.build b/lib/battery/meson.build index f9751d0..584f66d 100644 --- a/lib/battery/meson.build +++ b/lib/battery/meson.build @@ -36,6 +36,7 @@ pkgconfig_deps = [ dependency('glib-2.0'), dependency('gio-2.0'), dependency('gobject-2.0'), + dependency('json-glib-1.0'), ] deps = pkgconfig_deps + meson.get_compiler('c').find_library('m') diff --git a/lib/mpris/player.vala b/lib/mpris/player.vala index ed146f6..6764d2b 100644 --- a/lib/mpris/player.vala +++ b/lib/mpris/player.vala @@ -245,10 +245,16 @@ public class Player : Object { // metadata metadata = proxy.metadata; if (metadata != null) { - if (metadata.get("mpris:length") != null) - length = (double)metadata.get("mpris:length").get_uint64() / 1000000; - else + if (metadata.get("mpris:length") != null) { + var v = metadata.get("mpris:length"); + if (v.get_type_string() == "x") { + length = (double)v.get_int64() / 1000000; + } else if (v.get_type_string() == "t") { + length = (double)v.get_uint64() / 1000000; + } + } else { length = -1; + } trackid = get_str("mpris:trackid"); art_url = get_str("mpris:artUrl"); diff --git a/lib/notifd/notification.vala b/lib/notifd/notification.vala index 66eaccd..74b428e 100644 --- a/lib/notifd/notification.vala +++ b/lib/notifd/notification.vala @@ -33,7 +33,7 @@ public class AstalNotifd.Notification : Object { public bool transient { get { return get_bool_hint("transient"); } } public int x { get { return get_int_hint("x"); } } public int y { get { return get_int_hint("y"); } } - public Urgency urgency { get { return get_hint("urgency").get_byte(); } } + public Urgency urgency { get { return get_byte_hint("urgency"); } } internal Notification( string app_name, @@ -81,6 +81,20 @@ public class AstalNotifd.Notification : Object { return hints.contains(hint) ? hints.get(hint).get_int32() : 0; } + public uint8 get_byte_hint(string hint) { + if (!hints.contains(hint)) + return 0; + + var v = hints.get(hint); + if (v.get_type_string() == "b") + return v.get_byte(); + + if (v.get_type_string() == "x") + return (uint8)v.get_int64(); + + return 0; + } + public signal void resolved(ClosedReason reason); public signal void dismissed(); public signal void invoked(string action); |