web-dev-qa-db-ja.com

Firefoxをクロムのようなバックグラウンドで実行するにはどうすればよいですか?

Chromiumの既知の機能は、バックグラウンドで実行するオプションです。これにより、簡単に開くことができます。

Firefox(およびその他のアプリケーション)でも同じことを行うことはできますか?

5
akkk3

バックグラウンドでアプリケーションを実行する

以下のソリューションでは、Firefox(またはその他のアプリケーション)をバックグラウンドで実行できます。つまり、表示ウィンドウなしで。また、アプリケーションは実行中のアプリケーションとしてDashに表示されません。

enter image description here

enter image description here

選ぶなら Toggle Firefox ただし、アプリケーションはすぐにポップアップします。

enter image description here

使い方

  1. パネルアイコン(インジケータ)が起動すると、firefoxウィンドウを起動しますが、firefoxを使用して、地球の表面からすぐに非表示(既存のxdotoolウィンドウを含む)を非表示にします。

    xdotool windowunmap <window_id>
    

    これは、ウィンドウを非表示にするだけでなく、firefoxが実行されているという事実をすべて非表示にします。これは、ユニティランチャーが既存のウィンドウに表示されるためです。

  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. スクリプトには、wmctrlxdotoolの両方が必要です

    Sudo apt-get install wmctrl xdotool
    
  2. スクリプトを空のファイルにコピーし、firefox_bg.pyとして保存します

  3. 次のコマンドでスクリプトをTest_runします:

    python3 /path/to/firefox_bg.py
    
  4. すべてが正常に機能する場合は、スタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>追加コマンドを追加します。

    /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を保存した場所への実際の(絶対)パスを反映する必要があることを述べる必要はありません。

    次に、ダッシュからパネルランナーを使用できるようにします。

    enter image description here

他のアプリケーション?

同じ手順をgnome-terminalThunderbird(後者は通常起動が最も速くありません)でテストしましたが、完全に動作します:

enter image description here

他のアプリケーションで使用するには、次の行を編集するだけです。

app = "firefox"

ただし、一部のアプリケーションは、ウィンドウの作成が成功したかどうかを確認し、最初のものがマップされていない場合、2番目のもの。これはInkscapeで私に起こりました。

それでもスクリプトは完全に使用できますが、少し編集する必要があります。 Inkscapeで使用する必要がある場合は、コメントを残してください。

5
Jacob Vlijm

GNOMEを搭載したUbuntu 18-19 +向けに2019年のソリューションを提案します。GNOMEは少し単純(IMO)であり、pythonの代わりにbashを使用して簡単にします。これは、サインイン時に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

これで、ターミナルウィンドウから、または.config/autostart/FirefoxBackground.desktopのファイルを使用したGNOMEスタートアップからなど、このスクリプトを実行できます。

[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

その後、マスターパスワードのポップアップが1回表示されますが、セキュリティで保護された情報にアクセスする場合を除き、再度表示されることはありません。

0
Fmstrat