1. Giả sử bạn đang ở trên Unity
Tập lệnh bên dưới sẽ thay đổi độ phân giải của bạn, tùy thuộc vào chế độ xem hiện tại trong Unity. Tôi đã thử nghiệm nó trên một số máy tính trong một thời gian và nó chạy mà không gặp lỗi.
Tuy nhiên, tôi cũng đề nghị kiểm tra nó một lúc và xem nó có chạy mà không nghỉ một lần không; wmctrl
các lệnh lặp đi lặp lại đôi khi có thể thoát "khác không" một cách tình cờ. Nếu vậy, chúng ta cần xây dựng trong một try / except
.
Ghi chú
- Tôi đã thử nghiệm nó trên một thiết lập màn hình duy nhất. nhiều màn hình có thể sẽ cần một cách khác để phân tích đầu ra
xrandr
.
Trong phần đầu của tập lệnh, bạn cần đặt độ phân giải mong muốn cho từng chế độ xem của mình, tôi đặt nó như được đề cập trong nhận xét của bạn, nhưng bạn có thể thay đổi nó bất cứ lúc nào. Sử dụng định dạng:
resolutions = [[<horizontal>, <vertical], [<horizontal>, <vertical], ......]
Giống như nó hiển thị trong kịch bản.
- Không cần phải nói rằng bạn nên sử dụng các độ phân giải được hỗ trợ, như trong đầu ra của
xrandr
màn hình của bạn.
Cách sử dụng
Kịch bản cần wmctrl
:
sudo apt-get install wmctrl
sao chép tập lệnh bên dưới vào một tập tin trống, lưu nó dưới dạng screen_res.py
Kiểm tra chạy nó một lúc trong cửa sổ đầu cuối bằng lệnh:
python3 screen_res.py
Nếu tất cả đều hoạt động tốt, hãy thêm nó vào các ứng dụng khởi động của bạn: Dash> Ứng dụng khởi động> Thêm ...
Kịch bản
#!/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)
Giải trình
Trong một vòng lặp, trước tiên tập lệnh sẽ kiểm tra độ phân giải hiện tại của màn hình từ lệnh:
xrandr
Sau đó, tập lệnh kiểm tra tổng kích thước màn hình (tất cả các khung nhìn) từ lệnh:
wmctrl -d
Sau đó, từ độ phân giải icw tổng kích thước màn hình, nó tính toán số lượng cột, bằng tổng kích thước màn hình nền, chia cho độ phân giải ngang.
- Ngoài ra, ở đầu ra
wmctrl -d
là vị trí của khung nhìn hiện tại trên màn hình bao trùm: vd : VP: 1680,0
.
Với thông tin này, chúng tôi có thể kết luận chúng tôi đang ở cột nào và kiểm tra xem độ phân giải hiện tại có phù hợp với độ phân giải như chúng tôi đã xác định trong danh sách trong phần đầu của tập lệnh hay không.
Nếu không, tập lệnh đưa ra lệnh thay đổi độ phân giải bằng lệnh:
xrandr -s <xres>x<yres>
2. Phiên bản XFCE
- thiết lập như phiên bản trên (cũng cần
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)