Atualização 7 de abril: Uma versão diferente adicionou e encontrou o Albert, veja a atualização e o bônus abaixo !!!
Com relação à funcionalidade do traço : Você pediu " Existe alguma maneira de alterar o comportamento padrão do lançador para verificar isso antes de abrir uma nova janela ". Resposta básica é, não, como um usuário comum você não tem como adicionar esse comportamento ao traço. No entanto, se houver um desenvolvedor de escopo de unidade que esteja disposto a implementá-lo, você poderá abordá-lo ou desenvolvê-lo por conta própria se tiver determinação e disposição para aprender. Minhas habilidades de codificação são muito modestas, por isso uso shell script e o front-end gráfico disponível para os scripts como uma solução alternativa.
Informações relacionadaspostagem original:
Eu escrevi um script que usa o diálogo do zenity e o wmctrl para obter o que você pediu. Observe que este é um script gráfico, o que significa que ele só funcionará com o Windows, na GUI, e não funcionará se você tentar iniciar algo no tty. Além disso, pelo que entendi, Alfredo faz exatamente a mesma coisa. Você pode criar um atalho na área de trabalho para ele ou atalho do iniciador para ele, conforme descrito aqui e aqui .
O script:
#!/bin/bash
# Author: Serg Kolo
# Description: A launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for https://askubuntu.com/q/440142/295286
# Date: April 6 , 2015
#
MYPROG=$( zenity --entry --title='MY LAUNCHER' --text='Type the name of application to run' )
sleep 0.5
wmctrl -lx | awk '{print $3}' | grep -i "$MYPROG"
if [ $? -eq 0 ]; then
sleep 1
wmctrl -xa $MYPROG
#as an alternative try the line bellow
#wmctrl -a $MYPROG
exit 1
else
$MYPROG &
exit 0
fi
Notas laterais: na versão anterior, o script usava echo $ ?, para testar se as expressões anteriores foram bem-sucedidas. De acordo com a sugestão de Muru (da edição), eu mudei o código para uma versão um pouco mais compacta, então sugiro que você dê uma olhada na versão anterior e na atual.
Além disso, anteriormente, wmctrl -a $MYPROG
não funcionava com o teste google-chrome ou chromium-browser; por algum motivo estúpido, alguns programas têm a propriedade WM_CLASS da janela em maiúscula, enquanto o programa listado por dpkg --get-selections
é minúsculo (apenas leia man wmctrl
e execute wmctrl -lx
, você saberá). Adicionando que -ax deve cuidar disso. O script exibe a janela do cromo já aberta como deveria
Outra coisa - o wmctlr é um pouco estranho pois precisa de um atraso às vezes (tinha experiência com ele em outro script), então eu tive que adicionar sleep 1
line. Anteriormente, seria uma espécie de dentro e fora do firefox, mas agora funciona de forma dinâmica.
O script em ação
Na animação abaixo você pode ver que na primeira execução do script, há uma instância do firefox aberta, e o script muda o foco para essa janela; No segundo teste, abro uma nova instância do google-chrome, que não foi aberta anteriormente. (Nota: Se você é curioso sobre a área de trabalho, a propósito, isso é openbox com o dock do Cairo)
Por sugestão nos comentários, animação incorporada removida, apenas link postado. Relate se está quebrado por favor! link
Atualização, 7 de abril
Eu melhorei o script um pouco para tornar todos os programas listados na caixa de entrada suspensa do zenity. Agora o usuário não precisa memorizar cada programa, mas pode simplesmente rolar uma lista deles usando as teclas de seta ou apenas abrir o menu suspenso. Além disso, essa versão aprimorada gera janelas não pelo nome, mas pelo ID da janela, o que proporciona um desempenho muito melhor. Note que o modo como eu passo pelos arquivos .desktop é meio redundante, usando o comando cut duas vezes, mas como o script-fu não é tão bom até agora, isso é tudo que posso fazer. Sugestões para melhoria são bem vindas!
#!/bin/bash
# Author: Serg Kolo
# Description: Second version of a launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for https://askubuntu.com/q/440142/295286
# Date: April 7 , 2015
#
set -x
MYPROG=$(zenity --entry --text 'Select program from list' --entry-text $(ls /usr/share/applications/*.desktop | cut -d'/' -f5 | cut -d'.' -f1 | xargs echo))
sleep 0.5
# Do we have a window of such program ?
wmctrl -lx| awk '{print $3}' | grep -i $MYPROG
if [ $? -eq 0 ]; then
sleep 0.5 # if yes, find that window id, and raise it
WINID=$(wmctrl -lx | grep -i $MYPROG | awk 'NR==1{print $1}')
wmctrl -ia $WINID &
# exit 0
else
echo $MYPROG | grep -i libreoffice
if [ $? -eq 0 ]
then
MYPROG=$(echo $MYPROG | sed 's/-/ --/g')
fi
$MYPROG &
# exit 0
fi
Bônus:
Naverdade,encontrei
Existe um aplicativo chamado Gnome-Do, que parece graficamente semelhante ao Alfred, no entanto, ele não tem a mesma funcionalidade que este script.
Deixe-me saber se você gosta deste roteiro, se há algo que precisa ser consertado, e não se esqueça de revalorizar a resposta se achar útil