Eu encontrei este tópico e o implementei, compartilhando minha versão.
Eu criei um arquivo executável /usr/local/bin/run_once.sh
contendo
#! /bin/bash
application=$1
if wmctrl -xl | grep "${application}" > /dev/null ; then
# Already running, raising to front
wmctrl -x -R "$application"
else
# Not running: starting
$@
fi
Isso verifica usando wmctrl
se o aplicativo que você está tentando iniciar já tiver uma janela aberta (alguns programas GUI mantêm os funcionários sem um GUI em execução) em vez de usar ps
, usando -x para usar o WM_CLASS
do nome da barra de título.
Para cada programa em que eu quero apenas uma janela, copiei o arquivo .desktop
do sistema para ~/.local/share/applications
e alterei o campo exec
de exec=program --arguments
para exec=/usr/local/bin/run_once.sh program --arguments