rafaelrc7 / wayland-pipewire-idle-inhibit

Inhibit wayland idle when computer is playing sound
https://crates.io/crates/wayland-pipewire-idle-inhibit
GNU General Public License v3.0
66 stars 1 forks source link
idle inhibit pipewire sway swaywm wayland

Wayland PipeWire Idle Inhibit

Description

Suspends automatic idling when media is being played through Pipewire.

For detecting media being played, it depends on PipeWire.

For inhibiting idle, it depends, either on:

Main features

Feedback and contributions are welcome!

Tested on

Should work fine with any compositor that implements idle-inhibit-unstable-v1 or any compositor/DE that offers the org.freedesktop.ScreenSaver service.

Availability

Usage

Usage: wayland-pipewire-idle-inhibit [OPTIONS]

Options:
  -d, --media-minimum-duration <SECONDS>
          Minimum media duration to inhibit idle [default: 5]
  -v, --verbosity <VERBOSITY>
          Log verbosity [default: WARN] [possible values: OFF, ERROR, WARN, INFO, DEBUG, TRACE]
  -q, --quiet
          Disables logging completely
  -i, --idle-inhibitor <IDLE INHIBITOR BACKEND>
          Sets what idle inhibitor backend to use [default: wayland] [possible values: d-bus, dry-run, wayland]
  -b, --d-bus
          Enable DBus (org.freedesktop.ScreenSaver) idle inhibitor
  -w, --wayland
          Enable Wayland idle inhibitor
  -n, --dry-run
          Only logs (at INFO level) about idle inhibitor state changes
  -c, --config <PATH>
          Path to config file
  -h, --help
          Print help
  -V, --version
          Print version

Building

Cargo

git clone https://github.com/rafaelrc7/wayland-pipewire-idle-inhibit
cd wayland-pipewire-idle-inhibit
cargo build

Nix

git clone https://github.com/rafaelrc7/wayland-pipewire-idle-inhibit
cd wayland-pipewire-idle-inhibit
nix build
nix build github:rafaelrc7/wayland-pipewire-idle-inhibit

Installing

Cargo

cargo install wayland-pipewire-idle-inhibit

See Running for instructions on how to run the program.

AUR

This package is available in the Arch User Repository: wayland-pipewire-idle-inhibit

Install it using your AUR helper of choice.

The package includes the binary and the default systemd service unit file, that may be enabled and ran with:

systemctl --user enable wayland-pipewire-idle-inhibit.service --now

See Running for further instructions on how to run the program.

Nixpkgs

This package is available in the nixpkgs repo as wayland-pipewire-idle-inhibit.

Nix Flake (recommended)

Add the following snippet to your flake inputs:

wayland-pipewire-idle-inhibit = {
  url = "github:rafaelrc7/wayland-pipewire-idle-inhibit";
  inputs.nixpkgs.follows = "nixpkgs";
};

[!WARNING] This flake depends on nixos-unstable, if you are using a stable nixpkgs version (23.11), either delete the inputs.nixpkgs.follows line, or set it to follow a nixpkgs-unstable input, otherwise the package will not build. You may need to run $ nix flake update wayland-pipewire-idle-inhibit after removing the line if the build still fails. (see #7)

From this point you have many options:

Using the Home Manager module (recommended)

Add the following to your home-manager imports:

inputs.wayland-pipewire-idle-inhibit.homeModules.default

And then you may use the option to set it up, for example:

services.wayland-pipewire-idle-inhibit = {
  enable = true;
  systemdTarget = "sway-session.target";
  settings = {
    verbosity = "INFO";
    media_minimum_duration = 10;
    idle_inhibitor = "wayland";
    sink_whitelist = [
      { name = "Starship/Matisse HD Audio Controller Analog Stereo"; }
    ];
    node_blacklist = [
      { name = "spotify"; }
      { app_name = "Music Player Daemon"; }
    ];
  };
};

This method will install the program and setup a user systemd service.

Using the overlay

inputs.wayland-pipewire-idle-inhibit.overlays.default

By adding the overlay, you may then install the wayland-pipewire-idle-inhibit package.

See Running for instructions on how to run the program.

Using the package

inputs.wayland-pipewire-idle-inhibit.packages.default

See Running for instructions on how to run the program.

Running

Compositor

Then you may run it in your Sway config, or equivalent for your Wayland compositor:

exec wayland-pipewire-idle-inhibit

systemd

Another option is to setup a systemd user service. See wayland-pipewire-idle-inhibit.service for a model. You may customise it by, for example, adding CLI args to ExecStart or changing the WantedBy target to, for instance, sway-session.target.

Config

Most settings may be defined either via CLI arguments (run the program with the --help for more information) or config file. CLI arguments have priority over the config file. The default config file path is ~/.config/wayland-pipewire-idle-inhibit/config.toml, but other path may be set using --config <PATH>.

~/.config/wayland-pipewire-idle-inhibit/config.toml with the default options

verbosity = "WARN"
media_minimum_duration = 5
idle_inhibitor = "wayland"
sink_whitelist = [ ]
node_blacklist = [ ]

Sink Whitelist

You may set a list of Sink filters to be considered by the program. If the Sink matches any of the filters, it will be used.

Supported fields

Example

[[sink_whitelist]]
name = "Sink 1 name"

[[sink_whitelist]]
name = "Another Sink"

Node (Client) Blacklist

You may set a list of Node filters to be ignored and not inhibit idle even when playing media. If the node matches any of the filters, it will be ignored.

Supported fields

Example

[[node_blacklist]]
name = "[Ff]irefox"

Thanks

This project was inspired by

Licence and Credits

This project is licensed under the terms of the GPL3 licence. See LICENCE for more information.

Parts of the code of the PipeWire connection were greatly inspired by Helvum, which is also licensed under the terms of the GPL3 licence.