Bagaimana cara siaga monitor menggunakan xset dalam pengaturan multi monitor?

10

Sementara memiliki dua atau lebih monitor yang bekerja bersama-sama, Apakah ada cara untuk menempatkan satu pun dari mereka pada standby / suspend dengan mengeluarkan perintah seperti: xset dpms force suspend? atau memiliki waktu yang ditetapkan untuk tujuan itu seperti: xset dpms 100 0 0yang bekerja pada monitor ini secara terpisah?

Saya punya dua monitor yang saling bekerja sama, eDP1 (My Laptop) dan VGA1 (An External monitor).

Saya ingin mereka masing-masing masuk ke mode suspend / standby secara terpisah jika saya tidak berinteraksi langsung dengan mereka, misalkan saya menonton film di VGA1, dan selama satu setengah jam eDP1 tidak melakukan apa-apa.

Saya tidak tertarik menggunakan xrandor --off --output eDP1karena tidak cukup cepat untuk digunakan.

Saya ingin monitor saya siap bekerja, dengan gerakan mouse sederhana sehingga saya dapat beralih di antara mereka dengan cepat.

  • Berjalan: Ubuntu 18.04
  • Manajer Jendela: OpenBox
Ravexina
sumber
Apakah karena alasan energi, atau akankah solusi visual dilakukan?
Jacob Vlijm
@Ravexina Pertanyaan, seberapa jauh backlight eDP1 Anda berjalan? Apakah ini mematikan kecerahan sepenuhnya? Jika ya, bisakah Anda menguji dua perintah yang saya jawab di askubuntu.com/a/814043/295286 ? Terima kasih sebelumnya atas tanggapannya
Sergiy Kolodyazhnyy
1
@Ravexina selesai, tampaknya bekerja dengan sempurna, tetapi akan tetap berjalan selama sehari, akan mempostingnya malam ini. Ini akan mencatat aktivitas pada layar, tetapi tidak pernah meredupkan / mematikan layar di mana mouse saat ini, kan?
Jacob Vlijm
1
OK, saya mungkin akan mencoba menerapkan pelacakan Window pada akhir pekan lalu. Sayangnya saya tidak punya banyak waktu untuk menangani hal-hal ini sekarang.
Sergiy Kolodyazhnyy
1
@Ravexina, terima kasih. Saya mungkin akan segera memposting versi lain (vala), dipicu oleh jendela aktif atau (jika tidak ada jendela yang valid) oleh aksi mouse. Juga akan melihat apakah kita dapat melakukan sesuatu dengan cahaya latar, yang mungkin juga akan menghemat energi. Waktu selama bonus terlalu singkat, tetapi pertanyaannya cukup menarik untuk bermain sedikit lebih jauh. Bersambung. Sekali lagi terima kasih.
Jacob Vlijm

Jawaban:

5

Mengontrol masing-masing monitor tidak dimungkinkan dengan xset (dan X11 sebenarnya)

Seperti judulnya, tidak mungkin untuk alasan bagaimana xset dibangun dan karena fungsi X11 yang digunakannya. Jika kita melihat kode sumber, xsetpanggilan DPMSForceLevel(dpy,DPMSModeSuspend)( jalur 557 ), dan variabel tampilan dpyberasal dari XOpenDisplay()fungsi ( jalur 203 ), dan itu adalah dengan definisi :

Server, bersama dengan layar dan perangkat inputnya, disebut layar.

Dengan kata lain, xsetterapkan pengaturan secara global ke seluruh tampilan, bukan Layar individual. Ini perlu untuk mengubah xsetkode sumber agar bisa berfungsi. Ekstensi DPMS sendiri sebagian besar tampaknya hanya memanggil seluruh tampilan, bukan layar individual, sehingga bahkan tidak mungkin untuk menulis kode khusus dengan pustaka X11.

Mengontrol pengaturan secara manual melalui /syssubsistem juga tampaknya tidak berfungsi

$ 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

Layar juga dikeluarkan dari mode DPMS saat peristiwa tombol atau mouse terjadi, jadi mengingat Anda mungkin ingin menggerakkan mouse atau menggunakan keyboard, salah satu tindakan tersebut akan menyebabkan monitor meninggalkan mode DPMS.

Penanganan alternatif

Alternatif terbaik (dan solusi yang secara fisik berfungsi) adalah xrandr- ini dapat digunakan untuk mengontrol "output" individual. Khususnya,

xrandr --output VGA-1 -off

akan menonaktifkan output itu. Ya, Anda telah menyebutkan bahwa Anda tidak ingin menggunakan solusi ini karena tidak cukup cepat, namun sejauh ini yang terbaik tersedia. Ini memiliki beberapa keunggulan:

  • kebal terhadap peristiwa kunci dan mouse
  • secara independen mengontrol outpus tidak seperti xset

The xrandr --output VGA-1 --brightness 0.1akan mewarnai layar sedemikian rupa sehingga muncul off, meskipun --brightnessadalah solusi perangkat lunak, sehingga layar tidak benar-benar redup di tingkat hardware, juga itu adalah dari pada tingkat hardware. Namun, itu berfungsi mengosongkan layar dan juga tahan terhadap peristiwa tombol / mouse.

Saya telah melihat kode sumber screensaver Mate dan Budgie, yang keduanya adalah garpu screensaver GNOME, namun dalam kedua kasus mereka tampaknya menjadi solusi perangkat lunak, karena tidak ada penyebutan DPMS dalam kode sumber.

Sergiy Kolodyazhnyy
sumber
Saya suka alternatifnya ... +1
Fabby
1
@Fabby Terima kasih :) Sejauh ini itulah alternatif terbaik yang tersedia
Sergiy Kolodyazhnyy
Saya pikir Manajer Jendela melakukan beberapa trik dan mungkin menyediakan beberapa kait. Ada situs pertukaran tumpukan yang disebut "Desain Perangkat Lunak" dan itu mungkin tempat yang baik untuk melayang gagasan bahwa ketika jendela utama (seperti browser web tetapi tidak Conky atau waktu menampilkan bar atas) tidak memiliki perubahan piksel selama katakanlah 10 menit seluruh monitor (hanya satu) mulai redup lebih dari 30 detik hingga benar-benar hitam. Kemudian menavigasi mouse ke monitor itu (saya biasanya menggunakan 3 monitor) mengembalikan kecerahan secara bertahap selama periode 1 hingga 5 detik.
WinEunuuchs2Unix
@ WinEunuuchs2Unix Saya punya ide dan ada beberapa hal yang harus diperhatikan, tapi itu rumit, dan ya tergantung pada window manager yang bersangkutan. Masalahnya adalah DPMS. Entah itu meredupkan semuanya atau tidak sama sekali dengan DPMS. Yang terbaik yang bisa kita lakukan adalah xrandr --offuntuk sekarang
Sergiy Kolodyazhnyy
Pengetahuan DPMS saya terbatas. Saya pikir ini adalah hal yang menghemat listrik untuk tidur / tidur. Ada juga HDMI-CEC yang mungkin memberikan hasil yang sama tetapi itu bahkan lebih merupakan lubang hitam bagi saya. Saya tidak tahu apakah xrandr -offbahkan mematikan monitor. Mungkin sama dengan brightnessset ke nol? Yang merupakan masalah lain saya memiliki program yang menjalankan 24/7 yang mengatur kecerahan dan gamma secara individual untuk 3 monitor yang bahkan Windows tidak dapat melakukannya. Tidak yakin apakah lampu malam, shift merah atau fluks melakukannya. Pokoknya program-program itu mungkin kacau oleh xrandr. Maaf untuk membajak jawaban Anda dengan berspekulasi :)
WinEunuuchs2Unix
4

Selama bertahun-tahun saya memiliki pengaturan laptop saya sehingga ketika tutup laptop ditutup akan ditangguhkan dan monitor eksternal akan kosong.

Untuk alasan Anda ingin menonton video selama 90 menit pada monitor eksternal dan membiarkan layar laptop kosong, saya mengubah tutup tutup opsi menjadi "Do Nothing":

  • Keuntungan: Ketika saya menutup tutup Laptop semua jendela Laptop masuk di bawah video layar penuh.
  • Keuntungan: Ketika saya membuka jendela Laptop tutup dipulihkan dan tidak lagi di bawah video layar penuh.
  • Kekurangan: Saya harus membuat video layar tidak penuh untuk mengakses menu bar atas untuk memilih menangguhkan dari menu roda gigi.
  • Keuntungan: Ketika sistem ditangguhkan oleh menu pada monitor eksternal, membuka tutup laptop masih melanjutkan sistem.

Saya tidak menggunakan DPMS untuk monitor eksternal tetapi Anda dapat memeriksa pengaturan Anda dengan xset qperintah:

$ 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

Perhatikan baris-baris ini:

Screen Saver:
  prefer blanking:  yes
  • Anda mungkin menginginkannya prefer blanking: no

Perhatikan juga baris-baris ini:

DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled
  • Anda mungkin ingin DPMS is enabledmengatur monitor Standbyketika diinginkan.

Semoga pengguna lain telah menggunakan opsi ini dan memposting jawaban terperinci untuk Anda.

WinEunuuchs2Unix
sumber
4

Bagaimana kalau hanya menutup laptop?

Mengapa?

Kedua monitor ini adalah satu area tampilan sehingga mematikan satu akan membuat sejumlah masalah seperti redrawing layar, aplikasi pindah ke monitor utama, ...

(Saya pergi ke jalan itu beberapa tahun yang lalu dan satu-satunya cara yang dapat diandalkan yang saya temukan untuk melakukan apa yang ingin Anda lakukan adalah dengan menekan tombol pada monitor eksternal atau menutup laptop)

Pastikan Anda mengatur pengaturan daya ini dengan 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'
Fabby
sumber
Sebenarnya, ini adalah solusi yang bagus. Perangkat keras, ditambah ini dapat dituliskan. Namun, OP menggunakan Openbox, yang menunjukkan gsettings mungkin tidak berlaku. Untuk alternatif yang baik, Anda mungkin ingin memasukkan unix.stackexchange.com/a/52645/85039
Sergiy Kolodyazhnyy
4

Komentar sementara

  1. Atas permintaan OP, saya membuat skrip di bawah ini mematikan layar dengan cara xrandr. Pada tes yang lebih lama, ini berhasil dengan sangat buruk. Tidak begitu banyak mematikan gagal, tetapi saat mengaktifkan kembali layar, tata letak layar benar-benar kacau. Saya akan senang mempostingnya untuk melihat apakah itu berfungsi dalam kasus Anda, tetapi saran saya adalah jangan menggunakannya.
    Dalam skrip, saya kembali ke pengaturan kecerahan ke nol.
  2. Ada beberapa diskusi tentang apakah kita harus menentukan monitor aktif berdasarkan lokasi mouse , atau berdasarkan lokasi jendela aktif . Yang terakhir tidak akan berfungsi jika tidak ada jendela. Kami mungkin tidak memiliki jendela sama sekali (selain dari desktop itu sendiri) dalam hal ini pilihan jendela untuk pingsan akan acak (atau pecah jika kami tidak akan menyertakan pengecualian). IMO satu-satunya pilihan yang masuk akal -dan akan bekerja dengan cara yang dapat diprediksi dalam semua kasus- adalah untuk menentukan layar aktif dengan posisi mouse. Lebih jauh, itu juga bagaimana manajer jendela memutuskan di mana jendela baru akan muncul.

Lalu apa yang saya ubah di versi ini?
Waktu idle sekarang ditentukan oleh aktivitas keyboard dan mouse secara default. Bangun juga dilakukan oleh salah satu dari mereka.


Layar aktif tidak aktif redup

Seperti yang dikatakan oleh sesama penjawab saya, mematikan layar dari cli secara terpisah adalah tantangan yang terbaik, dan saya juga tidak menemukan pilihan.

Apa yang saya temukan adalah cara untuk meredupkan semua layar secara otomatis , kecuali di mana mouse berada, setelah x waktu.

Kita mulai

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

Cara mengatur

Pengaturannya mudah:

  1. Pastikan Anda memiliki kedua python3-gidan xprintidlediinstal

    sudo apt install python3-gi xprintidle
    
  2. Salin skrip di atas ke dalam file kosong, simpan sebagai dim_inactive, dan buat agar dapat dieksekusi

  3. Jalankan dengan perintah:

    /path/to/dim_inactive <idle_time_in_seconds>
    

    sebuah contoh:

    /path/to/dim_inactive 120
    

    akan meredupkan semua layar di mana mouse tidak setelah dua menit

Informasi / penjelasan tambahan

  • Skrip mencantumkan semua layar saat startup
  • Itu membuat catatan jika waktu idle per monitor (mungkin lebih dari 2). Jika monitor tidak diakses selama x detik, itu pingsan, terlepas dari monitor di mana mouse berada .
  • Menurut tradisi yang baik (tapi buruk), Gnome terus menghancurkan barang dan terus mengubah API. Akibatnya, menjalankan skrip ini pada 19,04 dan di atasnya, Anda akan mendapatkan beberapa peringatan usang. Pada saat yang sama, itu tidak merusak PEP8. Namun demikian akan diperbarui ke API terbaru.
Yakub Vlijm
sumber
Sangat bagus, hampir tergoda untuk menulis sesuatu seperti itu juga. Tapi saya rasa itulah tema yang berulang di sini - sejauh ini tidak ada yang lebih baik daripada meredupkan tampilan lain melalui solusi perangkat lunak, tidak ada perangkat keras-ish
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy Nah, hanya lampu latar yang akan menambahkan sesuatu, tapi hanya sejauh yang saya bisa lihat sekarang. Pikirkan sesuatu yang mungkin, tetapi mungkin akan memiliki awal yang dingin, seperti yang xrandr --offsaya kira.
Jacob Vlijm
@ JacobVlijm Ya, xrandr --offitulah yang saya lebih suka dalam hal ini. Terutama karena lampu latar VGA tidak dapat dikendalikan oleh perangkat lunak.
Sergiy Kolodyazhnyy
Terima kasih atas semua upaya Anda, Tapi saya mendapatkan perilaku paling aneh ... Sebagai contoh: Ini meredupkan monitor tetapi tidak mengatur ulang kecerahan kembali ke 1keadaan apa pun. Ketika saya berinteraksi dengan layar eksternal menggunakan keyboard dan saat mouse berada di layar utama, layar eksternal akan hitam setelah waktu idle. Ketika saya tidak memiliki interaksi dengan tampilan utama tetapi mouse ada di sana tidak melakukan apa-apa di sana dan ketika saya memindahkan mouse ke tampilan utama yang lain segera menjadi hitam.
Ravexina
@Ravex (1) apakah monitor Anda dicerminkan? Jika tidak, Anda mungkin telah menghentikan skrip dengan layar kedua dibalut. Memperbaiki itu sekarang. (2) Mengapa layar aktif didefinisikan mousepos saya dijelaskan dalam [2] dari komentar sementara (3) Juga harus diperbaiki dengan perubahan dalam (1) (penyebab yang sama) Huh, tidak, perlu mengatur ulang waktu idle, akan dilakukan nanti hari ini.
Jacob Vlijm