Я использую i3-wm на своем ноутбуке человечности. Мой размер экрана 3200x1800. Который является большим для чего-то, но ужасным для других вещей. (Netflix по сравнению с gvim).
Я хотел бы изменить разрешение одной из моих рабочих областей или несколько. Но я понятия не имею, возможно ли это даже..., я могу использовать Комптона, чтобы сделать это или возможно другую программу?
Сценарий ниже должен изменить Ваше разрешение, в зависимости от текущей области просмотра в Единице. Я протестировал его на нескольких компьютерах некоторое время, и это работало без ошибки.
Я предложил бы однако также протестировать его некоторое время и видеть, работает ли это без одиночного разрыва; повторный wmctrl
команды могут иногда выходить "ненулевой" случайно. Если так, мы должны создать в a try / except
.
xrandr
.В заголовке сценария необходимо установить нужное разрешение для каждой из областей просмотра, я установил его, любят упомянутый в комментарии, но можно изменить его в любое время. Используйте формат:
resolutions = [[<horizontal>, <vertical], [<horizontal>, <vertical], ......]
как он показывает в сценарии.
xrandr
для Вашего монитора.Потребности сценария wmctrl
:
sudo apt-get install wmctrl
скопируйте сценарий ниже в пустой файл, сохраните его как screen_res.py
Тестовый прогон это некоторое время в окне терминала командой:
python3 screen_res.py
Если все хорошо работает, добавьте его к своим приложениям запуска: Тире> Приложения Запуска> Добавляет...
#!/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>
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)
Я реализовал сценарий 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