如何让 Firefox 像 Chromium 一样在后台运行?

如何让 Firefox 像 Chromium 一样在后台运行?

Chromium 的一个已知功能是可以让它更轻松地在后台运行。

是否可以对 Firefox(和其他应用程序)执行相同操作?

答案1

在后台运行应用程序

以下解决方案将允许您在后台运行 Firefox(或任何其他应用程序),这意味着:没有可见的窗口。该应用程序也不会在 Dash 中显示为正在运行的应用程序:

在此处输入图片描述

在此处输入图片描述

但是如果你选择Toggle Firefox,应用程序会立即弹出:

在此处输入图片描述

怎么运行的

  1. 如果面板图标(指示器)启动,它会启动一个新firefox窗口,但立即将其隐藏(包括可能存在的firefox窗口),使用xdotool

    xdotool windowunmap <window_id>
    

    这不仅会隐藏窗口,而且还会隐藏正在firefox运行的事实根本,因为 Unity 启动器作用于可见的现有窗口。

  2. 指示器将所有未映射窗口的 ID 存储在中,以便下次从菜单中~/.config/hidden_windows选择时进行映射。Toggle Firefox

剧本

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

如何使用

  1. 脚本wmctrl需要xdotool

    sudo apt-get install wmctrl xdotool
    
  2. 将脚本复制到一个空文件中,另存为firefox_bg.py

  3. 通过以下命令测试运行脚本:

    python3 /path/to/firefox_bg.py
    
  4. 如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:

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

    或者,将下面的代码复制到一个空文件中,将其保存为firefox_bgrunner.desktop~/usr/share/applications然后注销并重新登录。

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

    *最后一行,StartupWMClasss=nonsense是为了确保Firefox windows will appear under their own icon, not the one of the indicator

    无需提及,您必须编辑该Exec=行以反映存储位置的真实(绝对)路径firefox_bg.py

    然后您将获得 Dash 提供的面板运行器:

    在此处输入图片描述

其他应用程序?

gnome-terminal我使用和测试了相同的过程Thunderbird(后者通常不是启动最快的),并且它运行完美:

在此处输入图片描述

要与其他应用程序一起使用,只需编辑以下行:

app = "firefox"

笔记但是有些应用程序似乎会检查创建窗口的尝试是否成功,如果第一个窗口未映射,则会创建第二个窗口。我使用 时就遇到了这种情况Inkscape

尽管该脚本仍然可以完美使用,但需要进行一些小修改。如果有人可能需要使用它Inkscape,请发表评论。

答案2

我想为带有 GNOME 的 Ubuntu 18-19+ 提出一个 2019 年的解决方案,这个解决方案稍微简单一些(在我看来),并且为了简单起见使用 bash 而不是 python。我这样做是为了让 Firefox 在我登录时询问我的主密码,但除非我去查看密码,否则不会再询问。我厌倦了每次启动 Firefox 时都会弹出它。

首先安装依赖项:

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

然后把这个脚本放在某处,例如/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}

和:

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

现在您可以按照自己喜欢的方式运行此脚本,例如从终端窗口或从 GNOME 启动中使用以下文件运行.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

此后,您只会弹出一次主密码,之后便不会再弹出,除非您想要访问安全信息。

相关内容