Como eu posso ocultar automaticamente o lançador através de um script, quando eu maximizo o navegador?

6

Eu estava tentando controlar o comportamento do Ubuntu 14.4.1 Launcher. Eu quero que ele se auto-esconda toda vez que eu tiver uma janela do navegador como o firefox maxmaized. Eu encontrei esta solução:

#!/bin/bash

## Change value of "hide" to the command which worked for you to hide the panel
hide='gsettings set com.canonical.Unity2d.Launcher hide-mode 1;'

## Change value of "show" to the command which worked for you to show the panel when it was hidden
show='gsettings set com.canonical.Unity2d.Launcher hide-mode 0;'

## Look for the grep value, add a new browser or application name followed by "\|" eg: 'firefox\|google\|chromium'
while [ 1 ]
 do z=$(wmctrl -l -p | grep -i 'firefox\|google');
    if [ -n "$z" ]; then 
        eval $hide
    else
        eval $show
    fi;
    sleep 2;
done;

mas parece velho demais para funcionar, então eu encontrei isto

Eu tentei combinar os dois scripts juntos, então aqui está o que eu fiz:

#!/bin/bash

AUTOHIDE=$(dconf read /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode)
if [[ $AUTOHIDE -eq 1 ]]
then
     dconf write /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode 0
else
     dconf write /org/compiz/profiles/unity/plugins/unityshell/launcher-hide-mode 1
fi

## Look for the grep value, add a new browser or application name followed by "\|" eg: 'firefox\|google\|chromium'
while [ 1 ]
 do z=$(wmctrl -l -p | grep -i 'firefox\|google');
    if [ -n "$z" ]; then 
        eval $hide
    else
        eval $show
    fi;
    sleep 2;
done;

Mas o script não funciona. Alguém pode refinar este script para mim e fazê-lo funcionar?

    
por Misho21 25.11.2014 / 11:42

2 respostas

5

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.

    
por Jacob Vlijm 25.11.2014 / 12:09
4

Aqui você vai galera. Testado no meu Ubuntu 14.04 com o ambiente Unity original. Espero que alguém aprecie meu pequeno trabalho ...

É adequado para uma janela do navegador

#!/bin/bash
## Tested with Ubuntu 14.04 Unity
## Auto hide Unity Launcher when web browser is maximized 
## wmctrl is required: sudo apt-get install wmctrl
## ~pba


## Change value of "key" to the command which worked for you
key='gsettings set org.compiz.unityshell:/org/compiz/profiles/unity/plugins/unityshell/ launcher-hide-mode';

while [ 1 ];
 do
 p=$(wmctrl -lG);
 a=($(echo -E "$p" | grep -i "unity-launcher"));
 w=($(echo -E "$p" | grep -i "firefox\|google\|chromium\|opera"));
 if [ ${w[0]} ]; then
 e=$(xwininfo -all -id ${w[0]});
 l=( $(echo -E "$e" | grep -ci '   Hidden')
     $(echo -E "$e" | grep -ci '   Maximized Vert')
     $(echo -E "$e" | grep -ci '   Maximized Horz') );
 b=($(echo -E "$p" | grep -i "unity-panel"));
 if [ ${l[0]} -ne "1" -a ${l[1]} -eq "1" -a ${l[2]} -eq "1" -a ${w[2]} -eq ${a[4]} -a ${w[3]} -eq ${b[5]} ]; then 
  eval "$key 1"; 
   elif [ ${l[0]} -ne "1" -a ${l[1]} -ne "1" -a ${l[2]} -ne "1" -a ${a[3]} -lt "0" ]; then 
    eval "$key 0";
   elif [ ${l[0]} -eq "1" -a ${a[3]} -lt "0" -a ${w[2]} -ne "1" ]; then 
    eval "$key 0";
   elif [ ${l[0]} -ne "1" -a ${l[1]} -eq "1" -a ${l[2]} -eq "1" -a ${a[3]} -lt "0" -a ${w[2]} -ne "0" ]; then 
    eval "$key 0";
   elif [ ${l[0]} -ne "1" -a ${l[1]} -eq "1" -a ${l[2]} -eq "1" -a ${a[3]} -lt "0" -a ${w[3]} -ne ${b[5]} -a ${w[3]} -ne "0" ]; then 
    eval "$key 0";
 fi;
 elif [ ${a[3]} -lt "0" ]; then eval "$key 0";
 fi;
 sleep 2;
done;

Mais antigo script

    
por Paul B 25.11.2014 / 18:33