Abaixo de duas versões de um script para ocultar automaticamente o inicializador quando a janela de um aplicativo é maximizada. Os scripts são testados em 14.04 / 14.10 /16.04
As diferenças
- A primeira versão é uma versão "geral", faz com que o lançador se esconda automaticamente sempre que uma janela de qualquer aplicação é maximizada.
- O segundo faz com que o lançador se esconda automaticamente, mas apenas em aplicativos que você define especificamente no cabeçalho do script.
Ambos os scripts reconhecem que as janelas devem ser iconizadas, então não há razão para ocultar automaticamente, e ambos os scripts trabalham em um espaço de trabalho específico; o ativador só muda para auto-ocultar nas áreas de trabalho onde, na verdade, uma ou mais janelas são maximizadas.
Instalando o wmctrl
Os scripts usam wmctrl
para mapear as janelas abertas no momento. Você pode ter que instalá-lo:
sudo apt-get install wmctrl
Os scripts
Ambos os scripts abaixo foram atualizados / reescritos em março de 2017.
1. A versão "básica", atua nas janelas maximizadas de todos os aplicativos
#!/usr/bin/env python3
import subprocess
import time
mx = "_NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_MAXIMIZED_HORZ"
key = ["org.compiz.unityshell:/org/compiz/profiles/unity/plugins/unityshell/",
"launcher-hide-mode"]
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
def force_get(cmd):
# both xprop and wmctrl break once and a while, this is to retry if so
val = None
while not val:
val = get(cmd)
return val
def get_res():
# look up screen resolution
scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
return [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
res = get_res()
hide1 = False
while True:
time.sleep(2)
hide = False
wlist = [l.split() for l in force_get(["wmctrl", "-lpG"]).splitlines()]
# only check windows if any of the apps is running
for w in wlist:
xpr = force_get(["xprop", "-id", w[0]])
if all([
mx in xpr, not "Iconic" in xpr,
0 <= int(w[3]) < res[0], 0 <= int(w[4]) < res[1],
]):
hide = True
break
if hide != hide1:
nexts = "0" if hide == False else "1"
currset = get(["gsettings", "get", key[0], key[1]])
if nexts != currset:
subprocess.Popen([
"gsettings", "set", key[0], key[1], nexts
])
hide1 = hide
2. A versão específica da aplicação:
#!/usr/bin/env python3
import subprocess
import time
apps = ["gnome-terminal", "firefox"]
mx = "_NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_MAXIMIZED_HORZ"
key = ["org.compiz.unityshell:/org/compiz/profiles/unity/plugins/unityshell/",
"launcher-hide-mode"]
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
def force_get(cmd):
# both xprop and wmctrl break once and a while, this is to retry if so
val = None
while not val:
val = get(cmd)
return val
def get_res():
# look up screen resolution
scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
return [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
res = get_res()
hide1 = False
while True:
time.sleep(2)
hide = False
wlist = [l.split() for l in force_get(["wmctrl", "-lpG"]).splitlines()]
pids = [get(["pgrep", app]) for app in apps]
# only check windows if any of the apps is running
if any(pids):
for w in wlist:
xpr = force_get(["xprop", "-id", w[0]])
if all([
mx in xpr, not "Iconic" in xpr,
0 <= int(w[3]) < res[0], 0 <= int(w[4]) < res[1],
any([w[2] == pid for pid in pids]),
]):
hide = True
break
if hide != hide1:
nexts = "0" if hide == False else "1"
currset = get(["gsettings", "get", key[0], key[1]])
if nexts != currset:
subprocess.Popen([
"gsettings", "set", key[0], key[1], nexts
])
hide1 = hide
Como usar:
Copie um dos scripts para um arquivo vazio, [defina, se você escolheu o segundo, seus aplicativos para ocultar]
e salve-o como autohide.py
.
Execute-o pelo comando:
python3 /path/to/autohide.py
Se ele funcionar como você deseja, adicione-o aos seus aplicativos de inicialização.
N.B. Se você usá-lo como um aplicativo de inicialização, você deve descomentar a linha:
time.sleep(10)
Na seção principal do script. O script pode falhar se for chamado antes que a área de trabalho esteja totalmente carregada. Altere o valor (10), dependendo do seu sistema.
Explicação
Em um loop, o script:
- [verifica os possíveis pids dos aplicativos definidos]
- verifica a resolução da tela, para ver onde as janelas estão posicionadas (em relação à área de trabalho atual)
- cria uma lista de janelas atuais, seu estado
- verifica o modo de ocultação atual (0 para não autohide ou 1 para autohide)
(somente) se uma mudança no modo de ocultação precisar ser feita, o script alterará a configuração.