7 min read #tools #hyprland

Hyprland Companion Tools

Hyprland only handles windows; the remaining components are mostly standard pairings, with themes generated by matugen. Here is a brief overview of what each component does:

  • hyprlock (Lock Screen): The official lock screen for Hyprland. It uses GPU rendering and supports blurred wallpapers, clocks, and input fields. Its configuration style aligns with Hyprland. I have it display the current wallpaper for each screen (see below).
  • hyprpaper / waypaper: hyprpaper is the actual backend for setting wallpapers (runs persistently, preloads into VRAM, and allows per-screen configuration). waypaper is a graphical selector wrapper for it (and other backends); changing the wallpaper triggers matugen to recalculate the color scheme.
  • walker / fuzzel (Launcher): fuzzel is lightweight and follows the pure dmenu style. I use it for the clipboard history menu (the SUPER+V entry in hyprland.lua) and various --dmenu pipelines. walker is more like a full-featured launcher (with plugin modules for apps, calculations, emojis, etc.).
  • wlogout (Power Menu): A grid layout of large buttons for lock/logout/reboot/shutdown. The styling uses colors from matugen.
  • fcitx5 (Input Method): Handles Chinese/English switching. The theme is generated by matugen, and it integrates with im-select in the editor—automatically switching back to English in normal mode when moving from the desktop to nvim.

These components are straightforward to set up: just install them and integrate them with matugen. The truly non-obvious part, which requires troubleshooting to configure correctly, is splitting hypridle into two instances.

Initially, I had both the lock screen and screen dimming (DPMS) in a single instance. However, when Chrome or Bilibili was open, the screen would lock but never dim. The reason is that such pages continuously send Video Wake Lock D-Bus signals, repeatedly interrupting the idle timer. While the intent of these locks is "do not dim the screen during video playback," they inadvertently prevented the screen from dimming even after locking.

The solution was to separate them: the main instance handles only the lock screen, while the screen dimming (DPMS) runs in a second instance that ignores wake locks.

# Main instance: handles only locking
general { lock_cmd = ~/.config/hypr/hyprlock/lock.sh
          before_sleep_cmd = loginctl lock-session }
listener { timeout = 1800; on-timeout = loginctl lock-session }
# Screen dimming is configured separately in hypridle-dpms.conf, operating independently

As a side note, I use loginctl lock-session for locking rather than calling hyprlock directly. This allows hypridle's lock_cmd (the lock.sh script) to take over, synchronizing the current wallpaper for each screen before locking, ensuring the lock screen background matches the desktop. The input method is fcitx5, which integrates with im-select at the desktop level, ensuring seamless Chinese/English switching from the desktop to nvim.