#hyprland #monitor #screen #events #pluggable #behavior #css #acpid

app hyprdock

A small program to handle external pluggable screens with hyprland and acpid

14 releases

Uses new Rust 2024

0.4.3 Jun 8, 2025
0.4.2 Jun 6, 2025
0.4.0 May 25, 2025
0.3.7 Sep 22, 2023
0.1.0 Mar 22, 2023

#340 in Web programming

Download history 6/week @ 2025-05-09 119/week @ 2025-05-23 107/week @ 2025-05-30 249/week @ 2025-06-06 11/week @ 2025-06-13 1/week @ 2025-06-20

373 downloads per month

GPL-3.0-or-later

41KB
871 lines

Hyprdock

A small utility to handle automatic monitor docking for Hyprland.

Hard Requirements for "server" mode

  • Acpid installed and running
  • Lid events ignored by logind/other

Behavior and features

  • server mode
    • if there is a monitor connected and you close the laptop lid, the laptop will be stopped from suspending and instead uses the external monitor
    • without a monitor connected, closing the lid will suspend/hibernate the laptop
    • the name for the monitor is the first monitor specified in the hyprland.conf
  • external: switches to external monitor only
  • internal: switches to internal monitor only
  • extend: extends monitors
  • mirror: mirrors monitors
  • export: save your current monitor configuration
    optional name parameter -> save configuration with specific name
  • import: import a stored configuration
    optional name parameter -> load configuration with specific name

Configuration

Example toml file

Location: $XDG_CONFIG_HOME/hyprdock/config.toml

default_external_mode = "extend"
css_string = ""

[init_command]
base = ""
args = []

[open_bar_command]
base = "ironbar"
args = []

[close_bar_command]
base = "killall"
args = ["ironbar"]

[reload_bar_command]
base = "ironbar"
args = []

[suspend_command]
base = "systemctl"
args = ["suspend"]

[lock_command]
base = "hyprlock"
args = []

[utility_command]
base = "playerctl"
args = ["--all-players", "-a", "pause"]

[get_monitors_command]
base = "hyprctl"
args = ["monitors"]

[enable_internal_monitor_command]
base = "hyprctl"
args = ["keyword", "monitor", "eDP-1,highres,0x0,1"]

[disable_internal_monitor_command]
base = "hyprctl"
args = ["keyword", "monitor", "eDP-1,disabled"]

[enable_external_monitor_command]
base = "hyprctl"
args = ["keyword", "monitor", ",highres,0x0,1"]

[disable_external_monitor_command]
base = "hyprctl"
args = ["keyword", "monitor", ",disabled"]

[extend_command]
base = "hyprctl"
args = ["keyword", "monitor", ",highres,1920x0,1"]

[mirror_command]
base = "hyprctl"
args = ["keyword", "monitor", ",highres,0x0,1"]

[wallpaper_command]
base = "hyprctl"
args = ["dispatch", "hyprpaper"]

Lid switch

In order to use the server mode properly, you need to override existing lid switch behavior. For systemd/logind, you can ignore the lid switch events like this in the file /etc/systemd/logind.conf:

HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore

Nix/Home-manager

As of right now, hyprdock is not packaged in upstream NixOS or home-manager. The NixOS PR is open, with a home-manager PR following after. You therefore have to include hyprdock as a standalone flake:

inuts = {
    hyprdock.url = "github:Xetibo/hyprdock";
};

And then also include the module for home-manager if you want to automatically configure it:

home-manager.users.${username} = {
    imports = [
        inputs.hyprdock.homeManagerModules.default
        ./yourconfig.nix
    ];
};

For only NixOS you can use the package directly:

environment.systemPackages = [
    inputs.hyprdock.packages.${system}.default
];

If you are using home-manager, you can enable and configure hyprdock via nix directly:

programs.hyprdock = {
  enable = true;
  settings = {
    # set to whatever monitor you have
    monitor_name = "HDMI-1";
    # Commands are attrsets as well:
    open_bar_command = {
      base = "ironbar";
      args = [];
    };
  };
};

Lid switch behavior has to be set as a NixOS option:

services.logind.lidSwitch = "ignore";

When are specific functions called?

  • init_command => Runs at the start of hyprdock server
    • especially usefull for NixOS rebuilds to apply a specific configuration again
  • open_bar_command => used to open new bars on new monitors
  • close_bar_command => used to close a bugged eww bar
  • reload_bar_command => used to remove graphical errors with eww after re-enabling internal monitor
  • suspend_command => used to suspend (on lid close without external monitor)
  • lock_command => used to lock screen (on lid close without external monitor)
  • utility_command => used before locking -> stop music etc
  • get_monitors_command => used to check if external monitors are attached
  • enable_internal_monitor_command => run after using internal only or opening the laptop lid after using external monitor only
  • disable_internal_monitor_command => run after using external only or closing laptop lid with external monitor attached
  • enable_external_monitor_command => run after disabling internal monitor or pluggin in an external monitor
  • disable_external_monitor_command => run after using internal only or unplugging an external monitor
  • extend_command => run after using extend or default function for external monitors
  • mirror_command => run after using mirror or default function for external monitors
  • wallpaper_command => run after plugging in a monitor

CSS

By default hyprdock uses your system gtk4 theme.
The style can be configured with your own CSS file.
Just overwrite the css_string variable in the toml configuration file.

List of IDs:

  • MainWindow
  • MainBox
  • InternalButton
  • ExternalButton
  • ExtendButton
  • MirrorButton
  • ExportButton

Dependencies

~18MB
~437K SLoC