다중 모니터 설정에서 xset을 사용하여 모니터를 대기시키는 방법은 무엇입니까?


10

둘 이상의 모니터가 함께 작동하는 동안 다음과 같은 명령을 실행하여 모니터 중 하나를 대기 / 일시 중단 상태로 전환하는 방법이 xset dpms force suspend있습니까? 또는 xset dpms 100 0 0다음 과 같은 목적을 위해 시간을 설정해야합니다 .

eDP1 (내 노트북)과 VGA1 (외부 모니터)이라는 두 개의 모니터가 서로 작동합니다.

직접 상호 작용하지 않으면 VGA1에서 영화를보고 있고 eDP1이 30 분 동안 아무것도하지 않는다고 가정하면 각각이 일시 중지 / 대기 모드로 전환되기를 원합니다.

xrandor --off --output eDP1작업하기에 충분히 빠르지 않기 때문에 사용에 관심 이 없습니다.

마우스를 움직여 모니터를 빠르게 사용할 수 있도록 모니터를 작동시킬 수 있기를 바랍니다.

  • 러닝 : Ubuntu 18.04
  • 창 관리자 : OpenBox

에너지 때문입니까, 시각적 솔루션입니까?
Jacob Vlijm

@Ravexina 질문, eDP1 백라이트의 거리는 얼마나됩니까? 밝기가 완전히 꺼 집니까? 그렇다면 askubuntu.com/a/814043/295286 answer 에서 가지고 있었던 두 가지 명령을 테스트 해 주 시겠습니까 ? 응답 주셔서 감사합니다
Sergiy Kolodyazhnyy

1
@Ravexina는 완벽하게 작동하는 것처럼 보이지만 하루 동안 계속 실행하여 오늘 밤 늦게 게시합니다. 화면 당 활동에 대한 기록을 유지하지만 현재 마우스가있는 화면을 어둡게하거나 끄지 마십시오.
Jacob Vlijm

1
좋아, 아마도 주말에 Window 추적을 구현하려고 할 것입니다. 슬프게도 지금 당장 이런 일들을 처리 할 시간이 없습니다.
Sergiy Kolodyazhnyy 2014 년

1
@Ravexina, 감사합니다. 아마도 활성 창 이나 (유효한 창이없는 경우) 마우스 동작으로 트리거 된 다른 (vala) 버전을 곧 게시 할 것입니다 . 또한 우리가 백라이트로 무언가를 할 수 있는지 알 수 있으며, 이는 아마도 약간의 에너지를 절약 할 것입니다. 보너스 기간은 너무 짧지 만 질문이 조금 더 진행될만큼 충분히 궁금합니다. 계속됩니다. 다시 한번 감사합니다.
Jacob Vlijm

답변:


5

xset (및 실제로 X11)에서는 개별 모니터를 제어 할 수 없습니다

제목에서 알 수 있듯이, 그것은 이유로 수 없습니다 방법 xset 이 사용하는 X11 기능에 내장 인해. 우리는 소스 코드를 보면, xset호출 DPMSForceLevel(dpy,DPMSModeSuspend)( 라인 557 ), 디스플레이 변수 dpy에서 오는 XOpenDisplay()기능 ( 라인 203 ), 그것은 것입니다 정의 :

화면 및 입력 장치와 함께 서버를 디스플레이라고합니다.

즉, xset개별 화면이 아닌 전체 디스플레이에 전체적으로 설정을 적용합니다. xset작동 하려면 소스 코드 를 변경 해야합니다. DPMS 확장 자체는 대부분 개별 화면이 아닌 전체 디스플레이 만 호출하는 것처럼 보이므로 X11 라이브러리로 사용자 지정 코드를 작성할 수도 없습니다.

/sys하위 시스템을 통해 해당 설정을 수동으로 제어 해도 작동하지 않는 것 같습니다.

$ 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

키 또는 마우스 이벤트가 발생할 때 화면도 DPMS 모드에서 빠져 나옵니다. 따라서 마우스를 움직이거나 키보드를 사용할 수 있다는 점을 고려하면 모니터가 DPMS 모드를 종료하게됩니다.

대체 해결 방법

최선의 대안 (및 실제로 물리적으로 작동하는 솔루션)은 xrandr개별 "출력"을 제어하는데 사용될 수 있습니다. 특히,

xrandr --output VGA-1 -off

출력을 해제합니다. 예,이 솔루션은 충분히 빠르지 않기 때문에이 솔루션을 사용하고 싶지 않다고 언급했지만 지금까지는 최상의 솔루션입니다. 몇 가지 장점이 있습니다.

  • 키 및 마우스 이벤트에 면역
  • 독립적으로 outpus를 제어 xset

xrandr --output VGA-1 --brightness 0.1, 비록 그것이 떨어져 나타나는 등의 방식으로 화면 색상 화됩니다 --brightness디스플레이가 실제로 하드웨어 수준에서 흐리게되지 않도록, 소프트웨어 솔루션입니다 않으며 하드웨어 수준에서 꺼져 있습니다. 그러나 화면을 비우는 작업을 수행하며 키 / 마우스 이벤트에도 저항합니다.

나는 그놈 스크린 세이버의 포크 인 Mate와 Budgie 스크린 세이버의 소스 코드를 보았지만 소스 코드에 DPMS에 대한 언급이 없기 때문에 소프트웨어 솔루션 인 것처럼 보입니다.


나는 대안을 좋아한다 ... +1
Fabby

1
@Fabby Thanks :) 지금까지 가능한 최고의 대안
Sergiy Kolodyazhnyy

창 관리자가 몇 가지 트릭을 수행하고 후크를 제공 할 수 있다고 생각합니다. "소프트웨어 디자인"이라는 스택 교환 사이트가 있으며 웹 브라우저와 같은 주요 창 (콘 키나 상단 표시 시간이 아님)이 10 분 동안 픽셀이 변경되지 않는 경우 전체 모니터 (단일 모니터)가 완전히 검은 색이 될 때까지 30 초에 걸쳐 어두워지기 시작합니다. 그런 다음 해당 모니터 위로 마우스를 이동하면 (일반적으로 3 개의 모니터 사용) 1 ~ 5 초 동안 점차적으로 밝기가 복원됩니다.
WinEunuuchs2Unix

@ WinEunuuchs2Unix 아이디어가 있고 조심해야 할 몇 가지가 있지만 까다 롭습니다. 그렇습니다. 문제는 창 관리자에 달려 있습니다. 문제는 DPMS입니다. DPMS로 모든 것을 어둡게 하거나 아무것도하지 않습니다. 우리가 할 수있는 최선은 xrandr --off지금이다
Sergiy Kolodyazhnyy

내 DPMS 지식이 제한되어 있습니다. 나는 그것이 스탠바이 / 수면을 위해 전기를 절약하는 것이라고 생각합니다. HDMI-CEC도 같은 결과를 낼 수 있지만, 그것은 저에게 블랙홀의 더 큰 구멍입니다. xrandr -off모니터가 꺼져도 모르겠습니다 . brightness0 으로 설정 한 것과 같을 수 있습니까? 또 다른 문제는 Windows조차도 할 수없는 3 개의 모니터에 대해 밝기와 감마를 개별적으로 설정하는 24/7 실행 프로그램이 있습니다. 야간 조명, 적색 이동 또는 플럭스가 작동하는지 확실하지 않습니다. 어쨌든 그 프로그램은 xrandr off에 의해 엉망이 될 수 있습니다. 다음을 추측하여 답변을 도용했습니다. :)
WinEunuuchs2Unix

4

몇 년 동안 나는 뚜껑을 닫을 때 랩톱이 일시 중단되고 외부 모니터가 꺼 지도록 랩톱 설치를했습니다.

외부 모니터에서 90 분 동안 비디오를보고 랩톱 화면을 비 우려는 이유 때문에 "닫기 없음"으로 덮개 닫기 옵션을 변경했습니다.

  • 이점 : 랩톱 덮개를 닫으면 모든 랩톱 창이 전체 화면 비디오 아래로 이동합니다.
  • 이점 : 랩톱 덮개를 열면 창이 닫히고 더 이상 전체 화면 비디오 아래에 있지 않습니다.
  • 단점 : 톱니 바 메뉴에 액세스하여 톱니 바퀴 메뉴에서 일시 중지를 선택하려면 동영상을 전체 화면이 아닌 화면으로 만들어야합니다.
  • 장점 : 시스템이 외부 모니터의 메뉴에 의해 일시 중단 된 경우에도 노트북 덮개를 열면 시스템이 다시 시작됩니다.

외부 모니터에 DPMS를 사용하지 않지만 다음 xset q명령으로 설정을 확인할 수 있습니다 .

$ 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

다음 줄을 주목하십시오 :

Screen Saver:
  prefer blanking:  yes
  • 당신은 아마 원할 것입니다 prefer blanking: no

다음 줄도 주목하십시오.

DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled
  • 당신은 아마 원할 것입니다 DPMS is enabled 으로 설정 모니터를 Standby원하는 경우.

다른 사용자가이 옵션을 사용하고 자세한 답변을 게시하기를 바랍니다.


4

노트북을 간단히 닫는 것은 어떻습니까?

왜?

이 두 모니터는 하나의 디스플레이 영역이므로 하나를 끄면 화면 다시 그리기, 주 모니터로 이동하는 응용 프로그램 등과 같은 여러 가지 문제가 발생합니다.

(몇 년 전에 그 길을 갔고, 내가 원하는 것을하는 유일한 방법은 외부 모니터의 버튼을 누르거나 랩톱을 닫는 것입니다)

이 전원 설정을 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'

실제로 이것은 좋은 해결책입니다. 하드웨어와 함께 스크립트를 작성할 수 있습니다. 그러나 OP는 Openbox를 사용하고 있으므로 gsettings가 적용되지 않을 수 있습니다. 좋은 대안을 위해, unix.stackexchange.com/a/52645/85039
Sergiy Kolodyazhnyy

4

임시 의견

  1. 영업 이익의 요청에, 나는 아래의 스크립트가 만든 해제 화면을 전환 에 의해 xrandr. 더 긴 테스트에서 이것은 꽤 나빴습니다. 전원을 끄는 데 실패한 것은 아니지만 화면을 다시 활성화 할 때 화면 레이아웃이 완전히 엉망이되었습니다. 그러나 귀하의 경우에 효과가 있는지 확인하기 위해 게시 할 수는 있지만 제 조언은 사용하지 않는 것입니다.
    스크립트에서 대신 밝기를 0으로 설정했습니다.
  2. 마우스 위치 또는 활성 창의 위치에 따라 활성 모니터 정의해야하는지에 대한 논의가있었습니다 . 창이 없으면 후자는 작동하지 않습니다. 윈도우 자체가 없을 수도 있습니다 (데스크톱 자체는 제외). IMO는 이해하기 쉬운 유일한 옵션이며 모든 경우에 예측 가능한 방식으로 작동합니다. 마우스 위치로 활성 화면을 정의하는 것입니다. 또한 창 관리자가 새 창을 표시 할 위치를 결정하는 방식이기도합니다.

그렇다면이 버전에서 무엇을 변경 했습니까?
유휴 시간은 이제 기본적으로 키보드 및 마우스 활동으로 정의됩니다. 깨어나는 것도 어느 ​​쪽이든에 의해 이루어집니다.


비활성 화면 자동 어둡게

동료 응답자들이 말했듯이 cli에서 화면을 개별적으로 끄는 것은 최선의 과제이며 옵션도 찾지 못했습니다.

내가 찾은 것은 x 시간 후에 마우스가있는 화면을 제외한 모든 화면 을 자동으로 어둡게 하는 방법 입니다.

우리는 간다

#!/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

설정 방법

설정은 간단합니다.

  1. 둘 다 설치 python3-gi하고 xprintidle설치 했는지 확인하십시오

    sudo apt install python3-gi xprintidle
    
  2. 로 저장, 빈 파일로 위의 스크립트를 복사 dim_inactive하고, 그것을 실행하기

  3. 다음 명령으로 실행하십시오.

    /path/to/dim_inactive <idle_time_in_seconds>
    

    예를 들면 :

    /path/to/dim_inactive 120
    

    2 분이 지나도 마우스가없는 모든 화면이 흐리게

추가 정보 / 설명

  • 스크립트는 시작시 모든 화면을 나열합니다
  • 모니터 당 유휴 시간 (2 개 이상) 일 경우 기록을 유지합니다 . x 초 동안 모니터에 액세스하지 않으면 마우스가있는 모니터별도로 검은 색으로 표시됩니다 .
  • 좋은 (그러나 나쁜) 전통에 따르면, Gnome은 계속해서 문제를 해결하고 API를 계속 변경합니다. 결과적으로이 스크립트를 19.04 이상에서 실행하면 사용되지 않는 몇 가지 경고가 표시됩니다. 동시에 PEP8에서는 깨지지 않습니다. 그럼에도 불구하고 최신 API로 업데이트됩니다.

아주 좋고, 거의 그런 것을 쓰려고 유혹했습니다. 지금까지 아무것도, 아무것도 하드웨어 틱 소프트웨어 솔루션을 통해 다른 디스플레이를 디밍보다 더 나은 없다 - 그러나 나는 여기에서 반복되는 주제를 추측
세르지 Kolodyazhnyy

@SergiyKolodyazhnyy Nah, 백라이트만이 무언가를 추가 할 것입니다. 그러나 지금까지 볼 수 있습니다. 뭔가 가능해야한다고 생각하지만 아마도 xrandr --off내가 생각하는 것처럼 시작될 수 있습니다.
Jacob Vlijm

@JacobVlijm 그래, xrandr --off이 경우에 내가 선호하는 것입니다. 특히 VGA 백라이트는 소프트웨어로 제어 할 수 없기 때문입니다.
Sergiy Kolodyazhnyy 2014 년

모든 노력에 감사드립니다.하지만 가장 이상한 행동을하고 있습니다 ... 예를 들면 : 모니터가 어두워 지지만 1어떤 상황에서도 밝기가 다시 설정되지는 않습니다 . 키보드를 사용하여 외부 디스플레이와 상호 작용하고 마우스가 기본 디스플레이에있는 동안 유휴 시간이 지나면 외부 디스플레이가 검은 색이됩니다. 메인 디스플레이와 상호 작용하지 않지만 마우스가 있으면 아무것도 없으며 마우스를 다른 디스플레이로 이동하면 임박하게 검은 색이됩니다.
Ravexina

@Ravex (1) 모니터가 미러링되어 있습니까? 그렇지 않으면 두 번째 화면이 벌어진 상태에서 스크립트를 중지했을 수 있습니다. 지금 고쳤습니다. (2) 활성 화면이 정의 된 이유 내 마우스 포스가 임시 설명의 [2]에 설명되어 있습니다. (3) 또한 (1) (동일한 원인)의 변경 사항으로 수정되어야합니다. 나중에 오늘.
Jacob Vlijm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.