Çoklu monitör kurulumunda xset kullanarak bir monitör nasıl beklenir?


10

İki veya daha fazla monitörün birlikte çalışmasını sağlarken, aşağıdakilerden biri gibi bir komut vererek tek bir tanesini bekleme / askıya almanın herhangi bir yolu var mı xset dpms force suspend? veya bu amaç için belirlenmiş bir zamana sahip olmak: xset dpms 100 0 0bu monitörlerde hangisi ayrı çalışır?

Birbirimizle çalışan iki monitörüm var, eDP1 (Dizüstü Bilgisayarım) ve VGA1 (Harici monitör).

Onlarla doğrudan etkileşime girmiyorsam, her birinin ayrı ayrı askıya alma / bekleme moduna geçmesini istiyorum, VGA1'de bir film izlediğimi ve bir buçuk saat boyunca eDP1 hiçbir şey yapmadığını varsayalım.

Kullanmakla ilgilenmiyorum xrandor --off --output eDP1çünkü çalışmak için yeterince hızlı değil.

Monitörümün basit bir fare hareketi ile çalışmaya hazır olmasını istiyorum, böylece aralarında hızlı bir şekilde geçiş yapabilirim.

  • Koşu: Ubuntu 18.04
  • Pencere Yöneticisi: OpenBox

Enerji nedeniyle mi yoksa görsel bir çözüm mü?
Jacob Vlijm

@Ravexina Soru, eDP1 arka aydınlatmanız ne kadar ileri gidiyor? Parlaklığı tamamen kapatıyor mu? Evetse, lütfen askubuntu.com/a/814043/295286 yanıtında verdiğim iki komutu test edebilir misiniz ? Yanıtınız için şimdiden teşekkür ederiz
Sergiy Kolodyazhnyy

1
@Ravexina bitti, kusursuz çalışıyor gibi görünüyor, ama bir gün boyunca çalışmaya devam edecek, bu gece geç yayınlayacak. Ekran başına etkinlik kaydı tutacak, ancak farenin şu anda olduğu yerde asla ekranı karartma / kapatma, değil mi?
Jacob Vlijm

1
Tamam, muhtemelen haftasonu Pencere izlemeyi uygulamaya çalışacağım. Ne yazık ki şu anda bunlarla başa çıkmak için çok zamanım yok.
Sergiy Kolodyazhnyy

1
@Ravexina, teşekkürler. Muhtemelen kısa bir süre sonra aktif pencere veya (geçerli bir pencere yoksa) fare eylemiyle tetiklenen başka bir (vala) sürümü gönderirim . Ayrıca arka ışıkla bir şeyler yapıp yapamayacağımızı da göreceğiz, bu da muhtemelen biraz enerji tasarrufu sağlayacaktır. Bonus sırasındaki süre çok kısa, ama soru biraz daha oynayabilecek kadar intersting. Devam edecek. Tekrar teşekkürler.
Jacob Vlijm

Yanıtlar:


6

Xset (ve X11 aslında) ile tek tek monitörleri kontrol etmek mümkün değildir

Başlıktan da anlaşılacağı gibi, nasıl xset inşa edildiği ve kullandığı X11 işlevleri nedeniyle mümkün değildir . Kaynak koda bakarsak, xsetçağrılar DPMSForceLevel(dpy,DPMSModeSuspend)( hat 557 ) ve görüntüleme değişkeni fonksiyondan ( hat 203 ) dpygelir ve tanım gereği :XOpenDisplay()

Bir sunucu, ekranları ve giriş aygıtlarıyla birlikte ekran olarak adlandırılır.

Başka bir deyişle, xsetayarları tek tek Ekranlara değil, tüm ekrana global olarak uygular. xsetÇalışabilmesi için kaynak kodunu değiştirmek gerekir . DPMS uzantılarının kendileri çoğunlukla tek tek ekranları değil, yalnızca tüm ekranı çağırırlar, bu nedenle X11 kitaplığıyla özel kod yazmak bile mümkün değildir.

Bu ayarın /sysalt sistem üzerinden manuel olarak kontrol edilmesi de çalışmıyor gibi görünüyor

$ 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

Ekranlar ayrıca tuş veya fare olayları oluştuğunda DPMS modundan çıkarılır, bu nedenle farenizi hareket ettirmek veya klavye kullanmak isteyebilirsiniz, bu eylemlerden herhangi biri monitörün DPMS modundan çıkmasına neden olur.

Alternatif çözümler

En iyi alternatif (ve aslında fiziksel olarak çalışan çözüm) xrandr- bireysel "çıktıları" kontrol etmek için kullanılabilir. Özellikle,

xrandr --output VGA-1 -off

bu çıkışı kapatır. Evet, yeterince hızlı olmadığı için bu çözümü kullanmak istemediğinizden bahsettiniz, ancak şu ana kadar mevcut olan en iyisi. Birkaç avantajı vardır:

  • tuş ve fare olaylarına karşı bağışıklık
  • farklı olarak outpus'u bağımsız olarak kontrol eder xset

xrandr --output VGA-1 --brightness 0.1Olsa bile, kapalı görünen böyle şekilde ekrana renklendirmek olacak --brightnessekran aslında donanım seviyesinde soluk edilmez, böylece bir yazılım çözümü, ne de donanım seviyesinde kapalıdır. Bununla birlikte, bir ekranı karartma işini yapar ve ayrıca tuş / fare olaylarına karşı dayanıklıdır.

Her ikisi de GNOME ekran koruyucu çatal olan Mate ve Budgie ekran koruyucular kaynak kodu baktım, ancak her iki durumda da bir yazılım çözümü gibi görünüyor, çünkü kaynak kodunda DPMS'den bahsedilmiyor.


Alternatifleri seviyorum ... +1
Fabby

1
@Fabby Thanks :) Şimdiye kadar mevcut en iyi alternatifler
Sergiy Kolodyazhnyy

Pencere Yöneticilerinin bazı numaralar yaptığını ve bazı kancalar sağlayabileceğini düşünüyorum. "Yazılım Tasarımı" adında bir yığın değişim sitesi var ve büyük bir pencerenin (bir web tarayıcısı gibi ama Conky veya üst çubuk görüntüleme süresi değil) 10 dakika boyunca hiçbir piksel değişikliği olmadığı fikrini yüzmek için iyi bir yer olabilir. tüm monitör (yalnızca tek bir monitör) tamamen siyah olana kadar 30 saniyeden fazla kararmaya başlar. Daha sonra fareyi bu monitör üzerinde gezdirmek (tipik olarak 3 monitör kullanıyorum) 1 ila 5 saniyelik bir sürede parlaklığı kademeli olarak geri yükler.
WinEunuuchs2Unix

@ WinEunuuchs2Unix Bir fikrim var ve dikkat edilmesi gereken birkaç şey var, ancak zor ve evet söz konusu pencere yöneticisine bağlı. Sorun DPMS. Ya loş herşey DPMS ile ya da hiç. Yapabileceğimiz en iyisi xrandr --offşimdilik
Sergiy Kolodyazhnyy

DPMS bilgim sınırlıdır. Bence bu bekleme / uyku için elektrik tasarrufu. Aynı sonuçları verebilecek HDMI-CEC de var, ancak bu benim için daha da kara bir büyü deliği. xrandr -offMonitörü kapatıp kapatmadığını bile bilmiyorum . brightnessSıfıra ayarlanmışla aynı olabilir mi? Hangi başka bir sorun, Windows bile yapamaz 3 monitör için ayrı ayrı parlaklık ve gama ayarlar 24/7 çalışan bir program var. Gece ışığı, kırmızıya kayma veya akı yapıp yapmadığından emin değilim. Her neyse, bu programlar xrandr tarafından berbat edilebilir. Spekülasyon ile cevap
çalmak

4

Yıllarca dizüstü bilgisayar kurulumum vardı, kapak kapalıyken dizüstü bilgisayar askıya alınacak ve harici monitörler boş kalacaktı.

Harici monitörde 90 dakika boyunca bir video izlemek ve dizüstü bilgisayar ekranının boş olmasını istemeniz nedeniyle, kapak kapat seçeneğini "Hiçbir Şey Yapma" olarak değiştirdim:

  • Avantajı: Dizüstü bilgisayar kapağını kapattığımda tüm Dizüstü bilgisayar pencereleri tam ekran videonun altına iner.
  • Avantajı: Dizüstü bilgisayar kapağı açıldığında pencereler geri yüklenir ve artık tam ekran videonun altında değildir.
  • Dezavantajı: Vites menüsünden askıya almayı seçmek için üst çubuk menüsüne erişmek için videoyu tam ekran yapmam gerekiyor.
  • Avantajı: Sistem harici monitördeki menü ile askıya alındığında, dizüstü bilgisayar kapağının açılması yine de sistemi devam ettirir.

Harici monitörler için DPMS kullanmıyorum ancak ayarlarınızı xset qkomutla kontrol edebilirsiniz :

$ 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

Şu satırlara dikkat edin:

Screen Saver:
  prefer blanking:  yes
  • Muhtemelen isterdin prefer blanking: no

Ayrıca şu satırlara dikkat edin:

DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled
  • İstediğiniz zaman DPMS is enabledmonitörü olarak ayarlamak isteyebilirsiniz Standby.

Umarım diğer kullanıcılar bu seçenekleri kullanır ve sizin için ayrıntılı bir cevap gönderir.


4

Dizüstü bilgisayarı kapatmaya ne dersiniz?

Neden?

Bu iki monitör bir görüntüleme alanıdır, bu yüzden birini kapatmak ekran yeniden çizme, ana monitöre taşınan uygulamalar, ...

(Birkaç yıl önce o yola indim ve yapmak istediğinizi yapmanın tek güvenilir yolu harici monitördeki düğmeye basmak veya dizüstü bilgisayarı kapatmaktır)

Bu güç ayarlarını şu şekilde yaptığınızdan emin olun 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'

Aslında bu güzel bir çözüm. Donanım, ayrıca bu komut dosyası yazılabilir. Ancak OP, getting'lerin etkili olmayabileceğini gösteren Openbox kullanıyor. İyi bir alternatif için, unix.stackexchange.com/a/52645/85039
Sergiy Kolodyazhnyy

4

Geçici yorum

  1. OP talebi üzerine, aşağıdaki komut dosyası aracılığıyla ekranı kapatmak yaptı xrandr. Daha uzun bir testte, bu oldukça kötü çalıştı. Kapatma o kadar çok başarısız oldu, ancak ekranı yeniden etkinleştirirken, ekran düzeni tamamen bozuldu. Bununla birlikte, sizin durumunuzda işe yarayıp yaramadığını görmek için yayınlamaktan memnuniyet duyarım, ancak tavsiyem kullanmak değil.
    Senaryoda, parlaklık yerine sıfıra ayarlamaya geri döndüm.
  2. Etkin monitörü fare konumuna veya etkin pencerenin konumuna göre tanımlamamız gerekip gerekmediği hakkında bazı tartışmalar yapıldı . Hiçbir pencere yoksa ikincisi çalışmaz. Hiç bir penceremiz olmayabilir (masaüstünün dışında), bu durumda karartmak için pencere seçimi rastgele olur (veya istisnayı içermezsek kırılır). IMO (her durumda mantıklı ve öngörülebilir bir şekilde çalışır) tek seçenek etkin ekranı fare konumuna göre tanımlamaktır. Ayrıca, pencere yöneticisi yeni pencerelerin nerede görünmesi gerektiğine de bu şekilde karar verir.

O zaman bu sürümde neyi değiştirdim?
Boşta kalma süresi artık varsayılan olarak hem klavye hem de fare etkinliği tarafından tanımlanmaktadır. Uyanma da biri tarafından yapılır.


Etkin olmayan ekranı otomatik olarak karart

Yanıtlayan arkadaşlarımın söylediği gibi, ekranları cli'dan ayrı olarak kapatmak en iyi sorundur ve ben de bir seçenek bulamadım.

Bulduğum şey, x zamanından sonra farenin olduğu hariç tüm ekranları otomatik olarak karartmanın bir yoludur .

İşte başlıyoruz

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

Nasıl kurulur

Kurulum basittir:

  1. Her ikisinin de yüklü olduğundan python3-give xprintidleyüklendiğinden emin olun

    sudo apt install python3-gi xprintidle
    
  2. Yukarıdaki komut dosyasını boş bir dosyaya kopyalayın, farklı kaydedin dim_inactiveve yürütülebilir yapın

  3. Komut ile çalıştırın:

    /path/to/dim_inactive <idle_time_in_seconds>
    

    Bir örnek:

    /path/to/dim_inactive 120
    

    iki dakika sonra farenin olmadığı tüm ekranları karartır

Ek bilgi / açıklama

  • Komut dosyası başlangıçta tüm ekranları listeler
  • Monitör başına boşta kalma süresi (muhtemelen 2'den fazla) ise kayıt tutar . Bir monitöre x saniye boyunca erişilmezse , farenin bulunduğu monitörden ayrı olarak karartılır .
  • İyi (ama kötü) bir geleneğe göre, Gnome bir şeyler kırmaya devam ediyor ve API'leri değiştirmeye devam ediyor. Sonuç olarak, bu komut dosyasını 19.04 ve üzeri sürümlerde çalıştırdığınızda, kullanımdan kaldırılmış birkaç uyarı alırsınız. Aynı zamanda PEP8'i kırmaz. Yine de en son API'lara güncelleme yapacaktır.

Çok güzel, neredeyse böyle bir şey yazmak için cazip. Ama sanırım burada tekrarlanan tema - şimdiye kadar diğer ekranları yazılım çözümleri ile karartmaktan daha iyi bir şey yok, donanım-ish
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy Hayır, sadece arka ışık bir şey eklerdi, ama şimdi görebildiğim kadarıyla. Bir şeyin mümkün olması gerektiğini düşünün, ama muhtemelen xrandr --offsanırım soğuk bir başlangıç ​​yapacak .
Jacob Vlijm

@JacobVlijm Evet, xrandr --offbu durumda tercih ederim. Özellikle VGA arka ışığı yazılım kontrollü olamaz.
Sergiy Kolodyazhnyy

Tüm çabalarınız için teşekkür ederim, Ama en tuhaf davranışları alıyorum ... Örneğin: Monitörleri karartır, ancak parlaklığı 1hiçbir koşulda sıfırlamaz . Klavye kullanarak harici ekranla etkileşim kurduğumda ve fare ana ekrandayken harici süre boşta kaldıktan sonra kararıyor. Ana ekranla herhangi bir etkileşimim olmadığında ama fare orada olduğunda hiçbir şey yapmıyor ve fareyi başka bir ekrana taşıdığımda ana ekran kararıyor.
Ravexina

@Ravex (1) monitörleriniz yansıtılıyor mu? Değilse, ikinci ekranın çalınmasıyla senaryoyu durdurmuş olabilirsiniz. Şimdi düzeltildi. (2) Aktif ekran niçin tanımlanır? Benim mousepos'um geçici yorumun [2] 'de açıklanmaktadır. bugün daha sonra.
Jacob Vlijm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.