From 2eaa37fe3cb29633cc3255a5b456b2829e322e82 Mon Sep 17 00:00:00 2001 From: Simon Bruder Date: Sat, 21 Aug 2021 11:24:37 +0200 Subject: [PATCH] WIP: upower stuff for bluetooth battery level display --- modules/gui.nix | 2 + users/simon/modules/sway/upower.py | 61 ++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 users/simon/modules/sway/upower.py diff --git a/modules/gui.nix b/modules/gui.nix index e8e2097..d9df67e 100644 --- a/modules/gui.nix +++ b/modules/gui.nix @@ -22,6 +22,8 @@ lib.mkIf config.sbruder.gui.enable { # steam (and other high quality software) still ships 32 bit binaries hardware.opengl.driSupport32Bit = lib.mkDefault pkgs.stdenv.isx86_64; + services.upower.enable = true; + environment.systemPackages = with pkgs; [ pkgs.gnome3.adwaita-icon-theme # lutris requires system-wide installation ]; diff --git a/users/simon/modules/sway/upower.py b/users/simon/modules/sway/upower.py new file mode 100644 index 0000000..d910d66 --- /dev/null +++ b/users/simon/modules/sway/upower.py @@ -0,0 +1,61 @@ +from xml.etree import ElementTree +import dbus +import re + + +def undbusify_dict_inner(tup): + k, v = tup + k = str(k) + + if type(v) == dbus.String: + v = str(v) + elif type(v) == dbus.Double: + v = float(v) + elif type(v) == dbus.UInt32 or type(v) == dbus.UInt64 or type(v) == dbus.Int64: + v = int(v) + elif type(v) == dbus.Boolean: + v = bool(v) + + return k, v + + +def undbusify_dict(d): + return dict(map(undbusify_dict_inner, d.items())) + + +def get_upower_devices(bus): + obj = bus.get_object("org.freedesktop.UPower", "/org/freedesktop/UPower/devices") + iface = dbus.Interface(obj, "org.freedesktop.DBus.Introspectable") + + for child in ElementTree.fromstring(iface.Introspect()): + yield child.attrib["name"] + + +def get_upower_device_props(bus, device): + obj = bus.get_object( + "org.freedesktop.UPower", f"/org/freedesktop/UPower/devices/{device}" + ) + return undbusify_dict( + obj.GetAll( + "org.freedesktop.UPower.Device", + dbus_interface="org.freedesktop.DBus.Properties", + ) + ) + + +def device_pred(device: str) -> bool: + return re.match("gaming_input_hid_.*_battery", device) + + +bus = dbus.SystemBus() + +devices = filter(device_pred, get_upower_devices(bus)) +for device in devices: + props = get_upower_device_props(bus, device) + pretty_device_name = ( + props["Vendor"] + + " " * bool(props["Vendor"]) * bool(props["Model"]) + + props["Model"] + ) + percentage = props["Percentage"] + print(pretty_device_name, percentage)