Как я могу автоматически скрыть панель запуска через скрипт, когда я разверну браузер?
Я пытался контролировать поведение Ubuntu 14.4.1 Launcher. Я хочу, чтобы он автоматически скрывался каждый раз, когда у меня открывалось окно браузера, например, Firefox. Я нашел это решение:
#!/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;
но, кажется, слишком стар, чтобы работать, то я нашел это
Я попытался объединить два сценария вместе, поэтому вот что я сделал:
#!/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;
Но скрипт не работает. Кто-нибудь может улучшить этот сценарий для меня и заставить его работать?
2 ответа
Ниже две версии скрипта для автоматического скрытия панели запуска, когда окно приложения развернуто. Скрипты протестированы 14.04 / 14.10 /16.04
Различия
- Первая версия является "общей" версией, она делает панель запуска автоматически скрытой всякий раз, когда окно любого приложения развернуто.
- Во втором случае средство запуска автоматически скрывается, но только в тех приложениях, которые вы специально определили в заголовке сценария.
Оба сценария распознают окна, которые должны быть иконизированы, тогда нет никаких причин для автоматического скрытия, и оба сценария работают в зависимости от рабочей области; средство запуска переключается в режим автоматического скрытия только в тех рабочих пространствах, где фактически развернуто одно или несколько окон.
Установка wmctrl
Скрипты используют wmctrl
для сопоставления текущих открытых окон. Возможно, вам придется установить его:
sudo apt-get install wmctrl
Сценарии
Оба скрипта ниже были обновлены / переписаны в марте 2017 года.
1. "Базовая" версия, действует на развернутых окнах всех приложений
#!/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. Версия для конкретного приложения:
#!/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
Как пользоваться:
Скопируйте любой из сценариев в пустой файл,
[установить, если вы выбрали второй, ваши приложения, чтобы скрыть]
и сохранить его как autohide.py
,
Запустите его командой:
python3 /path/to/autohide.py
Если он работает так, как вы хотите, добавьте его в свои автозагрузки.
NB. Если вы используете его в качестве запускаемого приложения, вы должны раскомментировать строку:
time.sleep(10)
В главном разделе сценария. Сценарий может завершиться сбоем, если он вызывается до полной загрузки рабочего стола. Измените значение (10), в зависимости от вашей системы.
объяснение
В цикле скрипт:
- [проверяет возможные пиды установленных приложений]
- проверяет разрешение экрана, чтобы увидеть, где расположены окна (относительно текущего рабочего пространства)
- создает список текущих окон, их состояние
- проверяет текущий режим скрытия (0 для автоматического скрытия или 1 для автоматического скрытия)
(только), если необходимо внести изменения в режим скрытия, сценарий изменяет настройку.
Вот, пожалуйста, ребята. Протестировано на моей Ubuntu 14.04 с оригинальной средой Unity. Надеюсь, кто-то оценит мою маленькую работу...
Подходит для одного окна браузера
#!/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;
Старый сценарий