diff options
| author | Peter Son Struschka <me@peter-struschka.com> | 2020-08-30 20:56:36 +0800 |
|---|---|---|
| committer | Peter Son Struschka <me@peter-struschka.com> | 2020-08-30 20:58:04 +0800 |
| commit | 37dd411698bd6eae8365260dde39b8ae9c7cbd36 (patch) | |
| tree | 978dd6ea3e72a86e4a3e0314b86d5137fc394785 /herbstluftwm/.local/bin/scratchpad.sh | |
| parent | a1d6fc2f3e6ab041cc51cb085ac59a646a126d25 (diff) | |
| download | dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.tar.gz dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.tar.bz2 dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.tar.lz dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.tar.xz dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.tar.zst dotfiles-37dd411698bd6eae8365260dde39b8ae9c7cbd36.zip | |
all: overhaul, move dotfile specifics to .local/share/dotfiles and more
Diffstat (limited to 'herbstluftwm/.local/bin/scratchpad.sh')
| -rwxr-xr-x | herbstluftwm/.local/bin/scratchpad.sh | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/herbstluftwm/.local/bin/scratchpad.sh b/herbstluftwm/.local/bin/scratchpad.sh new file mode 100755 index 0000000..d168ad7 --- /dev/null +++ b/herbstluftwm/.local/bin/scratchpad.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +# a i3-like scratchpad for arbitrary applications. +# +# this lets a new monitor called "scratchpad" appear in from the top into the +# current monitor. There the "scratchpad" will be shown (it will be created if +# it doesn't exist yet). If the monitor already exists it is scrolled out of +# the screen and removed again. +# +# Warning: this uses much resources because herbstclient is forked for each +# animation step. +# +# If a tag name is supplied, this is used instead of the scratchpad + +tag="${1:-scratchpad}" +hc() { "${herbstclient_command[@]:-herbstclient}" "$@" ;} +#scratchpad=(alacritty --title "$tag" --class "scratchpad") +scratchpad=(urxvt -title "$tag" -name "scratchpad") +#scratchpad=(xterm -title "$tag" -name "scratchpad") + +#mrect=( $(hc monitor_rect "") ) +read -r -a mrect < <(hc monitor_rect "") + +width=${mrect[2]} +height=${mrect[3]} + +rect=( + $((width/2)) + $((height/2)) + $((mrect[0]+(width/4))) + $((mrect[1]+(height/4))) +) + +hc add "$tag" + +monitor=scratchpad + +exists=false +if ! hc add_monitor $(printf "%dx%d%+d%+d" "${rect[@]}") \ + "$tag" $monitor 2> /dev/null ; then + exists=true +else + # remember which monitor was focused previously + hc chain \ + , new_attr string monitors.by-name."$monitor".my_prev_focus \ + , substitute M monitors.focus.index \ + set_attr monitors.by-name."$monitor".my_prev_focus M +fi + +show() { + [ "$(hc attr tags.by-name."$tag".client_count)" = "0" ] && hc spawn "${scratchpad[@]}" + hc lock + hc raise_monitor "$monitor" + hc focus_monitor "$monitor" + hc unlock + hc lock_tag "$monitor" +} + +hide() { + # if q3terminal still is focused, then focus the previously focused monitor + # (that mon which was focused when starting q3terminal) + hc substitute M monitors.by-name."$monitor".my_prev_focus \ + and + compare monitors.focus.name = "$monitor" \ + + focus_monitor M + hc remove_monitor "$monitor" +} + +# shellcheck disable=SC2015 +[ $exists = true ] && hide || show + |
