nwg-piotr / nwg-dock-hyprland

GTK3-based dock for Hyprland
MIT License
157 stars 13 forks source link

nwg-dock-hyprland

This application is a part of the nwg-shell project.

Contributing: please read the general contributing rules for the nwg-shell project.

Configurable (w/ command line arguments and css) dock, written in Go, aimed exclusively at the Hyprland Wayland compositor. It features pinned buttons, client buttons and the launcher button. The latter by default starts nwg-drawer.

2023-04-22-021230_hypr_screenshot

image

Differences from nwg-dock for sway:

Packaging status

Installation

Requirements

Steps

  1. Clone the repository, cd into it.
  2. Install golang libraries with make get. First time it may take ages, be patient.
  3. make build
  4. sudo make install

Running

Either start the dock permanently in hyprland.conf:

exec-once = nwg-dock-hyprland [arguments]

or assign the command to some key binding. Running the command again kills the existing program instance, so that you could use the same key to open and close the dock.

Running the dock residently

If you run the program with the -d or -r argument (preferably in autostart), it will be running residently.

exec_always nwg-dock-hyprland -d

or

exec_always nwg-dock-hyprland -r

-d for autohiDe

Move the mouse pointer to expected dock location for the dock to show up. It will be hidden a second after you leave the window. Invisible hot spots will be created on all your outputs, unless you specify one with the -o argument.

-r for just Resident

No hotspot will be created. To show/hide the dock, bind the exec nwg-dock-hyprland command to some key or button. How about the Menu key, which is usually useless?

Re-execution of the same command hides the dock. If a resident instance found, the nwg-dock-hyprland command w/o arguments sends SIGUSR1 to it. Actually pkill -USR1 nwg-dock-hyprland could be used instead. This also works in autohiDe mode.

Re-execution of the command with the -d or -r argument won't kill the running instance. If the dock is running residently, another instance will just exit with 0 code. In case you'd like to terminate it anyway, you need to pkill -f nwg-dock-hyprland.

NOTE: you need to kill the running instance before reloading Hyprland, if you've just changed the arguments you auto-start the dock with.

$ nwg-dock-hyprland -h
Usage of nwg-dock-hyprland:
  -a string
        Alignment in full width/height: "start", "center" or "end" (default "center")
  -c string
        Command assigned to the launcher button
  -d    auto-hiDe: show dock when hotspot hovered, close when left or a button clicked
  -debug
        turn on debug messages
  -f    take Full screen width/height
  -hd int
        Hotspot Delay [ms]; the smaller, the faster mouse pointer needs to enter hotspot for the dock to appear; set 0 to disable (default 20)
  -i int
        Icon size (default 48)
  -ico string
        alternative name or path for the launcher ICOn
  -l string
        Layer "overlay", "top" or "bottom" (default "overlay")
  -mb int
        Margin Bottom
  -ml int
        Margin Left
  -mr int
        Margin Right
  -mt int
        Margin Top
  -nolauncher
        don't show the launcher button
  -o string
        name of Output to display the dock on
  -p string
        Position: "bottom", "top" or "left" (default "bottom")
  -r    Leave the program resident, but w/o hotspot
  -s string
        Styling: css file name (default "style.css")
  -v    display Version information
  -w int
        number of Workspaces you use (default 10)
  -x    set eXclusive zone: move other windows aside; overrides the "-l" argument

screenshot-2.png

Styling

Edit ~/.config/nwg-dock-hyprland/style.css to your taste.

Troubleshooting

An application icon is not displayed

The only thing the dock knows about the app is it's class name.

$ hyprctl clients
(...)
Window 55a62254b8c0 -> piotr@msi:~:
    mapped: 1
    hidden: 0
    at: 1204,270
    size: 2552,1402
    workspace: 6 (6)
    floating: 0
    monitor: 2
    class: foot
    title: piotr@msi:~
    initialClass: foot
    initialTitle: foot
    pid: 58348
    xwayland: 0
    pinned: 0
    fullscreen: 0
    fullscreenmode: 0
    fakefullscreen: 0
    grouped: 0
    swallowing: 0

Now it'll look for an icon named 'foot'. If that fails, it'll look for a .desktop file named foot.desktop, which should contain the icon name or path. If this fails as well, no icon will be displayed. I've added workarounds for some most common exceptions, but it's impossible to predict every single application misbehaviour. This is either programmers fault (improper class name), or bad packaging (.desktop file name different from the application class name).

If some app has no icon in the dock:

  1. check the app class name (hyprctl clients);
  2. find the app's .desktop file;
  3. copy it to ~/.local/share/applications/` and rename to .desktop.

If the .desktop file contains proper icon definition (Icon=), it should work now.

Credits

This program uses some great libraries: