web-dev-qa-db-fra.com

Comment éviter d'ouvrir une deuxième instance?

J'ai configuré lirc pour contrôler mon PC avec une télécommande. Pour changer de mode, j’ai édité . Lircrc comme suit:

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

Tout fonctionne bien - sauf le passage à Firefox: lorsque Firefox est en marche et que j'appuie sur le bouton rouge, le mode change (comme il se doit) et ouvre une seconde fenêtre/instance de Firefox (comme il ne faut pas) .

Le problème n'apparaît qu'avec Firefox.

EditPreferencesTabsOpen new windows in a new tab instead est déjà activé:

tabs preferences

Que se passe-t-il lorsque Firefox est en cours d'exécution et que je lance firefox dans un terminal?

  • firefox - une seconde fenêtre s'ouvre
  • firefox about:startpage - un nouvel onglet dans Firefox s'ouvre avec la page de démarrage préconfigurée
  • (!) firefox about:blank - un nouvel onglet dans Firefox s'ouvre avec ma page de démarrage personnelle ( composition rapide )
  • firefox chrome://speeddial/content/speeddial.xul (qui est l'adresse de la page de démarrage de la numérotation directe) - rien ne se passe

Que se passe-t-il lorsque Firefox n'est pas en cours d'exécution et que je lance firefox dans un terminal?

  • firefox - Firefox s'ouvre comme configuré dans Preferences (Show my windows and tabs from last time)
  • firefox about:startpage - Firefox s'ouvre avec un nouvel onglet supplémentaire avec la page de démarrage préconfigurée
  • (!) firefox about:blank - Firefox s'ouvre avec un nouvel onglet vide.
  • firefox chrome://speeddial/content/speeddial.xul - Firefox ne s'ouvre pas:
    *** Preventing external load of chrome: URI into browser window.
    Use -chrome <uri> instead

Ainsi, lorsque je modifie la commande dans le script (config = ...) et que j'ajoute une adresse comme about:blank, le problème est partiellement résolu. Le problème demeure qu'il ne place pas Firefox au premier plan alors qu'il est déjà en cours d'exécution. Cela ne se produit que parfois .

Quelqu'un pourrait-il m'aider à modifier ce script pour corriger ce problème de comportement? ( Source du script que j'ai modifié.)

4
Jakob

Une partie du code Shell de cette source ne fait pas ce qu’elle prétend faire; principalement le type qui va:

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

Ceci exécute vlc & dans deux cas. S'il n'y a pas de processus correspondant à "vlc" et s'il y a exactement un processus correspondant à "vlc". S'il existe plusieurs processus correspondant à "vlc", vlc & ne sera pas exécuté. Donc, si ces blocs sont plutôt inutiles. Exécuter simplement vlc & à la place sera probablement plus correct.

Le mauvais conseil Shell est malheureusement monnaie courante sur Internet.

D'après votre description du problème, vous voulez que le résultat soit que le programme est exécuté s'il ne l'est pas déjà et, s'il est en cours d'exécution, affichez cette fenêtre au premier plan et mettez-la en évidence. Pour ce faire, wmctrl pourrait être utilisé.

wmctrl -a 'Mozilla Firefox' trouvera une fenêtre contenant "Mozilla Firefox" dans son titre et "l'activera". Autrement dit, déplacez-vous vers l'espace de travail dans lequel vous vous trouvez, mettez-le au premier plan et concentrez-vous dessus. Deuxièmement, si aucune fenêtre ne correspond, wmctrl ne fera rien et sortira avec un statut de sortie non nul (faux), auquel cas nous pouvons supposer que le programme n'est pas en cours d'exécution et le démarrer à la place.

wmctrl -a 'Mozilla Firefox' || firefox &

Ce n'est toujours pas parfait cependant. D'autres fenêtres que Firefox peuvent potentiellement contenir cette chaîne dans leur titre, nous devrions donc trouver un moyen plus fiable d'identifier la bonne fenêtre dans ce cas.

Avec -x, wmctrl fonctionnera sur le VM_CLASS d’une fenêtre, qui aura généralement une valeur unique par programme. VM_CLASS "Navigator.Firefox" est visible sur toutes les fenêtres de Firefox, comme indiqué en exécutant wmctrl -lx pendant que Firefox est en cours d'exécution.

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

Avec cela, nous pouvons sélectionner la fenêtre qui a exactement "Navigator.Firefox" comme VM_CLASS

wmctrl -Fxa Navigator.Firefox || firefox &

J'espère que la même chose devrait s'appliquer aux autres programmes.

3
geirha