Standalone

Works in any environment.

Note

A stable release of this implementation is currently not available.

CMake builds flags

  • INPUTACTIONS_SYSTEMD - enable systemd support, currently only installs the daemon service (default: ON)

Packages

NixOS (flakes)
flake.nix
{
  inputs = {
    inputactions-ctl = {
      url = "git+https://github.com/InputActions/ctl?submodules=1";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    inputactions-standalone = {
      url = "git+https://github.com/InputActions/standalone?submodules=1";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };
}
configuration.nix
{ inputs, pkgs, ... }:

{
  environment.systemPackages = [
    inputs.inputactions-ctl.packages.${pkgs.system}.default
    inputs.inputactions-standalone.packages.${pkgs.system}.default
  ];
}

Optionally, add the official binary cache if compilation times are an issue:

configuration.nix
{
  nix.settings = {
    extra-substituters = ["https://inputactions.cachix.org"];
    extra-trusted-public-keys = ["inputactions.cachix.org-1:yBGhAqTOv0V08lrOTBwMAkU7V/9a0i2UPvsvCu39CjE="];
  };
}

Manual

Dependencies

Arch Linux
sudo pacman -S --needed --noconfirm base-devel git extra-cmake-modules qt6-tools yaml-cpp libevdev cli11
Debian-based (KDE Neon, Kubuntu, Ubuntu)
sudo apt install git cmake g++ extra-cmake-modules qt6-tools-dev gettext libyaml-cpp-dev libxkbcommon-dev pkg-config libevdev-dev libudev-dev libinput-dev libwayland-dev systemd-dev libcli11-dev
Fedora
sudo dnf install git cmake extra-cmake-modules gcc-g++ qt6-qtbase-devel qt6-qtbase yaml-cpp yaml-cpp-devel libevdev libevdev-devel libinput-devel libudev-devel wayland-devel cli11-devel
openSUSE
sudo zypper in git cmake-full gcc-c++ kf6-extra-cmake-modules "cmake(Qt6Core)" "cmake(Qt6DBus)" "cmake(Qt6Network)" yaml-cpp-devel libevdev-devel libudev-devel libinput-devel wayland-devel libxkbcommon-devel "pkgconfig(systemd)" cli11-devel

Installation

Add the --standalone-no-systemd flag to not install the daemon service.

curl -o inputactions-installer.sh https://raw.githubusercontent.com/taj-ny/InputActions/refs/heads/main/install.sh
chmod +x inputactions-installer.sh
./inputactions-installer.sh --ctl --standalone --latest

Post-installation

Warning

If you have installed the compositor plugin, make sure to disable it. There is currently no protection against running it and the standalone version simultaneously.

  1. Enable the daemon (/usr/bin/inputactionsd):

    sudo systemctl enable --now inputactionsd
    
  2. Add /usr/bin/inputactions-client to autostart. The client must be started after the session, by the user who owns the session, in an environment where it can use KWin’s DBus interface (Plasma only) and can connect to the Wayland server (non-GNOME environments). A running client is required in every virtual terminal InputActions will be used in.

GNOME

Enable the InputActions helper extension (installed automatically after starting the client).

Plasma

The helper script is loaded and unloaded automatically by the client.

InputActions setup

By default, devices are not grabbed but their events are processed. Grabbing is required for event filtering. Both properties can be configured using device rules.

device_rules:
  - conditions:
      all:
        - any: # remove some conditions if you don't use triggers for a specific device type
          - $keyboard # keyboards must be grabbed for Trigger.clear_modifiers to work
          - $mouse # ungrabbed mice are currently very buggy
          - $touchpad # touchpad event filtering is experimental and may cause issues
          - $touchscreen
        - none: # blacklist
          - $name == Yubico YubiKey OTP+FIDO+CCID
    grab: true
    ignore: false

  - conditions: $types != keyboard
    ignore: true # ignore all devices other than keyboards (required to get modifiers) by default

Virtual devices

Two devices, named InputActions Virtual Keyboard and InputActions Virtual Mouse are created for the purpose of generating input events using the input action. Pointer acceleration should be disabled for InputActions Virtual Mouse.

For each grabbed input device, a pair of virtual devices is created. The first one has the (InputActions internal) name suffix, is grabbed and only used internally as a hack for injecting evdev events into libinput. The second one has the (InputActions output) suffix and is where real and simulated events are written to.

The output device does not inherit settings from the real device, they must be copied manually.

Udev rules

Libinput relies on udev environment variables for some features, such as pointer acceleration. These variables are not applied to virtual devices, which can result in devices changing their behavior after starting InputActions. In that case, udev rules must be created to apply some missing variables.

  1. Run sudo libinput list-devices to get the path of the input device

    Device:                  Logitech G502 X
    Kernel:                  /dev/input/event15
    
  2. Run udevadm info [path] (where [path] is the value of Kernel: above). Look for lines that start with E:. Known problematic variables include (but are not limited to) the following: MOUSE_DPI.

    E: MOUSE_DPI=800@1000 1200@1000 *1600@1000 2400@1000 3200@1000
    
  3. Add the rules to/etc/udev/rules.d/99-inputactions.rules. The rule for (InputActions internal) is optional but recommended.

    SUBSYSTEM=="input", ATTRS{name}=="Logitech G502 X (InputActions output)", ENV{MOUSE_DPI}="800@1000 1200@1000 *1600@1000 2400@1000 3200@1000"
    SUBSYSTEM=="input", ATTRS{name}=="Logitech G502 X (InputActions internal)", ENV{MOUSE_DPI}="800@1000 1200@1000 *1600@1000 2400@1000 3200@1000"
    
  4. Reload rules

    sudo udevadm control --reload-rules
    sudo udevadm trigger
    
  5. Restart the daemon

    sudo systemctl restart inputactionsd