38 lines
1.2 KiB
Plaintext
38 lines
1.2 KiB
Plaintext
|
#!/bin/bash
|
||
|
|
||
|
# basic scratchpad functionality for dk
|
||
|
# spawns a set command with a known title if not already open
|
||
|
# if open toggle between the current workspace and the last
|
||
|
# written by Nathaniel Maia - 2021
|
||
|
|
||
|
# example rule for the below script to be placed in your dkrc
|
||
|
# dkcmd rule class="^scratchpad$" float=true
|
||
|
|
||
|
# Dinamically get both class and command of the needed scratchpad
|
||
|
title="$1"
|
||
|
shift
|
||
|
cmd="$@"
|
||
|
|
||
|
# window ID, we need to printf it as 8 hex digits to later match with dk status
|
||
|
win=$(printf '0x%08x' "$(xwininfo -root -children | awk '/'"$title"'/ {print $1}')")
|
||
|
stat=$(dkcmd status num=1 type=full)
|
||
|
|
||
|
if (( win != 0 )); then
|
||
|
# window is already open so toggle it
|
||
|
ws=$(awk '/^workspaces:/ { for (i = 1; i <= NF; i++) { if ($i ~ "*") print i - 1 } }' <<< "$stat")
|
||
|
wins=$(sed -n '/^windows:/,/^$/p' <<< "$stat")
|
||
|
win_ws=$(grep "^\s*${win}" <<< "$wins" | awk -F'" ' '{print $4}' | cut -d' ' -f1)
|
||
|
|
||
|
if (( win_ws == ws )); then
|
||
|
# hide it
|
||
|
# we could create a new workspace and place it there instead to not mess with the users existing workspaces
|
||
|
dkcmd ws send "$win" "$(awk '/numws/{print $2}' <<< "$stat")"
|
||
|
else
|
||
|
# show it
|
||
|
dkcmd ws send "$win" "$ws"
|
||
|
fi
|
||
|
else
|
||
|
# the window is not yet spawned so do so
|
||
|
${cmd} &>/dev/null & disown
|
||
|
fi
|