Navigateur par défaut

Avoir plusieurs navigateurs, et ouvrir les liens dans le dernier qui a eu le focus.

La problématique

Pour travailler, j'utilise Chrome. Pour le perso, j'utilise Brave (mais bientôt de nouveau Firefox histoire de revenir dans le droit chemin).

Le week end, quand j'ouvre un lien depuis une application (exemple : Element), le navigateur du boulot s'ouvre, alors que j'avais mon navigateur perso ouvert.

Rien de très dérangeant en soit, mais cela évite de voir des notifications liées au travail lorsqu'on n'y pense pas (ou qu'on ne veut pas y penser).

Du coup, temporairement, je défini Brave comme navigateur par défaut, et je savoure la fin de mon week end.

Lundi matin, j'attaque le travail, et un lien ouvert à partir de mon client mail (Evolution) m'ouvre ce lien dans Brave, alors que Chrome est ouvert et actif...

Donc, recherche d'une solution pour corriger ce comportement.

La solution toute faite

Il faudra donc jouer avec les applications par défaut pour arriver à mes fins. Mes brèves recherches ne m'ont pas donnés de résultat pertinent pour résoudre cette petite problématique.

Donc rien de tout fait (à ma connaissance) pour répondre à cette problématique.

Alors hop, rédigeons nos scripts qui feront pile poil ce que l'on veut.

La logique

Lorsqu'on clique sur un lien, on va appeler un faux navigateur par défaut, qui se chargera d'appeler à son tour les vrais navigateurs, selon des critères plutôt simples : ouvrir le lien dans le dernier navigateur qui à été utilisé (dans la session courante).

Cas particulier, si aucun navigateur n'a été lancé en début de session, il faut un prompt pour demander quel navigateur lancer.

Comment ça va tourner ?

Lorsqu'on va cliquer sur un lien depuis une application qui n'est pas le navigateur, on va appeler notre faux navigateur par défaut (qu'on aura définis dans notre Desktop Environment, Gnome dans mon cas).

Ce faux navigateur déterminera quel à été le dernier navigateur en utilisation, ou demandera à l'utilisateur quel navigateur choisir si aucune n'a encore été utilisé. Puis il transférera le lien cible au vrai navigateur qui se lancera (si par encore démarré) ou ouvrira un nouvel onglet dans la dernière fenêtre active.

Les scripts

On va rédiger plusieurs scripts :

  • Le détecteur de navigateur actif : default-browser-focus-handler.sh
  • le faux navigateur : default-browser-launcher.sh
  • Les fichiers default-browser-focus-handler.desktop et browser-handler.desktop pour être géré par le Desktop Environment

Le détecteur de navigateur actif

A l'aide de l'outil xdotool, on va capturer le titre de la fenêtre en cours de focus, et se baser sur la fin du titre (qui pour les navigateurs, est le nom du navigateur) pour déterminer quel est le navigateur sélectionné.

On stockera cette information dans un fichier dans /tmp, qui sera utilisé par notre faux-navigateur pour savoir quel navigateur lancer.

Ce script devra tourner en arrière plan et sera lancé lors du démarrage du bureau.

### default-browser-focus-handler.sh

#!/bin/sh

echo '' > /tmp/default-browser

CURRENT_DEFAULT_BROWSER=$(cat /tmp/default-browser)

while [ true ]
do
    WINDOW=$(xdotool getwindowfocus getwindowname)

    echo $WINDOW

    if [[ "$WINDOW" == *"- Google Chrome" && $CURRENT_DEFAULT_BROWSER != "google-chrome" ]]
    then
        echo "google-chrome" > /tmp/default-browser
        CURRENT_DEFAULT_BROWSER="google-chrome"
    elif [[ "$WINDOW" == *"– Brave" && $CURRENT_DEFAULT_BROWSER != "brave-browser" ]]
    then
        echo "brave-browser" > /tmp/default-browser
        CURRENT_DEFAULT_BROWSER="brave-browser"
    elif [[ "$WINDOW" == *"— Firefox" && $CURRENT_DEFAULT_BROWSER != "firefox" ]]
    then
        echo "firefox" > /tmp/default-browser
        CURRENT_DEFAULT_BROWSER="firefox"
    fi

    sleep 2
done

Et voici le fichier .desktop qui permet de lancer le script précédent au démarrage du bureau : (le placer dans ~/.local/share/applications/)

### default-browser-focus-handler.desktop

#!/bin/sh
[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Name=Browser focus handler
Exec=<chemin_vers_scripts>/default-browser-focus-handler.sh

Le faux navigateur

Ce script va transférer le lien cible au vrai navigateur selon les cas.

On utilise Xdialog pour construire une fenêtre comportant les navigateurs gérés et forcer le choix lorsqu'aucun navigateur n'a été encore démarré.

Avec which on détermine à quel exécutable correspond la chaîne de texte représentant le nom du navigateur cible.

### default-browser-launcher.sh

#!/bin/sh

CURRENT_DEFAULT_BROWSER=$(cat /tmp/default-browser)

TARGET_BROWSER=''
if [[ $CURRENT_DEFAULT_BROWSER == "" ]]
then
    TARGET_BROWSER=$(Xdialog \
        --stdout \
        --radiolist \
        "Choose browser" 200x200 200 \
        brave-browser Brave 1 \
        google-chrome Chrome 2 \
        firefox Firefox 3
    )
    echo "$TARGET_BROWSER" > /tmp/default-browser
else
    TARGET_BROWSER=$CURRENT_DEFAULT_BROWSER
fi

$(which $TARGET_BROWSER) $@

Pour le définir par défaut, il faut le référencer en tant que navigateur. Cela se fait entièrement dans le .desktop : (le placer dans ~/.local/share/applications/)

### browser-handler.desktop

#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Name=Browser handler
Exec=<chemin_vers_scripts>/default-browser-launcher.sh %u
Icon=

Ensuite, on le défini par défaut à l'aide de la commande suivante :

xdg-settings set default-web-browser browser-handler.desktop

Cela va rajouter automatiquement le MimeType dans notre .desktop :

### browser-handler.desktop

#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Name=Browser handler
Exec=<chemin_vers_scripts>/default-browser-launcher.sh %u
Icon=
MimeType=x-scheme-handler/unknown;x-scheme-handler/about;x-scheme-handler/https;x-scheme-handler/http;text/html;

Conclusion

Cet ensemble de script répond tout à fait à mon besoin, et je n'ai pas encore rencontré de comportement étrange ou non-désirés.