Atualização em 7 de abril: Uma versão diferente foi adicionada e encontrou Albert, veja a atualização e o bônus abaixo !!!
Sobre a funcionalidade do traço : Você perguntou " Existe alguma maneira de alterar o comportamento padrão do iniciador para verificar isso antes de abrir uma nova janela ". A resposta básica é: não, como 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 desenvolver você mesmo se tiver determinação e vontade de aprender. Minhas habilidades de codificação são muito modestas, portanto, uso scripts de shell e o front-end gráfico disponível para os scripts como solução alternativa.
Informação relacionada
Post original:
Eu escrevi um script que usa o zenity dialog e o wmctrl para alcançar o que você pediu. Observe que este é um script gráfico, o que significa que funcionará apenas com o Windows, na GUI, e não funcionará se você tentar iniciar algo no tty. Além disso, pelo que entendi, Alfred faz exatamente a mesma coisa. Você pode criar um atalho na área de trabalho ou um atalho do iniciador, 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 /ubuntu//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 encerradas com êxito. Conforme a sugestão de muru (da edição), 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 do 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 (basta ler man wmctrl
e executarwmctrl -lx
, você saberá). Adicionando -ax deve cuidar disso. O script exibe a janela do cromo já aberta, como deveria
Outra coisa - o wmctlr é um pouco estranho, pois às vezes precisa de um atraso (tinha experiência com ele em outro script), então tive que adicionar uma sleep 1
linha. Anteriormente, seria meio que ligado e desligado com o Firefox, mas agora funciona muito bem.
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 open, e o script muda o foco para essa janela; no segundo teste, abro uma nova instância do google-chrome, que não estava aberta anteriormente. (Observação: se você é cuidadoso com a área de trabalho, a propósito, isso é openbox com cairo dock)
Por sugestão nos comentários, animação incorporada removida, apenas link postado. Relate se está quebrado, por favor!
http://i.stack.imgur.com/puuPZ.gif
Atualização, 7 de abril
Aprimorei um pouco o script para criar 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 simplesmente abrir o menu suspenso. Além disso, esta versão aprimorada aumenta as janelas não pelo nome, mas pelo ID da janela, o que proporciona um desempenho muito melhor. Observe que a maneira como leio os arquivos .desktop é meio redundante, usando o comando cut duas vezes, mas como meu script-fu não é tão bom até agora, isso é tudo o que posso fazer. Sugestões de melhorias 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 /ubuntu//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:
Na verdade, eu encontrei o Albert , que é a versão Linux do Alfred, mas ainda não tentei. Vale a pena conferir embora. No entanto, como Jacob já observou, ainda é um buggy.
Existe um aplicativo chamado Gnome-Do, que se parece graficamente com Alfred, mas não tem a mesma funcionalidade que este script.
Deixe-me saber se você gosta deste script, se houver algo que precise ser corrigido e não se esqueça de votar na resposta se achar útil