This Bash script emulates the main features of tdrop in niri:
- if the specified program is not running: launch it and bring it to the foreground.
- if the specified program is already running on another workspace: bring it to the current workspace and focus it.
- if the specified program is already on the current workspace: move it to workspace 'niri', thereby hiding it until called up again by ndrop.
ndrop [OPTIONS] [COMMAND]
[COMMAND]
The usual command you would run to start the desired program
-c, --class
Set classname of the program to be run. Use this if the classname is different from the name of the [COMMAND] and ndrop does not have a hardcoded replacement.-F, --focus
Changes the default behaviour: focus the specified program's window and switch to its present workspace if necessary. Do not hide it, if it's already on the current workspace."-H, --help
Print help message-i, --insensitive
Case insensitive partial matching of class names. Can work as a stopgap if a running program is not recognized and a new instance is launched instead. Note: incorrect matches may occur, adding a special handling of the program to ndrop (hardcoded or via-c, --class
) is preferable.-o, --online
Wait until internet connectivity is established.-v, --verbose
Show notifications regarding the matching process. Try this to figure out why running programs are not matched.-V, --version
Print version
Multiple instances of the same program can be run concurrently, if different class names are assigned to each instance. Presently, there is support for the following flags in the [COMMAND] string:
-a
|--app-id
(foot terminal emulator)
--class
(all other programs)
workspace "ndrop"
spawn-at-startup "niri" "msg" "action" "focus-workspace-down"
binds {
Mod+e { spawn "ndrop" "kitty" "--class" "kitty_1"; }
Mod+Alt+e { spawn "ndrop" "kitty" "--class" "kitty_2"; }
Mod+a { spawn "ndrop" "kitty" "--class" "kitty_hx" "hx"; }
Mod+Alt+a { spawn "ndrop" "kitty" "--class" "kitty_code"; }
}
Note
Defining a class name is only necessary when running several instances of the same program.
Please see the example bindings. There has to be a workspace named ndrop
for ndrop to work and ndrop
may not be your present workspace.
So far, i've found no way to have named workspaces that are "out of the way" of the regular workspaces so the behaviour of ndrop
is inferior to hdrop
.
If ndrop can't match an already running program and starts a new instance instead, then its class name is most likely different from its command name. For example, the class name of telegram-desktop
is org.telegram.desktop
and the class name of logseq
is Logseq
.
Run ndrop -v [COMMAND]
in the terminal to see maximum output for troubleshooting and find out the actual class name. Then use ndrop -c CLASSNAME
to make it work. ndrop -i [COMMAND]
might be sufficient, as long as a case insensitive (partial) match is sufficient.
Please report instances of programs with differing class names, so that they can be added to ndrop
.
Make sure that bash
and jq
are in your PATH.
Download the script, make it executable and add it to your PATH.
Note: ndrop
will only work in a niri
session.
Use the provided Makefile.