summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/gi-docs.yml4
-rw-r--r--.github/workflows/vitepress.yml1
-rw-r--r--core/gjs/src/binding.ts41
-rw-r--r--docs/libraries/battery.md6
-rw-r--r--flake.nix2
-rw-r--r--lib/battery/cli.vala30
-rw-r--r--lib/battery/device.vala4
-rw-r--r--lib/battery/meson.build1
-rw-r--r--lib/mpris/player.vala12
-rw-r--r--lib/notifd/notification.vala16
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
```
:::
diff --git a/flake.nix b/flake.nix
index 04ea609..e3451b6 100644
--- a/flake.nix
+++ b/flake.nix
@@ -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);