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
Seoíconedopainel(indicador)iniciar,eleiniciaráumanovajanela
firefox
,masaocultaráimediatamente(incluindopossíveisfirefox
windowsexistentes)dafacedaTerra,usandoxdotool
:xdotoolwindowunmap<window_id>
Issonãoapenasocultaráajanela,mastambémocultaráofatodeque
firefox
estásendoexecutadoemtudo,jáqueoativadordeunidadeageemjanelasvisivelmenteexistentes.- 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
-
O script precisa dos dois
wmctrl
exdotool
sudo apt-get install wmctrl xdotool
-
Copie o script em um arquivo vazio, salve-o como
firefox_bg.py
-
Teste o script pelo comando:
python3 /path/to/firefox_bg.py
-
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 garantirFirefox 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ê armazenoufirefox_bg.py
Então você terá o painel de controle disponível no Dash:
Outrasaplicações?
Eutesteiomesmoprocedimentocomgnome-terminal
eThunderbird
(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.