This application is a part of the nwg-shell project.
Nwg-drawer is an application launcher. It's being developed with sway and Hyprland in mind, but should also work with other wlroots-based Wayland compositors.
The nwg-drawer
command displays the application grid. The search entry allows to look for installed applications,
and for files in XDG user directories. The grid view may also be filtered by categories.
You may pin applications by right-clicking them. Pinned items will appear above the application grid. Right-click a pinned item to unpin it. The pinned items cache is shared with nwg-menu.
Below the grid there is the power bar - a row of buttons to lock the screen, exit the compositor, reboot, suspend and power the machine off. For each button to appear, you need to provide a corresponding command. See "Command line arguments" below. If the power bar is present, pressing Tab will move focus to its first button.
To close the window w/o running a program, you may use the Esc
key, or right-click the window next to the grid.
- go
- gtk3
- gtk-layer-shell
- xdg-utils
Optional (recommended):
- thunar
- foot
You may use another file manager and terminal emulator (see command line arguments), but mentioned above have been confirmed to work well with the program. Also see Files below.
- Clone the repository, cd into it.
- Install necessary golang libraries with
make get
. make build
sudo make install
$ nwg-drawer -h
Usage of nwg-drawer:
-c uint
number of Columns (default 6)
-close
close drawer of existing instance
-d Turn on Debug messages
-fm string
File Manager (default "thunar")
-fscol uint
File Search result COLumns (default 2)
-fslen int
File Search name LENgth Limit (default 80)
-ft
Force Theme for libadwaita apps, by adding 'GTK_THEME=<default-gtk-theme>' env var
-g string
GTK theme name
-i string
GTK icon theme name
-is int
Icon Size (default 64)
-k set GTK layer shell Keyboard interactivity to 'on-demand' mode
-lang string
force lang, e.g. "en", "pl"
-mb int
Margin Bottom
-ml int
Margin Left
-mr int
Margin Right
-mt int
Margin Top
-nocats
Disable filtering by category
-nofs
Disable file search
-o string
name of the Output to display the drawer on (sway & Hyprland only)
-open
open drawer of existing instance
-ovl
use OVerLay layer
-pbexit string
command for the Exit power bar icon
-pblock string
command for the Lock power bar icon
-pbpoweroff string
command for the Poweroff power bar icon
-pbreboot string
command for the Reboot power bar icon
-pbsize int
power bar icon size (only works w/ built-in icons) (default 64)
-pbsleep string
command for the sleep power bar icon
-pbuseicontheme
use icon theme instead of built-in icons in power bar
-r Leave the program resident in memory
-s string
Styling: css file name (default "drawer.css")
-spacing uint
icon spacing (default 20)
-term string
Terminal emulator (default "foot")
-v display Version information
-wm string
use swaymsg exec (with 'sway' argument) or hyprctl dispatch exec (with 'hyprland') to launch programs
NOTE: the $TERM
environment variable overrides the -term
argument.
You may use the drawer in two ways:
- Simply run the
nwg-drawer
command, by adding a key binding to your sway config file, e.g.:
bindsym Mod1+F1 exec nwg-drawer
- Run a resident instance on startup, and use the
nwg-drawer
command to show the window, e.g.:
exec_always nwg-drawer -r
bindsym Mod1+F1 exec nwg-drawer
The second line does nothing but pkill -USR1 nwg-drawer
, so you may just use this command instead. Actually
this should be a little bit faster.
Running a resident instance should speed up use of the drawer significantly. Pay attention to the fact, that you
need to pkill -f nwg-drawer
and reload the compositor to apply any new arguments!
If you want to explicitly specify commands to open and close the resident instance, which can be helpful for touchpad gestures, please use the -open
and -close
parameters. Similarly, some signals can also be use: pkill -USR2 nwg-drawer to open and pkill -SIGRTMIN+3 nwg-drawer to close.
For a MacOS-style three-finger pinch:
bindgesture pinch:4:inward exec pkill -SIGUSR2 nwg-drawer
bindgesture pinch:4:outward exec pkill -SIGRTMIN+3 nwg-drawer
In case you encounter an issue, you may need debug messages. If you use the resident instance, you'll see nothing in the terminal. Please edit your sway config file:
exec nwg-drawer -r -d 2> ~/drawer.log
exit sway, launch it again and include the drawer.log
content in the GitHub issue. Do not use exec_always
here: it'll destroy the log file content on sway reload.
Edit ~/.config/nwg-drawer/drawer.css
to your taste.
When the search phrase is at least 3 characters long, your XDG user directories are being searched.
Use the left mouse button to open a file with the xdg-open
command. As configuring file associations for it is
PITA, you may override them, by creating the ~/.config/nwg-drawer/preferred-apps.json
file with your own definitions.
{
"\\.pdf$": "atril",
"\\.svg$": "inkscape",
"\\.(jpg|png|tiff|gif)$": "swayimg",
"\\.(mp3|ogg|flac|wav|wma)$": "audacious",
"\\.(avi|mp4|mkv|mov|wav)$": "mpv",
"\\.(doc|docx|xls|xlsx)$": "libreoffice"
}
Use the right mouse button to open the file with your file manager (see -fm
argument). The result depends
on the file manager you use.
- thunar will open the file location
- pcmanfm will open the file with its associated program
- caja won't open anything, except for directories
I've noy yet tried other file managers.
You may want to exclude some paths inside your XDG user directories from searching. If so, define exclusions in the
~/.config/nwg-drawer/excluded-dirs
file, e.g. like this:
# exclude all paths containing 'node_modules'
node_modules
If the search box is not empty, and you press Enter, the search box content will be evaluated as an arithmetic operation. If the result is not an error, it will be displayed in a small window, and copied to the clipboard with wl-copy. Press any key to close the window.
You may change the result label styling e.g. like this:
/* math operation result label */
#math-label {
font-weight: bold;
font-size: 16px
}
This program uses some great libraries:
- gotk4 by diamondburned released under GNU Affero General Public License v3.0
- go-sway Copyright (c) 2019 Joshua Rubin
- go-singleinstance Copyright (c) 2015 Allan Simon
- logrus Copyright (c) 2014 Simon Eskildsen
- fsnotify Copyright (c) 2012-2019 fsnotify Authors
- expr Copyright (c) 2018 Anton Medvedev