Como evitar a abertura de uma segunda instância?

Como evitar a abertura de uma segunda instância?

Configurei lircpara controlar meu PC com um controle remoto. Para alternar entre os diferentes modos que editei.lircrcdo seguinte modo:

begin vlc
    include ~/.lirc/vlc
end vlc
begin gnome
    include ~/.lirc/gnome
end gnome
begin firefox
    include ~/.lirc/firefox
end firefox
begin me-tv
    include ~/.lirc/me-tv
end me-tv

begin
    prog = irexec
    button = KEY_YELLOW
    config = if [ -n $(pgrep -f vlc) ]; then (vlc &); fi
    mode = vlc
end
begin
    prog = irexec
    button = KEY_GREEN
    mode = gnome
end
begin
    prog = irexec
    button = KEY_RED
    config = if [ -n $(pgrep -x firefox) ]; then (firefox &); fi
    mode = firefox
end
begin
    prog = irexec
    button = KEY_BLUE
    config = if [ -n $(pgrep -x me-tv) ]; then (me-tv &); fi
    mode = me-tv
end

Tudo funciona bem com ele - exceto mudar para o Firefox: quando o Firefox está em execução e eu pressiono o botão vermelho, ele muda o modo (como deveria)e abre uma segunda janela/instância do Firefox (como não deveria).

O problema aparece apenas com o Firefox.

EditPreferencesTabsOpen new windows in a new tab insteadjá está ativado:

preferências de guias

O que acontecequando o Firefox está em execuçãoe eu começo firefoxem um terminal?

  • firefox- uma segunda janela se abre
  • firefox about:startpage- uma nova aba no Firefox abre com a página inicial pré-configurada
  • (!) firefox about:blank- uma nova aba no Firefox abre com minha página inicial pessoal (Discagem rápida)
  • firefox chrome://speeddial/content/speeddial.xul (que é o endereço da página inicial do Speeddial)- nada acontece

O que acontecequando o Firefox não está em execuçãoe eu começo firefoxem um terminal?

  • firefox- O Firefox abre conforme configurado em Preferences( Show my windows and tabs from last time)
  • firefox about:startpage- O Firefox abre com uma nova aba adicional com a página inicial pré-configurada
  • (!) firefox about:blank- O Firefox abre com uma nova guia adicional em branco
  • firefox chrome://speeddial/content/speeddial.xul- O Firefox não abre:
    *** Preventing external load of chrome: URI into browser window.
    Use -chrome <uri> instead

Então, quando eu modifico o comando no script ( config = ...) e adiciono um endereço como about:blankele resolve parcialmente o problema. Como o problema permanece é quenão coloca o Firefox em primeiro planoquando já está em execução. Isso só aconteceàs vezes.

Alguém poderia me ajudar a editar este script para corrigir esse mau comportamento?(Fontedo script que eu modifiquei.)

Responder1

Parte do código shell dessefontenão faz o que afirma fazer; principalmente o tipo que vai:

if [ -n $(pgrep -f vlc) ]; then (vlc &); fi

Isso ocorre vlc &em dois casos. Se não houver processos correspondentes a "vlc" e se houver exatamente um processo correspondente a "vlc". Se houver mais de um processo correspondente a "vlc", vlc &não será executado. Portanto, esses blocos if são bastante inúteis. Apenas correr vlc &provavelmente será mais correto.

Infelizmente, conselhos ruins sobre shell são comuns na Internet.

A partir da descrição do seu problema, o resultado que você deseja é que o programa seja executado, se ainda não estiver em execução, e se estiver em execução, traga essa janela para a frente e dê foco a ela. Para fazer isso, wmctrlpoderia ser usado.

wmctrl -a 'Mozilla Firefox'encontrará uma janela contendo "Mozilla Firefox" no título e a "ativará". Ou seja, vá até o espaço de trabalho em que ele está, traga-o para frente e dê foco. Em segundo lugar, se nenhuma janela corresponder, o wmctrl não fará nada e sairá com um status de saída diferente de zero (falso). Nesse caso, podemos assumir que o programa não está em execução e, em vez disso, iniciá-lo.

wmctrl -a 'Mozilla Firefox' || firefox &

Ainda não é perfeito. Outras janelas além das janelas do Firefox podem conter essa string em seu título, portanto, devemos encontrar uma maneira mais confiável de identificar a janela correta neste caso.

Com -x, o wmctrl operará no VM_CLASS de uma janela, que normalmente terá um valor exclusivo por programa. Todas as janelas do Firefox terão VM_CLASS "Navigator.Firefox" como pode ser visto executando wmctrl -lxenquanto o Firefox está em execução

$ wmctrl -lx
...
0x03ba3d43  3 gnome-terminal.Gnome-terminal  pilot Terminal
0x04c000bc  0 Navigator.Firefox     pilot Group #1 - Speed Dial - Mozilla Firefox

Com isso podemos selecionar a janela que possui exatamente "Navigator.Firefox" como VM_CLASS

wmctrl -Fxa Navigator.Firefox || firefox &

Esperamos que o mesmo seja aplicável a outros programas.

informação relacionada