Размещение лаунчера с двумя мониторами
У меня есть два монитора. У меня есть несколько рабочих мест. Я хочу, чтобы мой модуль запуска ("установка пускового устройства" в настройках> дисплеи) присутствовал на обоих моих мониторах в одной рабочей области, но имел только один модуль запуска (на главном мониторе) в другой рабочей области. Это потому, что я хочу растянуть Tweetdeck на обоих мониторах, а лаунчер мешает. Это возможно?
Рабочая область 1 (хорошо):

Рабочая область 2 (НЕ хорошо):

Рабочая область 2 (хорошо):

1 ответ
Как определяется расположение лаунчера?
Расположение Launcher определяется несколькими вещами:
Значение, установленное в
/org/compiz/profiles/unity/plugins/unityshell/num-launchers, Вы можете прочитать это командой:dconf read /org/compiz/profiles/unity/plugins/unityshell/num-launchersкоторый будет выводить либо
1(пусковая установка на одном экране) или0(лаунчер на всех экранах).Чтобы установить панель запуска на все экраны можно сделать командой:
dconf write /org/compiz/profiles/unity/plugins/unityshell/num-launchers 0Если значение
1(видимый только на одном экране), мы можем установить, на каком экране появляется средство запуска, установив целевой экран в качестве основного экрана, сxrandrкоманда:xrandr --output <screen_name> --primary
Это именно те команды, которые используются в скриптах ниже.
script1; вручную установить панель запуска только слева или на обоих экранах (с помощью сочетания клавиш)
В зависимости от аргумента, с которым вы запускаете скрипт, он либо устанавливает панель запуска для показа на всех экранах с помощью команды:
dconf write /org/compiz/profiles/unity/plugins/unityshell/num-launchers 0
или только на одном:
dconf write /org/compiz/profiles/unity/plugins/unityshell/num-launchers 1
В последнем случае он также устанавливает левый экран в качестве основного.
Сценарий
#!/usr/bin/env python3
import subprocess
import sys
key = "dconf write /org/compiz/profiles/unity/plugins/unityshell/num-launchers "
arg = sys.argv[1]
if arg == "left":
# the launcher is set to show on all screens
subprocess.Popen(["/bin/bash", "-c", key+"1"])
elif arg == "all":
# the launcher is set to show only on the left screen
subprocess.Popen(["/bin/bash", "-c", key+"0"])
# make sure the left screen is the primary one
scr_data = subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()
left = [l.split()[0] for l in scr_data if "+0+0" in l][0]
subprocess.Popen(["xrandr", "--output", left, "--primary"])
Как пользоваться
- Скопируйте скрипт в пустой файл, сохраните его как
launcher_pos.py Протестируйте скрипт обеими командами (из окна терминала):
python3 /path/to/launcher_pos.py leftа также
python3 /path/to/launcher_pos.py allесли все работает нормально, добавьте команды к двум комбинациям сочетаний клавиш: выберите: "Системные настройки" > "Клавиатура" > "Ярлыки" > "Пользовательские сочетания клавиш". Нажмите "+" и добавьте обе команды к доступным ярлыкам.
Сценарий 2; автоматическая версия
Сценарий ниже автоматически отслеживает текущее рабочее пространство (независимо от того, сколько рабочих мест у вас есть и в какой конфигурации).
Этот сценарий запускается с рабочими пространствами, где вы хотите запускать только слева, в качестве аргумента. Пример:
Если вы запустите скрипт с помощью команды:
python3 /path/to/launcher_pos.py 2 3
Результат:
Сценарий
import subprocess
import sys
import time
wspace = sys.argv[1:]
key = "dconf write /org/compiz/profiles/unity/plugins/unityshell/num-launchers "
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
res = get_res()
def get_dt():
# get the current viewport
vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
dt = [int(n) for n in vp_data[3].split("x")]
cols = int(dt[0]/res[0])
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
curr_col = int(curr_vpdata[0]/res[0])+1; curr_row = int(curr_vpdata[1]/res[1])
return str(curr_col+curr_row*cols)
def set_launcher(arg):
if arg == "left":
# the launcher is set to show on all screens
subprocess.Popen(["/bin/bash", "-c", key+"1"])
elif arg == "all":
# the launcher is set to show only on the left screen
subprocess.Popen(["/bin/bash", "-c", key+"0"])
# make sure the left screen is the primary one
scr_data = subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()
left = [l.split()[0] for l in scr_data if "+0+0" in l][0]
subprocess.Popen(["xrandr", "--output", left, "--primary"])
curr_ws1 = get_dt()
while True:
time.sleep(1)
curr_ws2 = get_dt()
if curr_ws2 != curr_ws1:
if curr_ws2 in wspace:
arg = "left"
else:
arg = "all"
set_launcher(arg)
curr_ws1 = curr_ws2
Как пользоваться
Скрипт нужен
wmctrlsudo apt-get install wmctrlСкопируйте скрипт в пустой файл, сохраните его как
launcher_pos.pyПопробуйте запустить его по команде:
python3 /path/to/launcher_pos.py 1 3В рабочей области 1 и 3 панель запуска теперь должна отображаться только слева
Если все работает нормально, добавьте его в "Автозагрузка приложений": Dash > "Автозагрузка приложений" > "Добавить". Добавьте команду:
/bin/bash -c "sleep 15 && python3 /path/to/launcher_pos.py 1 3"(Если рабочие области 1 и 3 - это те, которые вам нужны, только панель запуска слева)
