web-dev-qa-db-fra.com

Comment puis-je faire fonctionner Firefox en arrière-plan, comme le chrome?

Une fonctionnalité connue de Chromium est la possibilité de le faire fonctionner en arrière-plan, ce qui facilite son ouverture.

Est-il possible de faire la même chose avec Firefox (et d'autres applications)?

5
akkk3

Exécuter une application en arrière-plan

La solution ci-dessous vous permettra d’exécuter firefox (ou toute autre application) en arrière-plan, ce qui signifie: sans fenêtre visible . L'application ne s'affiche pas non plus dans Dash en tant qu'application en cours d'exécution:

enter image description here

enter image description here

Si vous choisissez Toggle Firefox Cependant, l'application apparaîtra immédiatement:

enter image description here

Comment ça fonctionne

  1. Si l'icône du panneau (indicateur) démarre, il ouvre une nouvelle fenêtre firefox mais le cache immédiatement (y compris les éventuelles fenêtres firefox existantes existantes) de la surface de la terre, à l'aide de xdotool:

    xdotool windowunmap <window_id>
    

    Cela masquera non seulement la fenêtre, mais masquera également le fait que firefox est en cours d'exécution , car le programme de lancement d'unité agit sur des fenêtres visiblement existantes.

  2. L'indicateur stocke l'identifiant de toutes les fenêtres non mappées dans ~/.config/hidden_windows, pour être mappé lors de votre prochain choix. Toggle Firefox du menu.

Le scénario

#!/usr/bin/env python3
import subprocess
import os
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3
import time

app = "firefox"
winsdir = os.path.join(os.environ["HOME"], ".config/hidden_windows")

try:
    os.mkdir(winsdir)
except FileExistsError:
    pass

def checkruns(app):
    try:
        return subprocess.check_output(["pgrep", app]).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        for w in os.listdir(winsdir):
            if w.startswith(app):
                os.remove(os.path.join(winsdir, w))

def get_currentwins(pid):
    wins = subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()
    return [l.split()[0] for l in wins if pid in l]

def hide_currentwins(matches):
    # open(os.path.join(winsdir, "windowlist"), "wt").write("\n".join(matches))
    for w in matches:
        open(os.path.join(winsdir, app+"_"+w), "wt")
        subprocess.Popen(["xdotool", "windowunmap", w])

def run_app(app):
    subprocess.Popen(app)
    while True:
        time.sleep(1)
        pid = checkruns(app)
        matches = get_currentwins(pid) if pid else None
        if matches:
            hide_currentwins(matches)
            break

def restore_wins():
    for w in [w for w in os.listdir(winsdir) if w.startswith(app)]:
        wid = w.split("_")[-1]
        subprocess.Popen(["xdotool", "windowmap", wid])
        os.remove(os.path.join(winsdir, w))

def toggle_app(*args):
    pid = checkruns(app)
    if pid:
        matches = get_currentwins(pid)
        if matches:
            hide_currentwins(matches)
        else:
            restore_wins()
    else:
        subprocess.Popen(app)

run_app(app)

class Indicator():
    def __init__(self):
        self.app = 'toggle_app'
        self.indicator = AppIndicator3.Indicator.new(
            self.app, app,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())

    def create_menu(self):
        self.menu = Gtk.Menu()
        item_toggle = Gtk.MenuItem('Toggle '+app)
        item_toggle.connect("activate", toggle_app)
        self.menu.append(item_toggle)
        sep1 = Gtk.SeparatorMenuItem()
        self.menu.append(sep1)
        item_quit = Gtk.MenuItem('Quit')
        item_quit.connect('activate', self.stop)
        self.menu.append(item_quit)
        self.menu.show_all()
        return self.menu

    def stop(self, source):
        Gtk.main_quit()

Indicator()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

Comment utiliser

  1. Le script nécessite à la fois wmctrl et xdotool

    Sudo apt-get install wmctrl xdotool
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom firefox_bg.py

  3. Test_run le script par la commande:

    python3 /path/to/firefox_bg.py
    
  4. Si tout fonctionne correctement, ajoutez-le à Applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:

    /bin/bash -c "sleep 10 && python3 /path/to/firefox_bg.py"
    

    Autrement, copiez le code ci-dessous dans un fichier vide, enregistrez-le sous le nom firefox_bgrunner.desktop dans ~/usr/share/applications, déconnectez-vous puis reconnectez-vous.

    [Desktop Entry]
    Type=Application
    Exec=python3 /path/to/firefox_bg.py
    Name=Firefox Webbrowser Background Runner
    Icon=firefox
    StartupWMClasss=nonsense
    

    * La dernière ligne, StartupWMClasss=nonsense consiste à s'assurer que Firefox windows will appear under their own icon, not the one of the indicator.

    Inutile de mentionner que vous devez éditer la ligne Exec= pour refléter le chemin réel (absolu) de l'emplacement où vous avez stocké firefox_bg.py

    Ensuite, vous aurez le coureur du panneau disponible à partir de Dash:

    enter image description here

Autres applications?

J'ai testé la même procédure avec gnome-terminal andThunderbird (ce dernier n’est généralement pas le plus rapide au démarrage), et cela fonctionne parfaitement:

enter image description here

Pour utiliser avec d'autres applications, éditez simplement la ligne:

app = "firefox"

Remarque Cependant, certaines applications semblent vérifier si leur tentative de créer une fenêtre a réussi et créer un deuxième si le premier est non mappé. Cela m'est arrivé avec Inkscape.

Le script peut quand même parfaitement être utilisé, mais nécessiterait une petite modification. Si quelqu'un a besoin de l'utiliser avec Inkscape, laissez un commentaire.

5
Jacob Vlijm

J'aimerais proposer une solution 2019 à cela pour Ubuntu 18-19 + avec GNOME, qui est un peu plus simple (IMO) et utilise bash au lieu de python par souci de simplicité. J'ai fait ceci pour que Firefox demande mon mot de passe principal lors de ma connexion, mais ne le redemandez pas à moins que je ne voie les mots de passe. J'étais fatigué de le voir apparaître chaque fois que j'ai démarré Firefox.

Commencez par installer les dépendances:

Sudo apt-get update && apt-get install -y wmctrl xdotool

Ensuite, mettez ce script quelque part, dites /data/system/bin/firefox-background:

firefox "about:blank" &
WAITFOR="Mozilla Firefox"

APP=$(wmctrl -lp |grep "${WAITFOR}" |awk '{print $1}')
while [ -z "${APP}" ]; do
    sleep 1
    APP=$(wmctrl -lp |grep "${WAITFOR}" |awk '{print $1}')
done
xdotool windowunmap ${APP}

Et:

chmod +x /data/system/bin/firefox-background

Vous pouvez maintenant exécuter ce script comme vous le souhaitez, par exemple depuis une fenêtre de terminal ou depuis le démarrage de GNOME avec un fichier dans .config/autostart/FirefoxBackground.desktop:

[Desktop Entry]
Name=Firefox Background
Exec=/data/system/bin/firefox-background
Terminal=false
Icon=firefox
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true
StartupWMClasss=nonsense

Après cela, vous obtiendrez une fois le popup pour le mot de passe principal, et plus jamais, sauf si vous avez l'intention d'accéder à des informations sécurisées.

0
Fmstrat