Độ phân giải màn hình khác nhau cho từng không gian làm việc?


5

Tôi đang sử dụng i3-wm trên máy tính xách tay Ubuntu của tôi. Kích thước màn hình của tôi là 3200x1800. Đó là tuyệt vời cho một cái gì đó nhưng khủng khiếp cho những thứ khác. (Netflix vs gvim).

Tôi muốn thay đổi độ phân giải của một trong các không gian làm việc của tôi hoặc nhiều không gian làm việc của tôi. Nhưng tôi không biết liệu điều đó có khả thi không ... tôi có thể sử dụng compton để làm điều này hoặc có thể là một chương trình khác không?


Những gì bạn có thể làm là thay đổi độ phân giải, tùy thuộc vào chế độ xem hoặc không gian làm việc hiện tại. Tuy nhiên, thay đổi sẽ là độ phân giải hiện tại, vì bạn chỉ có một màn hình. điều đó có giúp gì cho bạn không?
Jacob Vlijm

Lý tưởng nhất là tôi muốn có không gian làm việc 1 trên 3200x1800, nhưng không gian làm việc 2 trên 1920x1080. Và có thể chuyển đổi giữa hai không gian làm việc mà không thay đổi độ phân giải thông qua bất kỳ lệnh hoặc tệp nào. Nếu đó là những gì bạn có ý nghĩa.
Fetts Vett

2
Đó sẽ là "loại" có thể, có nghĩa là thay đổi sẽ tự động. Tuy nhiên, trong Unity, tất cả các không gian làm việc (khung nhìn) cùng là một màn hình lớn, với một cài đặt độ phân giải. Những gì có thể được thực hiện là để cho một kịch bản nền hiểu đó là không gian làm việc hiện tại và thay đổi sự tái hợp cho phù hợp. Điều đó có thể gây rối cho việc sắp xếp cửa sổ trên các khung nhìn khác nhau. Không chắc chắn nếu điều đó là hữu ích cho bạn.
Jacob Vlijm

Trên thực tế, tôi nghĩ rằng đó sẽ là chính xác những gì tôi muốn. Vì i3 được lát gạch, mọi thứ sẽ giữ nguyên sự sắp xếp, v.v. Điều gì sẽ phải được thực hiện trong kịch bản này?
Fetts Vett

1
Cơ chế này sẽ giống như thế này , Askubfox.com/a/560734/72216 , chỉ thay vì thay đổi hình nền, độ phân giải phải được thay đổi xrandr. Tôi có thể xem xét nó, nhưng bạn có thể cho tôi biết tên màn hình của bạn (tìm "được kết nối" từ xrandr) và độ phân giải được đặt trên chế độ xem nào và số lượng khung nhìn không? (không chắc chắn tôi cần nó)
Jacob Vlijm

Câu trả lời:


2

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; wmctrlcá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 xrandrmàn hình của bạn.

Cách sử dụng

  1. Kịch bản cần wmctrl:

    sudo apt-get install wmctrl
    
  2. 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

  3. 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
    
  4. 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 -dlà 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)

Tôi thấy bạn chạy mã của bạn trong vòng lặp while-true. Không có sự kiện nào bạn có thể nghe hoặc một số hook có thể được kích hoạt khi máy tính để bàn bị thay đổi?
umpirsky

@umpirsky đã tìm kiếm nó, nhưng không bao giờ tìm thấy nó. Đồng thời cả hai xrandrwmctrl -dnên tương đối nhẹ khi chạy một lần mỗi giây. Ngay cả trên bảo tàng 12 tuổi của tôi, tôi không nhận thấy bất kỳ hiệu ứng nào (phiên bản XFCE). Có lẽ một khoảng nghỉ nhỏ giữa hai người, ví dụ 0,5 giây, sẽ làm cho nó thậm chí nhẹ hơn.
Jacob Vlijm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.