¿Cómo poner en espera un monitor usando xset en la configuración de múltiples monitores?


10

Mientras tiene dos o más monitores trabajando juntos, ¿hay alguna forma de poner uno solo en espera / suspensión emitiendo un comando como xset dpms force suspend:? o tener un horario establecido para ese propósito como: ¿ xset dpms 100 0 0qué funciona en estos monitores por separado?

Tengo dos monitores trabajando juntos, eDP1 (My Laptop) y VGA1 (Un monitor externo).

Quiero que cada uno de ellos pase al modo de suspensión / espera por separado si no estoy interactuando directamente con ellos, supongamos que estoy viendo una película en VGA1, y durante una hora y media eDP1 no está haciendo nada.

No me interesa usarlo xrandor --off --output eDP1porque no es lo suficientemente rápido como para trabajar con él.

Quiero que mi monitor esté listo para funcionar, con un simple movimiento del mouse para poder cambiar entre ellos rápidamente.

  • Ejecutando: Ubuntu 18.04
  • Administrador de ventanas: OpenBox

¿Es por razones de energía, o lo haría una solución visual?
Jacob Vlijm

@Ravexina Pregunta, ¿hasta dónde llega su retroiluminación eDP1? ¿Apaga el brillo por completo? En caso afirmativo, ¿podría probar los dos comandos que tenía en askubuntu.com/a/814043/295286 answer? Gracias de antemano por la respuesta
Sergiy Kolodyazhnyy

1
@Ravexina hecho, parece funcionar sin problemas, pero lo mantendrá funcionando durante un día, lo publicará tarde esta noche. Mantendrá un registro de la actividad por pantalla, pero nunca atenuará / apagará la pantalla donde está actualmente el mouse, ¿verdad?
Jacob Vlijm el

1
OK, bueno, probablemente intente implementar el seguimiento de Windows el fin de semana. Lamentablemente, no tengo tanto tiempo para lidiar con estas cosas en este momento.
Sergiy Kolodyazhnyy

1
@Ravexina, gracias. Probablemente publicaré otra versión (vala) pronto, activada por una ventana activa o (si no hay una ventana válida) por la acción del mouse. También veremos si podemos hacer algo con luz de fondo, lo que probablemente también ahorrará algo de energía. El tiempo durante el bono simplemente es demasiado corto, pero la pregunta es lo suficientemente interesante como para jugar un poco más. Continuará. Gracias una vez más.
Jacob Vlijm

Respuestas:


5

No es posible controlar monitores individuales con xset (y X11 en realidad)

Como sugiere el título, no es posible por razones de cómo xset se construye y debido a las funciones X11 que usa. Si miramos el código fuente, las xsetllamadas DPMSForceLevel(dpy,DPMSModeSuspend)( línea 557 ) y la variable de visualización dpyproviene de la XOpenDisplay()función ( línea 203 ), y eso es por definición :

Un servidor, junto con sus pantallas y dispositivos de entrada, se denomina pantalla.

En otras palabras, xsetaplica la configuración globalmente a toda la pantalla, no a las pantallas individuales. Sería necesario cambiar el xsetcódigo fuente para que eso funcione. Las extensiones DPMS en sí mismas parecen llamar solo a la pantalla completa, no a pantallas individuales, por lo que ni siquiera es posible escribir código personalizado con la biblioteca X11.

Controlar manualmente esa configuración a través del /syssubsistema tampoco parece estar funcionando

$ 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

Las pantallas también se sacan del modo DPMS cuando se producen eventos clave o del mouse, por lo que teniendo en cuenta que es posible que desee mover el mouse o usar el teclado, cualquiera de esas acciones hará que el monitor salga del modo DPMS.

Soluciones alternativas

La mejor alternativa (y una solución que realmente funciona físicamente) es xrandr: podría usarse para controlar las "salidas" individuales. En particular,

xrandr --output VGA-1 -off

desactivará esa salida. Sí, ha mencionado que no desea usar esta solución ya que no es lo suficientemente rápida, sin embargo, hasta ahora es la mejor disponible. Tiene un par de ventajas:

  • inmune a eventos clave y de mouse
  • controla independientemente el outpus a diferencia de xset

El xrandr --output VGA-1 --brightness 0.1va a colorear la pantalla de tal manera que parece que fuera, a pesar de que --brightnesses una solución de software, por lo que la pantalla no es en realidad atenuada a nivel de hardware, ni se va a nivel de hardware. Sin embargo, hace el trabajo de borrar una pantalla y también es resistente a eventos de tecla / mouse.

He buscado el código fuente de los protectores de pantalla Mate y Budgie, que son dos tenedores del protector de pantalla GNOME, sin embargo, en cualquier caso, parecen ser una solución de software, ya que no se menciona DPMS en el código fuente.


Me gustan las alternativas ... +1
Fabby

1
@Fabby Gracias :) Hasta ahora, esa es la mejor alternativa disponible
Sergiy Kolodyazhnyy

Creo que los gestores de ventanas están haciendo algunos trucos y podrían proporcionar algunos ganchos. Hay un sitio de intercambio de pila llamado "Diseño de software" y podría ser un buen lugar para plantear la idea de que cuando una ventana principal (como un navegador web pero no el tiempo de visualización de Conky o la barra superior) no tiene cambios de píxeles en unos 10 minutos, el Todo el monitor (solo uno) comienza a atenuarse durante 30 segundos hasta que está completamente negro. Luego, al desplazar el mouse sobre ese monitor (generalmente uso 3 monitores) se restaura el brillo gradualmente durante un período de 1 a 5 segundos.
WinEunuuchs2Unix

@ WinEunuuchs2Unix Tengo una idea y hay algunas cosas a tener en cuenta, pero es complicado, y sí, depende del administrador de ventanas en cuestión. El problema es el DPMS. O bien atenúa todo o nada con DPMS. Lo mejor que podemos hacer es xrandr --offpor ahora
Sergiy Kolodyazhnyy

Mi conocimiento de DPMS es limitado. Creo que es un ahorro de electricidad para standy / sleep. También hay HDMI-CEC que podría dar los mismos resultados, pero eso es aún más un agujero negro de magia para mí. No sé si xrandr -offincluso apaga el monitor. ¿Podría ser lo mismo que brightnessestablecer en cero? Otro problema es que tengo un programa que funciona las 24 horas, los 7 días de la semana, que establece el brillo y la gamma individualmente para 3 monitores, lo que incluso Windows no puede hacer. No estoy seguro si la luz nocturna, el cambio rojo o el flujo lo hacen. De todos modos, esos programas podrían estropearse con xrandr off. Perdón por secuestrar tu respuesta especulando :)
WinEunuuchs2Unix

4

Durante años tuve la configuración de mi computadora portátil de tal manera que cuando la tapa está cerrada, la computadora portátil se suspendería y los monitores externos quedarían en blanco.

Por su razón de querer ver un video durante 90 minutos en un monitor externo y que la pantalla de la computadora portátil quede en blanco, cambié la opción de cerrar la tapa a "No hacer nada":

  • Ventaja: cuando cierro la tapa de la computadora portátil, todas las ventanas de la computadora portátil van debajo del video de pantalla completa.
  • Ventaja: cuando abro, las ventanas de la tapa del portátil se restauran y ya no están debajo del video de pantalla completa.
  • Desventaja: tengo que hacer que el video no sea de pantalla completa para acceder al menú de la barra superior y seleccionar suspender del menú de ajustes.
  • Ventaja: cuando el sistema está suspendido por el menú en un monitor externo, la apertura de la tapa del portátil aún reanuda el sistema.

No estoy usando DPMS para monitores externos, pero puede verificar su configuración con el xset qcomando:

$ 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

Observe estas líneas:

Screen Saver:
  prefer blanking:  yes
  • Es probable que desee prefer blanking: no

Observe también estas líneas:

DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled
  • Es probable que desee DPMS is enabledconfigurar el monitor Standbycuando lo desee.

Esperemos que otros usuarios hayan usado estas opciones y publiquen una respuesta detallada para usted.


4

¿Qué tal simplemente cerrar la computadora portátil?

¿Por qué?

Estos dos monitores son un área de visualización, por lo que apagar uno creará una serie de problemas como el rediseño de la pantalla, las aplicaciones que se mueven al monitor principal, ...

(Tomé ese camino hace unos años y la única forma confiable que encontré de hacer lo que quieres hacer es presionar el botón en el monitor externo o cerrar la computadora portátil)

Solo asegúrese de establecer estas configuraciones de energía con 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'

En realidad, esta es una buena solución. Hardware, más esto puede ser programado. Sin embargo, OP está utilizando Openbox, lo que sugiere que las configuraciones pueden no tener efecto. Para una buena alternativa, puede incluir unix.stackexchange.com/a/52645/85039
Sergiy Kolodyazhnyy

4

Comentario temporal

  1. A petición de OP, hice que el siguiente script apagara la pantalla mediante xrandr. En una prueba más larga, esto funcionó bastante mal. No tanto el apagado falló, pero al reactivar la pantalla, el diseño de la pantalla estaba totalmente desordenado. Sin embargo, me encantaría publicarlo para ver si funciona en su caso, pero mi consejo es que no lo use.
    En el guión, volví a configurar el brillo a cero.
  2. Se debatió si deberíamos definir el monitor activo por la ubicación del mouse o por la ubicación de la ventana activa . Este último no funcionará si no existe una ventana. Es posible que no tengamos una ventana (aparte del escritorio en sí), en cuyo caso la elección de la ventana para oscurecer sería aleatoria (o interrumpida si no incluimos la excepción). En mi opinión, la única opción que tiene sentido, y funcionaría de manera predecible en todos los casos, es definir la pantalla activa mediante la posición del mouse. Además, así es como el administrador de ventanas decide dónde deben aparecer las nuevas ventanas.

Entonces, ¿qué cambié en esta versión?
El tiempo de inactividad ahora está definido por la actividad del teclado y el mouse de manera predeterminada. El despertar también lo hace cualquiera de los dos.


Atenuar automáticamente la pantalla inactiva

Como dijeron mis colegas que respondieron, apagar las pantallas desde cli por separado es un desafío en el mejor de los casos, y tampoco encontré una opción.

Lo que sí encontré es una forma de atenuar automáticamente todas las pantallas, excepto la que está donde está el mouse, después de x time.

Aquí vamos

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

Como instalar

La configuración es sencilla:

  1. Asegúrate de tener ambos python3-gie xprintidleinstalados

    sudo apt install python3-gi xprintidle
    
  2. Copie el script anterior en un archivo vacío, guárdelo como dim_inactivey hágalo ejecutable

  3. Ejecútelo con el comando:

    /path/to/dim_inactive <idle_time_in_seconds>
    

    un ejemplo:

    /path/to/dim_inactive 120
    

    atenuará todas las pantallas donde el mouse no esté después de dos minutos

Información adicional / explicación

  • El script enumera todas las pantallas al inicio
  • Mantiene un registro si el tiempo de inactividad por monitor (posiblemente más de 2). Si no se accede a un monitor durante x segundos, se oscurece, aparte del monitor donde está el mouse .
  • De acuerdo con una buena (pero mala) tradición, Gnome sigue rompiendo cosas y cambiando las API. Como resultado, ejecutando este script en 19.04 y superior, obtendrá algunas advertencias obsoletas. Al mismo tiempo, no se rompe en PEP8. Sin embargo, se actualizará a las últimas API.

Muy agradable, casi tentado a escribir algo así también. Pero supongo que ese es el tema repetido aquí: hasta ahora no hay nada mejor que atenuar la otra pantalla a través de soluciones de software, nada de hardware
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy Nah, solo la luz de fondo agregaría algo, pero eso es todo lo que puedo ver ahora. Creo que algo debería ser posible, pero probablemente tendrá un arranque en frío, tal como xrandr --offsupongo.
Jacob Vlijm

@JacobVlijm Sí, xrandr --offes lo que preferiría en este caso. Especialmente porque la luz de fondo VGA no puede ser controlada por software.
Sergiy Kolodyazhnyy

Gracias por todos sus esfuerzos, pero estoy obteniendo los comportamientos más extraños ... Por ejemplo: atenúa los monitores pero no restablece el brillo a 1ninguna circunstancia. Cuando estoy interactuando con una pantalla externa usando el teclado y mientras el mouse está en la pantalla principal, la externa se vuelve negra después del tiempo de inactividad. Cuando no tengo ninguna interacción con la pantalla principal pero el mouse está allí, no hace nada allí y cuando muevo el mouse a otra pantalla principal, uno se vuelve negro de forma inminente.
Ravexina

@Ravex (1) ¿se reflejan sus monitores? De lo contrario, es posible que haya detenido el script con la segunda pantalla deshabilitada. Solucionado eso ahora. (2) Por qué se define la pantalla activa, mi mousepos se explica en [2] del comentario temporal (3) También se debe corregir con los cambios en (1) (misma causa) Huh, no, es necesario restablecer el tiempo de inactividad, lo hará que mas tarde hoy.
Jacob Vlijm
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.