it-swarm.com.de

Wie kann ich Firefox wie Chrom im Hintergrund laufen lassen?

Eine bekannte Funktion in Chromium ist die Option, dass es im Hintergrund ausgeführt wird, was das Öffnen erleichtert.

Ist es möglich, dasselbe mit Firefox (und anderen Anwendungen) zu tun?

5
akkk3

Ausführen einer Anwendung im Hintergrund

Mit der folgenden Lösung können Sie Firefox (oder eine andere Anwendung) im Hintergrund ausführen. Dies bedeutet: ohne ein sichtbares Fenster . Die Anwendung wird in Dash auch nicht als laufende Anwendung angezeigt:

enter image description here

enter image description here

Wenn Sie auswählen Toggle Firefox Die Anwendung wird jedoch sofort geöffnet:

enter image description here

Wie es funktioniert

  1. Wenn das Bedienfeldsymbol (Anzeige) gestartet wird, wird ein neues firefox Fenster geöffnet, das jedoch sofort (einschließlich möglicher vorhandener firefox Fenster) mithilfe von xdotool vom Erdboden ausgeblendet wird:

    xdotool windowunmap <window_id>
    

    Dadurch wird nicht nur das Fenster ausgeblendet, sondern auch die Tatsache, dass firefox überhaupt ausgeführt wird , da der Unity Launcher auf sichtbar vorhandene Fenster einwirkt.

  2. Der Indikator speichert die ID aller nicht zugeordneten Fenster in ~/.config/hidden_windows, um sie bei der nächsten Auswahl zuzuordnen Toggle Firefox aus dem Menü.

Das Drehbuch

#!/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()

Wie benutzt man

  1. Das Skript benötigt sowohl wmctrl als auch xdotool

    Sudo apt-get install wmctrl xdotool
    
  2. Kopieren Sie das Skript in eine leere Datei und speichern Sie es als firefox_bg.py

  3. Teste das Skript mit dem Befehl:

    python3 /path/to/firefox_bg.py
    
  4. Wenn alles funktioniert, fügen Sie es zu Startup Applications hinzu: Dash> Startup Applications> Add. Fügen Sie den Befehl hinzu:

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

    Kopieren Sie alternativ den folgenden Code in eine leere Datei, speichern Sie ihn als firefox_bgrunner.desktop in ~/usr/share/applications, melden Sie sich ab und wieder an.

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

    * Die letzte Zeile, StartupWMClasss=nonsense, soll sicherstellen, dass Firefox windows will appear under their own icon, not the one of the indicator.

    Sie müssen nicht erwähnen, dass Sie die Zeile Exec= bearbeiten müssen, um den tatsächlichen (absoluten) Pfad zu dem Speicherort von firefox_bg.py wiederzugeben.

    Dann haben Sie den Panel Runner von Dash zur Verfügung:

    enter image description here

Andere Anwendungen?

Ich habe das gleiche Verfahren mit gnome-terminal undThunderbird getestet (letzteres ist normalerweise nicht am schnellsten zu starten), und es funktioniert einwandfrei:

enter image description here

Zur Verwendung mit anderen Anwendungen bearbeiten Sie einfach die Zeile:

app = "firefox"

Beachten Sie jedoch, dass einige Anwendungen zu prüfen scheinen, ob ihr Versuch, ein Fenster zu erstellen, erfolgreich war, und erstellen Sie ein zweite, wenn die erste nicht zugeordnet ist. Dies ist mir mit Inkscape passiert.

Das Skript kann dann zwar auch einwandfrei verwendet werden, würde aber eine kleine Bearbeitung benötigen. Wenn jemand es jemals mit Inkscape verwenden muss, hinterlassen Sie bitte einen Kommentar.

5
Jacob Vlijm

Ich würde gerne eine 2019-Lösung für Ubuntu 18-19 + mit GNOME vorschlagen, die ein bisschen einfacher ist (IMO) und der Einfachheit halber bash anstelle von python verwendet. Ich habe dies so gemacht, dass Firefox bei der Anmeldung nach meinem Hauptkennwort fragt, dann aber nicht mehr, es sei denn, ich habe Kennwörter angezeigt. Ich hatte es satt, jedes Mal, wenn ich mit Firefox anfing, aufzutauchen.

Installieren Sie zuerst die Abhängigkeiten:

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

Dann platziere dieses Skript irgendwo, sage /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}

Und:

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

Jetzt können Sie dieses Skript wie gewünscht von einem Terminalfenster oder vom GNOME-Start mit einer Datei in .config/autostart/FirefoxBackground.desktop ausführen:

[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

Danach erhalten Sie ein Popup-Fenster für das Hauptkennwort, und zwar nie mehr, es sei denn, Sie möchten auf sichere Informationen zugreifen.

0
Fmstrat