Super easy to config. Uses xdo
WM/DE independent.
- Based on process hierarchy (don't care about window focus).
- cli like options. (super easy to use within scripts).
- Window Managers and Desktop Environment Independent.
pidswallow (pid swallow WM/DE independent)
Hides terminal window automatically, so that you don't have to
pidswallow [OPTION ...]
OPTIONS:
-h --help Show this message
-s --swallow <CWID> Hides parent window of the given child window id.
-v --vomit <CWID> Unhides parent window of the given child window id.
-t --toggle <CWID> toggle between swallow and vomit. (default)
-g --glue treat if parent and child window are same. (recommended)
-l --loop listen and hide / unhide window on launch / remove.
-V --verbose Shows useful information.
bugs/issues: https://github.com/liupold/pidswallow.
- POSIX compliant shell script.
- Just pass in the window id of the swallower.
- Work on a toggle mode. (swallow if not swallowed else vomit).
- Super fast. (Really!) (28.0ms). (using
dash
).
Benchmark #1: pidswallow -s 0x02A00003
Time (mean ± σ): 28.0 ms ± 4.3 ms [User: 13.8 ms, System: 18.0 ms]
Range (min … max): 24.1 ms … 48.0 ms 74 runs
takes wid as as arg --> gets process tree --> check blacklist --> hide parent.
- xdo
- xprop (
--loop
and--glue
). - xev (
--glue
). - xdotool (cross-workspace
--glue
, optional).
- stable release. (Currently on 2.0)
yay -S pidswallow
- dev (git)
yay -S pidswallow-dev-git
Add pidswallow
to your path.
- Launch when WM/DE starts (Example: .xinitrc, i3-config, bspwrc)
pgrep -fl 'pidswallow -gl' || pidswallow -gl
- Add the following to your
bashrc
,zshrc
or shell init script. This step isn't strictly necessary, but it fixes problems with daemon-based terminals and also improves the performance of pidswallow. Note: You might want to skip this step if you use Alacritty (see Known Issues). Note: Your window manager has to focus new terminals as soon as they are spawned for this to work correctly.
[ -n "$DISPLAY" ] && command -v xdo >/dev/null 2>&1 && xdo id > /tmp/term-wid-"$$"
trap "( rm -f /tmp/term-wid-"$$" )" EXIT HUP
- Restart wm and terminals.
Environment variables can be exported to change the behavior of pidswallow.
The following ones accept lists of space separated process names.
PIDSWALLOW_SHELL
: your shell(s) (e.gbash
). Default: Taken from$SHELL
PIDSWALLOW_TERMINAL
: your terminal(s), as fallback if shell is not used (and if terminal supports it). Default:$TERMINAL
PIDSWALLOW_BLACKLIST
: parent cannot be swallowed, (if you launch one term from another you might want to add it to blacklist). Default: same as$PIDSWALLOW_TERMINAL
PIDSWALLOW_GLUE_BLACKLIST
: not touched by--glue
. Default: empty
The ones following are executed in a subshell (/bin/sh
) and support the special strings $pwid
and $cwid
, holding the parent and child window IDs, respectively.
PIDSWALLOW_SWALLOW_COMMAND
: used to swallow (hide) windows. Default:xdo hide $pwid
PIDSWALLOW_VOMIT_COMMAND
: used to vomit (unhide) windows. Default:xdo show $pwid
PIDSWALLOW_PREGLUE_HOOK
: executed before swallowing new child window when using--glue
. Useful for floating windows in tiled WMs. Default: empty
(If you did please let me know, If it dosent work create a issue).
- sxiv doesn't support this (as of now). xyb3rt/sxiv#398
- Solution: https://github.com/elkowar/sxiv/tree/set_net_wm_pid (use this).
- mpv (window incorrect size)
- Solution: use
--no-keepaspect-window
flag when launching.
- Solution: use
- Alacritty won't work with the shell based approach if your shell init script is sourced too quickly. See this issue.
- Solution: fall back to terminal based approach, by skipping Autostart step 2
- Add
pidswallow
to your path. - run this and click on the child window (not the term) to swallow.
xwininfo | awk '/Window id:/{print $4}' | pidswallow -gt
- or pass the window-id via keyboard shortcut. (Eg: sxhkd toggle).
super + v
xdo id | pidswallow -gt
setsid -f <command> # this will not swallow the terminal.
Add each set of lines to your bspwmrc
, right before running pidswallow.
- Let bspwm handle window hiding.
export PIDSWALLOW_SWALLOW_COMMAND='bspc node $pwid --flag hidden=on'
export PIDSWALLOW_VOMIT_COMMAND='bspc node $pwid --flag hidden=off'
This way bspwm will remember window positions and won't lose track of swallowed windows.
- Follow
floating
state of parent (when using--glue
).
export PIDSWALLOW_PREGLUE_HOOK='bspc query -N -n $pwid.floating >/dev/null && bspc node $cwid --state floating'
Check if parent window state is floating
and apply the same to the child if that's the case.
This example should work in most cases, but feel free to add more complex hooks to your setup. (e.g. to mimic more properties of the parent).