Chromium 的一个已知功能是可以让它更轻松地在后台运行。
是否可以对 Firefox(和其他应用程序)执行相同操作?
答案1
在后台运行应用程序
以下解决方案将允许您在后台运行 Firefox(或任何其他应用程序),这意味着:没有可见的窗口。该应用程序也不会在 Dash 中显示为正在运行的应用程序:
但是如果你选择Toggle Firefox,应用程序会立即弹出:
怎么运行的
如果面板图标(指示器)启动,它会启动一个新
firefox
窗口,但立即将其隐藏(包括可能存在的firefox
窗口),使用xdotool
:xdotool windowunmap <window_id>
这不仅会隐藏窗口,而且还会隐藏正在
firefox
运行的事实根本,因为 Unity 启动器作用于可见的现有窗口。- 指示器将所有未映射窗口的 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()
如何使用
脚本
wmctrl
需要xdotool
sudo apt-get install wmctrl xdotool
将脚本复制到一个空文件中,另存为
firefox_bg.py
通过以下命令测试运行脚本:
python3 /path/to/firefox_bg.py
如果一切正常,请将其添加到启动应用程序: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
此后,您只会弹出一次主密码,之后便不会再弹出,除非您想要访问安全信息。