Como posso fazer o firefox rodar em segundo plano como o cromo?

4

Um recurso conhecido no Chromium é a opção de executá-lo em segundo plano, o que facilita a abertura.

É possível fazer o mesmo com o firefox (e outros aplicativos)?

    
por akkk3 26.11.2016 / 17:15

1 resposta

5

Executando um aplicativo em segundo plano

A solução abaixo permitirá que você execute o firefox (ou qualquer outro aplicativo) em segundo plano, ou seja: sem uma janela visível . Nem o aplicativo será exibido no Dash como um aplicativo em execução:

SevocêescolherToggleFirefox,oaplicativoiráaparecerimediatamente:

Comofunciona

  1. Seoíconedopainel(indicador)iniciar,eleiniciaráumanovajanelafirefox,masaocultaráimediatamente(incluindopossíveisfirefoxwindowsexistentes)dafacedaTerra,usandoxdotool:

    xdotoolwindowunmap<window_id>

    Issonãoapenasocultaráajanela,mastambémocultaráofatodequefirefoxestásendoexecutadoemtudo,jáqueoativadordeunidadeageemjanelasvisivelmenteexistentes.

  2. Oindicadorarmazenaoiddetodasasjanelasnãomapeadasem~/.config/hidden_windows,aseremmapeadasnapróximavezquevocêescolherAlternarFirefoxnomenu.

Oscript

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

Como usar

  1. O script precisa dos dois wmctrl e xdotool

    sudo apt-get install wmctrl xdotool
    
  2. Copie o script em um arquivo vazio, salve-o como firefox_bg.py

  3. Teste o script pelo comando:

    python3 /path/to/firefox_bg.py
    
  4. Se tudo funcionar bem, adicione-o aos aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:

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

    Como alternativa, copie o código abaixo em um arquivo vazio, salve-o como firefox_bgrunner.desktop em ~/usr/share/applications , efetue logout e volte.

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

    * A última linha, StartupWMClasss=nonsense é para garantir Firefox windows will appear under their own icon, not the one of the indicator .

    Não é necessário mencionar que você precisa editar a linha Exec= para refletir o caminho real (absoluto) para onde você armazenou firefox_bg.py

    Então você terá o painel de controle disponível no Dash:

Outrasaplicações?

Eutesteiomesmoprocedimentocomgnome-terminaleThunderbird(oúltimogeralmentenãoéomaisrápidoparaainicialização)efuncionaperfeitamente:

Parausarcomoutrosaplicativos,bastaeditaralinha:

app="firefox"

Nota no entanto, algumas aplicações parecem verificar se a tentativa de criar uma janela foi bem-sucedida e criar uma segunda se a primeira não for mapeada. Isso aconteceu comigo com Inkscape .

O script pode até mesmo ser usado perfeitamente, mas precisaria de uma pequena edição. Se alguém precisar usá-lo com Inkscape , por favor deixe um comentário.

    
por Jacob Vlijm 27.11.2016 / 11:29