Разные разрешения экрана для каждого рабочего пространства? - proUbuntu
5 голосов
/ 18 февраля 2015

Я использую i3-wm на своем ноутбуке с Ubuntu. У меня размер экрана 3200х1800. Который отлично подходит для чего-то, но ужасен для других вещей. (Netflix vs gvim).

Я бы хотел изменить разрешение одного из моих рабочих пространств или нескольких. Но я понятия не имею, возможно ли это вообще ... могу ли я использовать compton для этого или, возможно, другую программу?

1 Ответ

2 голосов
/ 19 февраля 2015

1. Предполагая, что вы находитесь на Unity

Скрипт ниже должен изменить ваше разрешение в зависимости от текущего окна просмотра в Unity. Некоторое время я тестировал его на нескольких компьютерах, и он работал без ошибок.

Однако я бы посоветовал немного протестировать его и посмотреть, работает ли он без единого перерыва; повторяющиеся wmctrl команды иногда могут случайно выйти из «ненулевого». Если это так, нам нужно встроить try / except.

Примечания

  • Я проверил это на установке с одним монитором. для нескольких мониторов, вероятно, потребуется другой способ анализа вывода xrandr.
  • В заголовке скрипта вам нужно установить желаемое разрешение для каждого из ваших окон просмотра, я установил его так, как указано в вашем комментарии, но вы можете изменить его в любое время. Используйте формат:

    resolutions = [[<horizontal>, <vertical], [<horizontal>, <vertical], ......]
    

    как это показано в сценарии.

  • Нет необходимости говорить, что вы должны использовать поддерживаемые разрешения, как при выводе xrandr для вашего монитора.

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

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

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

  3. Тестовый запуск в течение некоторого времени в окне терминала командой:

    python3 screen_res.py
    
  4. Если все работает нормально, добавьте его в свои запускаемые приложения: Dash> Startup Applications> Add ...

Сценарий

#!/usr/bin/env python3
import subprocess
import time

# list of resolution per viewport, for each viewport a separate [hor, vert]
# I pre- entered your viewports. quite some! listing takes more space than the script :)
resolutions = [
    [3200, 1800],
    [3200, 1800],
    [3200, 1800],
    [3200, 1800],
    [3200, 1800],
    [3200, 1800],
    [3200, 1800],
    [1920, 1080],
    [1920, 1080],
    [1920, 1080],
    ]

def get_xr():
    return subprocess.check_output(["xrandr"]).decode("utf-8").split()

check = get_xr()
plus = 2 if check[check.index("connected")+1] == "primary" else 1

while True:
    # resolution:
    xr = get_xr()    
    res = [int(n) for n in xr[xr.index("connected")+plus].split("+")[0].split("x")]
    # get 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])
    curr_vp = curr_col+curr_row*cols
    # check and change resolution if needed
    if res != resolutions[curr_vp-1]:
        new_res = ("x").join([str(n) for n in resolutions[curr_vp-1]])
        subprocess.call(["xrandr", "-s", new_res])
    time.sleep(1)

Объяснение

  • В цикле скрипт сначала проверяет текущее разрешение экрана по команде:

    xrandr
    
  • Впоследствии скрипт проверяет общий размер рабочего стола (все окна просмотра) с помощью команды:

    wmctrl -d
    
  • Тогда из резолюции i.c.w. общий размер рабочего стола, он рассчитывает количество столбцов, которое равно общему размеру рабочего стола, деленному на горизонтальное разрешение.

  • Также в выводе wmctrl -d указывается позиция текущего видового экрана на охватывающем рабочем столе: например: VP: 1680,0.
  • С помощью этой информации мы можем сделать вывод, в каком столбце и строке мы находимся, и проверить, соответствует ли текущее установленное разрешение разрешению, как мы его определили в списке в разделе заголовка скрипта.
    Если нет, скрипт дает команду на изменение разрешения командой:

    xrandr -s <xres>x<yres>
    

2. Версия XFCE

  • настроен как версия выше (также требуется wmctrl)
#!/usr/bin/env python3
import subprocess
import time

# list of resolution per viewport, for each viewport a separate [hor, vert]
# below just an example! set resolutions for your own screen
resolutions = [
    [1280, 1024],
    [1280, 960],
    [1280, 1024],
    [1280, 1024],
    ]

def get_xr():
    return subprocess.check_output(["xrandr"]).decode("utf-8").split()

check = get_xr()
plus = 2 if check[check.index("connected")+1] == "primary" else 1

while True:
    # resolution:
    xr = get_xr()    
    res = [int(n) for n in xr[xr.index("connected")+plus].split("+")[0].split("x")]
    # get current workspace
    vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").splitlines()
    curr_ws = int([l.split()[0] for l in vp_data if "*" in l][0])
    # check and change resolution if needed
    if res != resolutions[curr_ws]:
        new_res = ("x").join([str(n) for n in resolutions[curr_ws]])
        subprocess.call(["xrandr", "-s", new_res])
    time.sleep(1)
...