Размещение лаунчера с двумя мониторами

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

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

Изображение 1

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

Изображение 2

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

Изображение 3

1 ответ

Решение

Как определяется расположение лаунчера?

Расположение Launcher определяется несколькими вещами:

  1. Значение, установленное в /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
    
  2. Если значение 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

Как пользоваться

  1. Скрипт нужен wmctrl

    sudo apt-get install wmctrl
    
  2. Скопируйте скрипт в пустой файл, сохраните его как launcher_pos.py

  3. Попробуйте запустить его по команде:

    python3 /path/to/launcher_pos.py 1 3
    

    В рабочей области 1 и 3 панель запуска теперь должна отображаться только слева

  4. Если все работает нормально, добавьте его в "Автозагрузка приложений": Dash > "Автозагрузка приложений" > "Добавить". Добавьте команду:

    /bin/bash -c "sleep 15 && python3 /path/to/launcher_pos.py 1 3"
    

    (Если рабочие области 1 и 3 - это те, которые вам нужны, только панель запуска слева)

Другие вопросы по тегам