31

scratchterm - toujours un terminal sous la main

Séduit par le concept de “scratchpad” présent dans i3, j'ai voulu concevoir un truc semblable, peu importe le gestionnaire de fenêtres, et si possible avec les outils de base à OpenBSD.

C'est chose faîte, j'ai désormais accès à un terminal qui fait les 2/3 de l'écran et apparaît/disparaît avec un simple raccourci clavier. Sont utilisés

Cela me permet par exemple d'ouvrir un terminal pour lancer une opération longue, fermer ce terminal, puis le réouvrir plus tard pour voir où ça en est.

Une démonstration sera peut-être plus claire :

Voici comment ça marche.

Tout d'abord, on récupère les dimensions de l'écran après avoir définit le nom de notre outil :

name=scratchterm
# screen size
sw=$(/usr/X11R6/bin/xwininfo -root|sed '/Width/!d;s/.* //')
sh=$(/usr/X11R6/bin/xwininfo -root|sed '/Height/!d;s/.* //')

Ensuite, on calcule mes dimensions du terminal, disons les 2/3 de l'écran :

# dimension # 2/3 of screen
w=$(($sw*2/3))
h=$(($sh*2/3))

Toutefois, pour préciser les dimensions d'un terminal, il faut donner le nombre de colonnes et de lignes, pas un nombre de pixels… Là j'ai pas mal galéré pour trouver quelque chose d'à peu près correct. Il semble qu'un caractère fasse environ 7 pixels de large et 15 pixels de haut…

# a char is approx 7x15 px
columns=$(($w/7))
rows=$(($h/15))

Ensuite, on calcule la position sur l'écran de la fenêtre , au centre.

# position
x=$((($sw-$w)/2))
y=$((($sh-$h)/2))

Ça nous donne cette géométrie :

geometry="${columns}x${rows}+${x}+${y}"

Ensuite, on va créer une session tmux spécialement pour notre scratchterm sauf si elle existe déjà.

session=$name
tmux start-server
tmux has-session -t $session || \
        tmux new -d -s $session -n $name

Enfin, soit on affiche notre scratchterm, soit on le ferme. Pour savoir s'il est déjà ouvert, on peut récupérer l'id de toutes les fenêtrs ouvertes pour voir s'il y a notre scratchterm dans la liste. Si oui, on la xkill, sinon, on ouvre un terminal avec la bonne session tmux :

# show/hide scratchterm
id_=$(xwininfo -root -children | grep "$name" | awk '{print $1}')

if [ -n "$id_" ]; then
        # window exist, kill it
        xkill -id $id_
else
        xterm -T $name -name $name -class $name -geometry "${geometry}@c"\
               -e tmux a -t $session &
fi

Dans la version que j'utilise, le terminal est st avec le patch pour avoir de la transparence.

st -A .9 -c $name -n $name -T $name -g "$geometry" -e tmux a -t $session

J'ai ce script associé à un raccourci Alt-x, et je dois dire que j'ai du mal à m'en passer. :)

Le script peut se trouver ici : scratchterm

07/11/2020 16:33


Commentaires