Làm cách nào để chờ màn hình sử dụng xset trong thiết lập đa màn hình?


10

Trong khi có hai hoặc nhiều màn hình làm việc cùng nhau, Có cách nào để đặt một trong số chúng ở chế độ chờ / tạm dừng bằng cách phát lệnh như sau : xset dpms force suspend? hoặc có một thời gian được đặt cho mục đích đó như: xset dpms 100 0 0hoạt động trên các màn hình này một cách riêng biệt?

Tôi có hai màn hình hoạt động cùng nhau, eDP1 (Máy tính xách tay của tôi) và VGA1 (Màn hình ngoài).

Tôi muốn mỗi người trong số họ chuyển sang chế độ tạm dừng / chờ riêng nếu tôi không tương tác trực tiếp với họ, giả sử tôi đang xem phim trên VGA1, và trong một giờ rưỡi eDP1 không làm gì cả.

Tôi không thích sử dụng xrandor --off --output eDP1vì nó không đủ nhanh để làm việc.

Tôi muốn màn hình của mình sẵn sàng hoạt động, với một chuyển động chuột đơn giản để tôi có thể chuyển đổi giữa chúng nhanh chóng.

  • Chạy: Ubuntu 18.04
  • Quản lý cửa sổ: OpenBox

Là vì ​​lý do năng lượng, hoặc một giải pháp trực quan sẽ làm gì?
Jacob Vlijm

@Ravexina Câu hỏi, đèn nền eDP1 của bạn đi được bao xa? Nó tắt độ sáng tất cả các cách? Nếu có, bạn có thể vui lòng kiểm tra hai lệnh tôi đã có trong câu hỏi của Askubfox.com/a/814043/295286 không? Cảm ơn bạn trước phản hồi
Sergiy Kolodyazhnyy

1
@Ravexina đã hoàn thành, dường như hoạt động hoàn hảo, nhưng sẽ giữ cho nó chạy trong một ngày, sẽ đăng nó vào tối nay. Nó sẽ tiếp tục ghi lại hoạt động trên mỗi màn hình, nhưng không bao giờ làm mờ / tắt màn hình trong đó chuột hiện đang ở, phải không?
Jacob Vlijm

1
OK, có lẽ tôi sẽ cố gắng thực hiện theo dõi Window vào cuối tuần. Đáng buồn là tôi không có nhiều thời gian để giải quyết những điều này ngay bây giờ.
Sergiy Kolodyazhnyy

1
@Ravexina, cảm ơn. Tôi có thể sẽ sớm đăng một phiên bản (vala) khác, được kích hoạt bởi cửa sổ hoạt động hoặc (nếu không có cửa sổ hợp lệ) bằng hành động chuột. Cũng sẽ xem liệu chúng ta có thể làm gì đó với đèn nền, điều này có lẽ cũng sẽ tiết kiệm năng lượng. Thời gian trong khi thưởng chỉ đơn giản là quá ngắn, nhưng câu hỏi là đủ để chơi xa hơn một chút. Còn tiếp. Một lần nữa xin cảm ơn.
Jacob Vlijm

Câu trả lời:


5

Không thể điều khiển các màn hình riêng lẻ với xset (và thực sự là X11)

Như tiêu đề cho thấy, không thể vì lý do cách xset xây dựng và do các chức năng X11 mà nó sử dụng. Nếu chúng ta xem mã nguồn, xsetcác cuộc gọi DPMSForceLevel(dpy,DPMSModeSuspend)( dòng 557 ) và biến hiển thị dpyxuất phát từ XOpenDisplay()hàm ( dòng 203 ) và đó là theo định nghĩa :

Một máy chủ, cùng với màn hình và thiết bị đầu vào của nó, được gọi là màn hình.

Nói cách khác, xsetáp dụng các cài đặt trên toàn cầu cho toàn bộ màn hình, không áp dụng cho từng Màn hình. Cần phải thay đổi xsetmã nguồn để làm việc đó. Bản thân các phần mở rộng DPMS dường như chỉ gọi toàn bộ màn hình, không phải màn hình riêng lẻ, do đó thậm chí không thể viết mã tùy chỉnh với thư viện X11.

Kiểm soát thủ công cài đặt đó qua /syshệ thống con cũng không hoạt động

$ sudo bash -c 'echo Off > /sys/class/drm/card0-VGA-1/dpms'
[sudo] password for admin: 
bash: /sys/class/drm/card0-VGA-1/dpms: Permission denied

Màn hình cũng được đưa ra khỏi chế độ DPMS khi xảy ra sự kiện phím hoặc chuột, do đó, nếu bạn muốn di chuyển chuột hoặc sử dụng bàn phím, một trong những hành động đó sẽ khiến màn hình rời khỏi chế độ DPMS.

Giải pháp thay thế

Giải pháp thay thế tốt nhất (và thực tế là giải pháp hoạt động thể chất) là xrandr- nó có thể được sử dụng để kiểm soát các "đầu ra" riêng lẻ. Đặc biệt,

xrandr --output VGA-1 -off

sẽ tắt đầu ra đó. Có, bạn đã đề cập rằng bạn không muốn sử dụng giải pháp này vì nó không đủ nhanh, tuy nhiên cho đến nay nó là giải pháp tốt nhất hiện có. Nó có một vài lợi thế:

  • miễn dịch với các sự kiện quan trọng và chuột
  • kiểm soát độc lập outpus không giống như xset

xrandr --output VGA-1 --brightness 0.1sẽ tô màu màn hình theo cách nó xuất hiện, mặc dù --brightnesslà một giải pháp phần mềm, vì vậy màn hình không thực sự bị mờ ở cấp độ phần cứng, cũng không bị tắt ở cấp độ phần cứng. Tuy nhiên, nó thực hiện công việc làm trống màn hình và cũng có khả năng chống lại các sự kiện phím / chuột.

Tôi đã xem mã nguồn của trình bảo vệ màn hình Mate và Budgie, cả hai đều là công cụ bảo vệ màn hình Gnome, tuy nhiên trong cả hai trường hợp, chúng dường như là một giải pháp phần mềm, vì không đề cập đến DPMS trong mã nguồn.


Tôi thích các lựa chọn thay thế ... +1
Fabby 26/03/19

1
@Fabby Cảm ơn :) Cho đến nay đó là lựa chọn thay thế tốt nhất hiện có
Sergiy Kolodyazhnyy 26/03/19

Tôi nghĩ rằng Người quản lý cửa sổ đang thực hiện một số thủ thuật và có thể cung cấp một số móc. Có một trang web trao đổi ngăn xếp được gọi là "Thiết kế phần mềm" và nó có thể là một nơi tốt để đưa ra ý tưởng rằng khi một cửa sổ lớn (như trình duyệt web nhưng không có Conky hoặc thanh trên cùng hiển thị thời gian) không có thay đổi pixel trong hơn 10 phút toàn bộ màn hình (chỉ một màn hình) bắt đầu mờ hơn 30 giây cho đến khi nó hoàn toàn đen. Sau đó điều hướng chuột qua màn hình đó (tôi thường sử dụng 3 màn hình) khôi phục độ sáng dần dần trong khoảng thời gian 1 đến 5 giây.
WinEunuuchs2Unix

@ WinEunuuchs2Unix Tôi có một ý tưởng và có một vài điều cần theo dõi, nhưng nó rất khó, và có phụ thuộc vào trình quản lý cửa sổ trong câu hỏi. Vấn đề là DPMS. Nó làm mờ mọi thứ hoặc không có gì với DPMS. Điều tốt nhất chúng ta có thể làm là xrandr --offbây giờ
Sergiy Kolodyazhnyy

Kiến thức DPMS của tôi còn hạn chế. Tôi nghĩ rằng đó là một điều tiết kiệm điện cho standy / ngủ. Ngoài ra còn có HDMI-CEC có thể cho kết quả tương tự nhưng đó thậm chí còn là một lỗ đen kỳ diệu đối với tôi. Tôi không biết nếu xrandr -offthậm chí tắt màn hình. Nó có thể giống như brightnessđược đặt thành không? Đó là một vấn đề khác tôi có một chương trình chạy 24/7, thiết lập độ sáng và gamma riêng cho 3 màn hình mà ngay cả Windows cũng không thể làm được. Không chắc chắn nếu ánh sáng ban đêm, thay đổi màu đỏ hoặc thông lượng làm điều đó. Dù sao, những chương trình đó có thể bị xrandr làm rối tung lên. Xin lỗi vì đã đánh cắp câu trả lời của bạn với suy đoán :)
WinEunuuchs2Unix 31/03/19

4

Trong nhiều năm, tôi đã thiết lập máy tính xách tay của mình để khi đóng nắp máy tính xách tay sẽ tạm ngưng và màn hình bên ngoài sẽ bị trống.

Vì lý do bạn muốn xem video trong 90 phút trên màn hình ngoài và màn hình máy tính xách tay bị trống, tôi đã thay đổi tùy chọn đóng nắp thành "Không làm gì":

  • Ưu điểm: Khi tôi đóng nắp Máy tính xách tay, tất cả các cửa sổ Máy tính xách tay đều ở dưới video toàn màn hình.
  • Ưu điểm: Khi tôi mở Cửa sổ nắp máy tính xách tay được khôi phục và không còn dưới video toàn màn hình.
  • Nhược điểm: Tôi phải tạo video không đầy đủ màn hình để truy cập menu thanh trên cùng để chọn tạm dừng từ menu bánh răng.
  • Ưu điểm: Khi hệ thống bị treo bằng menu trên màn hình ngoài, mở nắp máy tính xách tay vẫn tiếp tục hệ thống.

Tôi không sử dụng DPMS cho màn hình ngoài nhưng bạn có thể kiểm tra cài đặt của mình bằng xset qlệnh:

$ xset q
Keyboard Control:
  auto repeat:  on    key click percent:  0    LED mask:  00000002
  XKB indicators:
    00: Caps Lock:   off    01: Num Lock:    on     02: Scroll Lock: off
    03: Compose:     off    04: Kana:        off    05: Sleep:       off
    06: Suspend:     off    07: Mute:        off    08: Misc:        off
    09: Mail:        off    10: Charging:    off    11: Shift Lock:  off
    12: Group 2:     off    13: Mouse Keys:  off
  auto repeat delay:  500    repeat rate:  33
  auto repeating keys:  00ffffffdffffbbf
                        fadfffefffedffff
                        9fffffffffffffff
                        fff7ffffffffffff
  bell percent:  50    bell pitch:  400    bell duration:  100
Pointer Control:
  acceleration:  5/1    threshold:  5
Screen Saver:
  prefer blanking:  yes    allow exposures:  yes
  timeout:  0    cycle:  0
Colors:
  default colormap:  0xb3    BlackPixel:  0x0    WhitePixel:  0xffffff
Font Path:
  /usr/share/fonts/X11/misc,/usr/share/fonts/X11/Type1,built-ins
DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled

Lưu ý những dòng này:

Screen Saver:
  prefer blanking:  yes
  • Bạn có thể muốn prefer blanking: no

Cũng lưu ý những dòng này:

DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled
  • Bạn có thể muốn DPMS is enabledđặt màn hình Standbykhi muốn.

Hy vọng rằng những người dùng khác đã sử dụng các tùy chọn này và đăng câu trả lời chi tiết cho bạn.


4

Làm thế nào về đơn giản là đóng máy tính xách tay?

Tại sao?

Hai màn hình này là một khu vực hiển thị nên tắt một màn hình sẽ tạo ra một số vấn đề như vẽ lại màn hình, các ứng dụng chuyển sang màn hình chính, ...

(Tôi đã đi trên con đường đó vài năm trước và cách đáng tin cậy duy nhất tôi tìm thấy để làm những gì bạn muốn làm là nhấn nút trên màn hình ngoài hoặc đóng máy tính xách tay)

Chỉ cần đảm bảo bạn đặt các cài đặt nguồn này với gsettings set:

org.gnome.settings-daemon.plugins.power lid-close-suspend-with-external-monitor false
org.gnome.settings-daemon.plugins.power lid-close-ac-action 'nothing'
org.gnome.settings-daemon.plugins.power lid-close-battery-action 'nothing'

Trên thực tế, đây là một giải pháp tốt đẹp. Phần cứng, cộng với điều này có thể được kịch bản. Tuy nhiên, OP đang sử dụng Openbox, điều này cho thấy gsinstall có thể không có hiệu lực. Để thay thế tốt, bạn có thể muốn bao gồm unix.stackexchange.com/a/52645/85039
Sergiy Kolodyazhnyy

4

Nhận xét tạm thời

  1. Theo yêu cầu của OP, tôi đã thực hiện đoạn script bên dưới để tắt màn hình bằng phương tiện xrandr. Trong một bài kiểm tra dài hơn, điều này làm việc khá tệ. Không quá nhiều việc tắt không thành công, nhưng khi kích hoạt lại màn hình, bố cục màn hình hoàn toàn bị rối tung. Tuy nhiên, tôi rất vui khi đăng nó để xem nó có hoạt động trong trường hợp của bạn không, nhưng lời khuyên của tôi là không sử dụng nó.
    Thay vào đó, trong kịch bản, tôi quay lại cài đặt độ sáng bằng 0.
  2. Có một số cuộc thảo luận về thời tiết chúng ta nên xác định màn hình hoạt động theo vị trí chuột hoặc theo vị trí của cửa sổ hoạt động . Cái sau sẽ không hoạt động nếu không có cửa sổ tồn tại. Chúng tôi có thể không có cửa sổ nào cả (ngoài chính máy tính để bàn) trong trường hợp lựa chọn cửa sổ tắt đen sẽ là ngẫu nhiên (hoặc phá vỡ nếu chúng tôi không bao gồm ngoại lệ). IMO tùy chọn duy nhất có ý nghĩa - và sẽ hoạt động theo cách có thể dự đoán được trong mọi trường hợp - là xác định màn hình hoạt động theo vị trí chuột. Hơn nữa, đó cũng là cách người quản lý cửa sổ quyết định nơi các cửa sổ mới sẽ xuất hiện.

Sau đó, những gì tôi đã thay đổi trong phiên bản này?
Thời gian nhàn rỗi hiện được xác định bởi cả hoạt động bàn phím và chuột theo mặc định. Thức dậy cũng được thực hiện bởi một trong hai.


Tự động làm mờ màn hình không hoạt động

Như đã nói bởi những người trả lời đồng nghiệp của tôi, tắt màn hình từ cli riêng biệt là một thách thức tốt nhất và tôi cũng không tìm thấy một lựa chọn nào.

Những gì tôi đã tìm thấy là một cách để tự động làm mờ tất cả các màn hình, ngoại trừ màn hình có chuột, sau x thời gian.

Chúng ta đi đây

#!/usr/bin/env python3
import subprocess
import gi
gi.require_version("Gdk", "3.0")
from gi.repository import Gdk
import time
import sys


def get_idle():
    try:
        return int(subprocess.check_output("xprintidle")) / 1000
    except subprocess.CalledProcessError:
        return 0


def get_monitors():
    screen = Gdk.Screen.get_default()
    n_mons = display.get_n_monitors()
    mons = [screen.get_monitor_plug_name(i) for i in range(n_mons)]
    return mons


def set_mon_dimmed(mon, dim):
    print(mon, dim)
    val = "0.0" if dim else "1"
    try:
        subprocess.Popen(["xrandr", "--output", mon, "--brightness", val])
    except subprocess.CalledProcessError:
        print("oops")


def mousepos():
    # find out mouse location
    return Gdk.get_default_root_window().get_pointer()[1:3]


def get_currmonitor_atpos(x, y, display=None):
    """
    fetch the current monitor (obj) at position. display is optional to save
    fuel if it is already fetched elsewhere
    """
    if not display:
        display = Gdk.Display.get_default()
    return display.get_monitor_at_point(x, y)


display = Gdk.Display.get_default()
wait = int(sys.argv[1])
elapsed = 0
# set intervals to check
res = 2
monitors = [m for m in get_monitors()]
for m in monitors:
    set_mon_dimmed(m, False)

monrecord = {}
for m in monitors:
    monrecord[m] = {"idle": 0, "dimmed": False}

display = Gdk.Display.get_default()
idle1 = 0


while True:
    time.sleep(res)
    curr_mousepos = mousepos()
    activemon = get_currmonitor_atpos(
        curr_mousepos[0], curr_mousepos[1]
    ).get_model()
    idle2 = get_idle()
    if idle2 < idle1:
        monrecord[activemon]["idle"] = 0
        if monrecord[activemon]["dimmed"]:
            set_mon_dimmed(activemon, False)
            monrecord[activemon]["dimmed"] = False

    for m in monrecord.keys():
        curr_idle = monrecord[m]["idle"]
        print(m, curr_idle)
        if all([
            curr_idle > wait,
            monrecord[m]["dimmed"] is not True,
            m != activemon
        ]):
            set_mon_dimmed(m, True)
            monrecord[m]["dimmed"] = True         
        else:
            if m != activemon:
                monrecord[m]["idle"] = curr_idle + res

    idle1 = idle2

Làm thế nào để thiết lập

Thiết lập rất đơn giản:

  1. Hãy chắc chắn rằng bạn đã cài đặt cả hai python3-gixprintidle

    sudo apt install python3-gi xprintidle
    
  2. Sao chép tập lệnh ở trên vào một tệp trống, lưu nó dưới dạng dim_inactivelàm cho nó có thể thực thi được

  3. Chạy nó bằng lệnh:

    /path/to/dim_inactive <idle_time_in_seconds>
    

    một ví dụ:

    /path/to/dim_inactive 120
    

    sẽ làm mờ tất cả các màn hình mà chuột không ở sau hai phút

Thông tin bổ sung / giải thích

  • Kịch bản liệt kê tất cả các màn hình khi khởi động
  • Nó giữ kỷ lục nếu thời gian nhàn rỗi trên mỗi màn hình (có thể hơn 2). Nếu màn hình không được truy cập trong x giây, màn hình sẽ bị tắt, ngoài màn hình có chuột .
  • Theo truyền thống tốt (nhưng xấu), Gnome tiếp tục phá vỡ mọi thứ và liên tục thay đổi API. Do đó, chạy tập lệnh này vào ngày 19.04 trở lên, bạn sẽ nhận được một vài cảnh báo không dùng nữa. Đồng thời, nó không bị hỏng trên PEP8. Tuy nhiên sẽ cập nhật lên API mới nhất.

Rất đẹp, gần như bị cám dỗ để viết một cái gì đó như vậy là tốt. Nhưng tôi đoán đó là chủ đề lặp đi lặp lại ở đây - cho đến nay không có gì tốt hơn là làm mờ màn hình khác thông qua các giải pháp phần mềm, không có gì là phần cứng
Sergiy Kolodyazhnyy 28/03/19

@SergiyKolodyazhnyy Nah, chỉ có đèn nền sẽ thêm thứ gì đó, nhưng đó là tất cả những gì tôi có thể thấy bây giờ. Nghĩ rằng một cái gì đó nên có thể, nhưng có lẽ sẽ có một khởi đầu lạnh, giống như xrandr --offtôi đoán.
Jacob Vlijm

@JacobVlijm Vâng, đó xrandr --offlà những gì tôi thích trong trường hợp này. Đặc biệt là đèn nền VGA không thể điều khiển bằng phần mềm.
Sergiy Kolodyazhnyy

Cảm ơn bạn vì tất cả những nỗ lực của bạn, nhưng tôi đang có những hành vi kỳ lạ nhất ... Ví dụ: Nó làm mờ màn hình nhưng không đặt lại độ sáng trở lại 1trong mọi trường hợp. Khi tôi tương tác với màn hình ngoài bằng bàn phím và trong khi chuột ở màn hình chính, màn hình ngoài sẽ chuyển sang màu đen sau thời gian rảnh. Khi tôi không có bất kỳ tương tác nào với màn hình chính nhưng chuột ở đó thì không có gì ở đó và khi tôi di chuyển chuột sang màn hình chính khác thì màn hình chính sẽ chuyển sang màu đen.
Ravexina

@Ravex (1) màn hình của bạn được nhân đôi? Nếu không, bạn có thể đã dừng tập lệnh với màn hình thứ hai được cân bằng. Đã sửa nó ngay. (2) Tại sao màn hình hoạt động được xác định, chuột của tôi được giải thích trong [2] của nhận xét tạm thời (3) Cũng nên được sửa với các thay đổi trong (1) (cùng nguyên nhân) rằng ngày hôm nay
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.