Различные разрешения экранов для каждой рабочей области?

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

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

5
задан 20 February 2015 в 14:17

2 ответа

1. Принятие Вас находится на Единице

Сценарий ниже должен изменить Ваше разрешение, в зависимости от текущей области просмотра в Единице. Я протестировал его на нескольких компьютерах некоторое время, и это работало без ошибки.

Я предложил бы однако также протестировать его некоторое время и видеть, работает ли это без одиночного разрыва; повторный wmctrl команды могут иногда выходить "ненулевой" случайно. Если так, мы должны создать в a 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. Если все хорошо работает, добавьте его к своим приложениям запуска: Тире> Приложения Запуска> Добавляет...

Сценарий

#!/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)
2
ответ дан 23 November 2019 в 10:28

Я реализовал сценарий Python @Jacob Vlijm для XFCE. Это работало хорошо за исключением старой Windows-программы, пробегающей вино. Каждый раз циклически повторенный сценарий, заморозило бы курсор мыши для меньше, чем секунда. Проверка 1x/sec означала много заикания. Я портировал его к сценарию удара, изменив его, чтобы только назвать wmctrl однажды на проверку и только назвать xrandr, если разрешение должно быть изменено. Обратите внимание, что это действительно требует, чтобы wmctrl был установлен.

#!/usr/bin/env bash
#Tested in XFCE 4.12.3 on Ubuntu 18.04
#Requires wmctrl. Install with:
#$ sudo apt-get install wmctrl

#Note: This checks current workspace res 1x/sec. To change rate, change "sleep" parameter below

#Enter appropriate resolution for each workspace, in order, in the same format as below.
RESOLUTIONS=('1920x1080' '1368x768')

check_and_change_res() {
  #echo "Parsing wmctrl -d"
  while read line; do
    #example line from wmctrl:
    #$ wmctrl -d
    #0  - DG: 1368x768  VP: N/A  WA: 0,25 1368x743  1
    #1  * DG: 1368x768  VP: 0,0  WA: 0,25 1368x743  2
    #If your line does not have a "DG:" (desktop geometry) preceding the current resolution, you
    #  will need to change the regex below.
    if [[ ${line} =~ ([[:digit:]]+)[[:space:]]+\*[[:space:]]+DG:[[:space:]]+([[:alnum:]]+) ]]; then
      current_ws="${BASH_REMATCH[1]}"
      current_res="${BASH_REMATCH[2]}"
      target_res="${RESOLUTIONS[current_ws]}"
      #echo "Current workspace: ${current_ws}; Current resolution: ${current_res}; Target resolution: ${target_res}"
      if [[ ! ${current_res} =~ ${target_res} ]]; then
        #echo "Switching resolution to ${target_res}."
        xrandr -s ${target_res}
      fi
    fi
  done
}

while true
do
  check_and_change_res < <(wmctrl -d)
  #This waits for 1 second between checks. To change to a 5-second delay (e.g. performance), use:
  #sleep 5
  sleep 1
done
1
ответ дан 23 November 2019 в 10:28

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

Похожие вопросы: