From 861a04827a19facd4ce0eb4693de43f64507df52 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Mon, 19 May 2025 21:27:36 +0200 Subject: ... --- accounts/gkleen@sif/niri/waybar.nix | 20 +++- flake.lock | 38 +++---- hosts/sif/default.nix | 25 +---- overlays/waybar-systemd-inhibit/.envrc | 4 + overlays/waybar-systemd-inhibit/.gitignore | 2 + overlays/waybar-systemd-inhibit/default.nix | 35 ++++++ overlays/waybar-systemd-inhibit/pyproject.toml | 17 +++ overlays/waybar-systemd-inhibit/uv.lock | 102 ++++++++++++++++++ .../waybar_systemd_inhibit/__init__.py | 0 .../waybar_systemd_inhibit/__main__.py | 117 +++++++++++++++++++++ shell.nix | 10 ++ 11 files changed, 324 insertions(+), 46 deletions(-) create mode 100644 overlays/waybar-systemd-inhibit/.envrc create mode 100644 overlays/waybar-systemd-inhibit/.gitignore create mode 100644 overlays/waybar-systemd-inhibit/default.nix create mode 100644 overlays/waybar-systemd-inhibit/pyproject.toml create mode 100644 overlays/waybar-systemd-inhibit/uv.lock create mode 100644 overlays/waybar-systemd-inhibit/waybar_systemd_inhibit/__init__.py create mode 100644 overlays/waybar-systemd-inhibit/waybar_systemd_inhibit/__main__.py diff --git a/accounts/gkleen@sif/niri/waybar.nix b/accounts/gkleen@sif/niri/waybar.nix index cc131c08..1de2e1fa 100644 --- a/accounts/gkleen@sif/niri/waybar.nix +++ b/accounts/gkleen@sif/niri/waybar.nix @@ -27,8 +27,14 @@ in { modules-right = [ "custom/worktime" "custom/worktime-today" "custom/weather" "custom/keymap" - "privacy" "tray" "wireplumber" "backlight" "battery" "idle_inhibitor" "custom/mako" "clock" ]; + "privacy" "tray" "wireplumber" "backlight" "battery" "idle_inhibitor" "custom/mako" "custom/lid_inhibitor" "clock" ]; + "custom/lid_inhibitor" = { + format = "{}"; + return-type = "json"; + exec = lib.getExe pkgs.waybar-systemd-inhibit; + on-click = lib.getExe' pkgs.waybar-systemd-inhibit "waybar-systemd-inhibit-toggle"; + }; "custom/mako" = { format = "{}"; return-type = "json"; @@ -211,7 +217,7 @@ in { layer = "top"; position = "top"; height = 14; - output = [ "!eDP-1" "!DP-2" "!DP-3" ]; + output = [ "!eDP-1" "!DP-2" "!DP-3" "*" ]; modules-left = [ "niri/workspaces" ]; modules-center = [ "niri/window" ]; modules-right = [ "clock" ]; @@ -293,7 +299,7 @@ in { #tray { margin: 0; } - #battery, #idle_inhibitor, #backlight, #wireplumber, #custom-mako { + #battery, #idle_inhibitor, #backlight, #wireplumber, #custom-mako, #custom-lid_inhibitor { color: @grey; margin: 0 5px 0 2px; } @@ -302,7 +308,11 @@ in { margin-left: 6px; } #custom-mako { - margin-right: 2px; + margin-right: 4px; + margin-left: 3px; + } + #custom-lid_inhibitor { + margin-right: 3px; margin-left: 3px; } #battery { @@ -330,7 +340,7 @@ in { color: @orange; } - #idle_inhibitor { + #idle_inhibitor, #custom-lid_inhibitor { padding-top: 1px; } diff --git a/flake.lock b/flake.lock index 2e128a69..cab6ae5f 100644 --- a/flake.lock +++ b/flake.lock @@ -397,11 +397,11 @@ "xwayland-satellite-unstable": "xwayland-satellite-unstable" }, "locked": { - "lastModified": 1747491150, - "narHash": "sha256-UpHzUfmxpKko/4f/Nw971wfw+0EgHEJHkoJ3mGQKDkg=", + "lastModified": 1747638609, + "narHash": "sha256-rPTN667tMqC1IQYgsnotVfXbVNbOzScxn0ontMkkSPk=", "owner": "sodiboo", "repo": "niri-flake", - "rev": "ea61079b4d48031087c0c994782c24c846d4b95e", + "rev": "af697f3a8665c8d0770485a2e659ddde88430e3b", "type": "github" }, "original": { @@ -431,11 +431,11 @@ "niri-unstable": { "flake": false, "locked": { - "lastModified": 1747486745, - "narHash": "sha256-ngQ+iTHmBJkEbsjYfCWTJdV8gHhOCTkV8K0at6Y+YHI=", + "lastModified": 1747635487, + "narHash": "sha256-za7ctGh4MaW1h5Drm1WtwNZxiXvQK9yXZAeeIyY9b2Q=", "owner": "YaLTeR", "repo": "niri", - "rev": "ae89cb6017668f3a81ccd92461cbbc70ab8377d0", + "rev": "3f2b7e63ba15cf33475116d32e8b7d22208a8438", "type": "github" }, "original": { @@ -514,11 +514,11 @@ ] }, "locked": { - "lastModified": 1741549407, - "narHash": "sha256-f9SXK+/rvlryDNlc++Eva/hYjbkf7OCalWwmwifRhtI=", + "lastModified": 1747637556, + "narHash": "sha256-AYd1nE+BLWTZS8J0eFQ7kuNiuE+XjhhndoXinj7en/M=", "owner": "AshleyYakeley", "repo": "NixVirt", - "rev": "9950b932dce4ae6b9bda7c83d41705c1a14e10f0", + "rev": "a7d3d3ae8b9a0cf3ec3cf504bb593df0618a6dbc", "type": "github" }, "original": { @@ -651,11 +651,11 @@ }, "nixpkgs-stable_2": { "locked": { - "lastModified": 1747335874, - "narHash": "sha256-IKKIXTSYJMmUtE+Kav5Rob8SgLPnfnq4Qu8LyT4gdqQ=", + "lastModified": 1747485343, + "narHash": "sha256-YbsZyuRE1tobO9sv0PUwg81QryYo3L1F3R3rF9bcG38=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ba8b70ee098bc5654c459d6a95dfc498b91ff858", + "rev": "9b5ac7ad45298d58640540d0323ca217f32a6762", "type": "github" }, "original": { @@ -699,11 +699,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1747574246, - "narHash": "sha256-H+LTRxU/stwhIInrHJXDGd/9Y5qSVnbHOMJ3fUXdZ5o=", - "owner": "gkleen", + "lastModified": 1747542820, + "narHash": "sha256-GaOZntlJ6gPPbbkTLjbd8BMWaDYafhuuYRNrxCGnPJw=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "cfd5dbeaafd2eb3e0359e09745cd0de26115d68e", + "rev": "292fa7d4f6519c074f0a50394dbbe69859bb6043", "type": "github" }, "original": { @@ -962,11 +962,11 @@ ] }, "locked": { - "lastModified": 1746485181, - "narHash": "sha256-PxrrSFLaC7YuItShxmYbMgSuFFuwxBB+qsl9BZUnRvg=", + "lastModified": 1747603214, + "narHash": "sha256-lAblXm0VwifYCJ/ILPXJwlz0qNY07DDYdLD+9H+Wc8o=", "owner": "Mic92", "repo": "sops-nix", - "rev": "e93ee1d900ad264d65e9701a5c6f895683433386", + "rev": "8d215e1c981be3aa37e47aeabd4e61bb069548fd", "type": "github" }, "original": { diff --git a/hosts/sif/default.nix b/hosts/sif/default.nix index f4de24e8..b50cad60 100644 --- a/hosts/sif/default.nix +++ b/hosts/sif/default.nix @@ -403,8 +403,8 @@ in { logind = { lidSwitch = "suspend"; - lidSwitchDocked = "lock"; - lidSwitchExternalPower = "lock"; + lidSwitchDocked = "ignore"; + lidSwitchExternalPower = "ignore"; }; atd = { @@ -610,25 +610,6 @@ in { environment.etc."X11/xorg.conf.d/50-wacom.conf".source = lib.mkForce ./wacom.conf; - systemd.services."ac-plugged" = { - description = "Inhibit handling of lid-switch and sleep"; - - path = with pkgs; [ systemd coreutils ]; - - script = '' - exec systemd-inhibit --what=handle-lid-switch --why="AC is connected" --mode=block sleep infinity - ''; - - serviceConfig = { - Type = "simple"; - }; - }; - - services.udev.extraRules = with pkgs; lib.mkAfter '' - SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="${systemd}/bin/systemctl --no-block stop ac-plugged.service" - SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="1", RUN+="${systemd}/bin/systemctl --no-block start ac-plugged.service" - ''; - systemd.services."nix-daemon".serviceConfig = { MemoryAccounting = true; MemoryHigh = "50%"; @@ -688,7 +669,7 @@ in { directories = [ "/nix" "/root" - "/home" + "/home" "/var/log" "/var/lib/sops-nix" "/var/lib/nixos" diff --git a/overlays/waybar-systemd-inhibit/.envrc b/overlays/waybar-systemd-inhibit/.envrc new file mode 100644 index 00000000..2c909235 --- /dev/null +++ b/overlays/waybar-systemd-inhibit/.envrc @@ -0,0 +1,4 @@ +use flake + +[[ -d ".venv" ]] || ( uv venv && uv sync ) +. .venv/bin/activate diff --git a/overlays/waybar-systemd-inhibit/.gitignore b/overlays/waybar-systemd-inhibit/.gitignore new file mode 100644 index 00000000..4ccfae70 --- /dev/null +++ b/overlays/waybar-systemd-inhibit/.gitignore @@ -0,0 +1,2 @@ +.venv +**/__pycache__ diff --git a/overlays/waybar-systemd-inhibit/default.nix b/overlays/waybar-systemd-inhibit/default.nix new file mode 100644 index 00000000..88322ef5 --- /dev/null +++ b/overlays/waybar-systemd-inhibit/default.nix @@ -0,0 +1,35 @@ +{ prev, final, flakeInputs, ... }: + +with flakeInputs; + +let + workspace = uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ./.; }; + overlay = workspace.mkPyprojectOverlay { + sourcePreference = "wheel"; + }; + python = final.python312; + # hacks = final.callPackage pyproject-nix.build.hacks { }; + pythonSet = + (final.callPackage pyproject-nix.build.packages { + inherit python; + }).overrideScope + ( + prev.lib.composeManyExtensions [ + pyproject-build-systems.overlays.default + overlay + # (final: prev: { + # pygobject = hacks.nixpkgsPrebuilt { + # from = python.pkgs.pygobject3; + # }; + # }) + ] + ); + virtualEnv = pythonSet.mkVirtualEnv "waybar-systemd-inhibit-env" workspace.deps.default; +in { + waybar-systemd-inhibit = virtualEnv.overrideAttrs (oldAttrs: { + meta = (oldAttrs.meta or {}) // { + mainProgram = "waybar-systemd-inhibit"; + }; + nativeBuildInputs = (oldAttrs.nativeBuildInputs or []) ++ [ final.gobject-introspection final.wrapGAppsHook ]; + }); +} diff --git a/overlays/waybar-systemd-inhibit/pyproject.toml b/overlays/waybar-systemd-inhibit/pyproject.toml new file mode 100644 index 00000000..6c6240b8 --- /dev/null +++ b/overlays/waybar-systemd-inhibit/pyproject.toml @@ -0,0 +1,17 @@ +[project] +name = "waybar-systemd-inhibit" +version = "0.1.0" +requires-python = ">=3.12" +dependencies = [ + "asyncclick>=8.1.8", + "asyncio>=3.4.3", + "dbus-next>=0.2.3", +] + +[project.scripts] +waybar-systemd-inhibit = "waybar_systemd_inhibit.__main__:main" +waybar-systemd-inhibit-toggle = "waybar_systemd_inhibit.__main__:toggle" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" diff --git a/overlays/waybar-systemd-inhibit/uv.lock b/overlays/waybar-systemd-inhibit/uv.lock new file mode 100644 index 00000000..4e10d145 --- /dev/null +++ b/overlays/waybar-systemd-inhibit/uv.lock @@ -0,0 +1,102 @@ +version = 1 +revision = 2 +requires-python = ">=3.12" + +[[package]] +name = "anyio" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, +] + +[[package]] +name = "asyncclick" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/b5/e1e5fdf1c1bb7e6e614987c120a98d9324bf8edfaa5f5cd16a6235c9d91b/asyncclick-8.1.8.tar.gz", hash = "sha256:0f0eb0f280e04919d67cf71b9fcdfb4db2d9ff7203669c40284485c149578e4c", size = 232900, upload-time = "2025-01-06T09:46:52.694Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/cc/a436f0fc2d04e57a0697e0f87a03b9eaed03ad043d2d5f887f8eebcec95f/asyncclick-8.1.8-py3-none-any.whl", hash = "sha256:eb1ccb44bc767f8f0695d592c7806fdf5bd575605b4ee246ffd5fadbcfdbd7c6", size = 99093, upload-time = "2025-01-06T09:46:51.046Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/ae9e9d25522c6dc96ff167903880a0fe94d7bd31ed999198ee5017d977ed/asyncclick-8.1.8.0-py3-none-any.whl", hash = "sha256:be146a2d8075d4fe372ff4e877f23c8b5af269d16705c1948123b9415f6fd678", size = 99115, upload-time = "2025-01-06T09:50:52.72Z" }, +] + +[[package]] +name = "asyncio" +version = "3.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/54/054bafaf2c0fb8473d423743e191fcdf49b2c1fd5e9af3524efbe097bafd/asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41", size = 204411, upload-time = "2015-03-10T14:11:26.494Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/74/07679c5b9f98a7cb0fc147b1ef1cc1853bc07a4eb9cb5731e24732c5f773/asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d", size = 101767, upload-time = "2015-03-10T14:05:10.959Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "dbus-next" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/45/6a40fbe886d60a8c26f480e7d12535502b5ba123814b3b9a0b002ebca198/dbus_next-0.2.3.tar.gz", hash = "sha256:f4eae26909332ada528c0a3549dda8d4f088f9b365153952a408e28023a626a5", size = 71112, upload-time = "2021-07-25T22:11:28.398Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/fc/c0a3f4c4eaa5a22fbef91713474666e13d0ea2a69c84532579490a9f2cc8/dbus_next-0.2.3-py3-none-any.whl", hash = "sha256:58948f9aff9db08316734c0be2a120f6dc502124d9642f55e90ac82ffb16a18b", size = 57885, upload-time = "2021-07-25T22:11:25.466Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "waybar-systemd-inhibit" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "asyncclick" }, + { name = "asyncio" }, + { name = "dbus-next" }, +] + +[package.metadata] +requires-dist = [ + { name = "asyncclick", specifier = ">=8.1.8" }, + { name = "asyncio", specifier = ">=3.4.3" }, + { name = "dbus-next", specifier = ">=0.2.3" }, +] diff --git a/overlays/waybar-systemd-inhibit/waybar_systemd_inhibit/__init__.py b/overlays/waybar-systemd-inhibit/waybar_systemd_inhibit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/overlays/waybar-systemd-inhibit/waybar_systemd_inhibit/__main__.py b/overlays/waybar-systemd-inhibit/waybar_systemd_inhibit/__main__.py new file mode 100644 index 00000000..35cc7fd1 --- /dev/null +++ b/overlays/waybar-systemd-inhibit/waybar_systemd_inhibit/__main__.py @@ -0,0 +1,117 @@ +import asyncclick as click +from dbus_next.aio import MessageBus +from dbus_next import BusType, Message, PropertyAccess +import asyncio +from functools import update_wrapper +from dbus_next.service import ServiceInterface, method, dbus_property +from dbus_next import Variant, DBusError +import os +import json + +class BlockInterface(ServiceInterface): + def __init__(self, system_bus, logind): + super().__init__('li.yggdrasil.WaybarSystemdInhibit') + self.system_bus = system_bus + self.logind = logind + self.fd = None + + def Release(self): + if not self.fd: + return + + os.close(self.fd) + self.fd = None + self.emit_properties_changed({'IsAcquired': False}) + + async def Acquire(self): + if self.fd: + return + + res = await self.system_bus.call(Message( + destination='org.freedesktop.login1', + path='/org/freedesktop/login1', + interface='org.freedesktop.login1.Manager', + member='Inhibit', + signature='ssss', + body=[ + "handle-lid-switch", + "waybar-systemd-inhibit", + "User request", + "block", + ], + )) + self.fd = res.unix_fds[res.body[0]] + self.emit_properties_changed({'IsAcquired': True}) + + @method() + async def ToggleBlock(self): + if self.fd: + self.Release() + else: + await self.Acquire() + + @dbus_property(access=PropertyAccess.READ) + def IsAcquired(self) -> 'b': + return self.fd is not None + + +@click.command() +async def main(): + system_bus = await MessageBus(bus_type=BusType.SYSTEM, negotiate_unix_fd=True).connect() + session_bus = await MessageBus(bus_type=BusType.SESSION).connect() + + introspection = await system_bus.introspect('org.freedesktop.login1', '/org/freedesktop/login1') + obj = system_bus.get_proxy_object('org.freedesktop.login1', '/org/freedesktop/login1', introspection) + logind = obj.get_interface('org.freedesktop.login1.Manager') + properties = obj.get_interface('org.freedesktop.DBus.Properties') + + def is_blocked_logind(what: str): + return "handle-lid-switch" in what.split(':') + + def print_state(is_blocked: bool, is_acquired: bool = False): + icon = "󰌢" if is_blocked else "󰛧" + text = f"{icon}" + if is_acquired: + text = f"{text}" + elif is_blocked: + text = f"{text}" + print(json.dumps({'text': text, 'tooltip': ("Manually inhibited" if is_acquired else None)}, separators=(',', ':')), flush=True) + + print_state(is_blocked_logind(await logind.get_block_inhibited())) + + async def get_inhibit(): + introspection = await session_bus.introspect('li.yggdrasil.WaybarSystemdInhibit', '/li/yggdrasil/WaybarSystemdInhibit') + return session_bus.get_proxy_object('li.yggdrasil.WaybarSystemdInhibit', '/li/yggdrasil/WaybarSystemdInhibit', introspection) + + async def on_logind_properties_changed(interface_name, changed_properties, invalidated_properties): + if 'BlockInhibited' not in changed_properties: + return + + properties = (await get_inhibit()).get_interface('li.yggdrasil.WaybarSystemdInhibit') + + print_state(is_blocked_logind(changed_properties['BlockInhibited'].value), await properties.get_is_acquired()) + + properties.on_properties_changed(on_logind_properties_changed) + + session_bus.export('/li/yggdrasil/WaybarSystemdInhibit', BlockInterface(system_bus, logind)) + await session_bus.request_name('li.yggdrasil.WaybarSystemdInhibit') + + properties = (await get_inhibit()).get_interface('org.freedesktop.DBus.Properties') + + async def on_inhibit_properties_changed(interface_name, changed_properties, invalidated_properties): + if 'IsAcquired' not in changed_properties: + return + + print_state(is_blocked_logind(await logind.get_block_inhibited()), changed_properties['IsAcquired'].value) + + properties.on_properties_changed(on_inhibit_properties_changed) + + await session_bus.wait_for_disconnect() + +@click.command() +async def toggle(): + session_bus = await MessageBus(bus_type=BusType.SESSION).connect() + introspection = await session_bus.introspect('li.yggdrasil.WaybarSystemdInhibit', '/li/yggdrasil/WaybarSystemdInhibit') + obj = session_bus.get_proxy_object('li.yggdrasil.WaybarSystemdInhibit', '/li/yggdrasil/WaybarSystemdInhibit', introspection) + interface = obj.get_interface('li.yggdrasil.WaybarSystemdInhibit') + await interface.call_toggle_block() diff --git a/shell.nix b/shell.nix index bec68474..66410aaf 100644 --- a/shell.nix +++ b/shell.nix @@ -3,6 +3,12 @@ let pkgs = self.legacyPackages.${system}; utils = import ./utils { inherit (nixpkgs) lib; }; inherit (utils) nixImport; + uv-links = pkgs.symlinkJoin { + name = "uv-links"; + paths = [ + pkgs.python312.pkgs.pygobject3 + ]; + }; in pkgs.mkShell { nativeBuildInputs = builtins.attrValues self.packages.${system} ++ (with pkgs; [ sops @@ -15,5 +21,9 @@ in pkgs.mkShell { nvfetcher.packages.${system}.default ca-util.packages.${system}.ca poetry uv + ninja pkg-config cairo.dev ]); + shellHook = '' + export UV_FIND_LINKS=${uv-links}/lib/python3.12/site-packages + ''; } -- cgit v1.2.3