如何在多显示器设置中使用xset使显示器待机?


10

当两个或多个监视器一起工作时,是否可以通过发出以下命令将其中一个监视器置于待机/挂起状态xset dpms force suspend?或为此设置时间,例如:xset dpms 100 0 0哪些可以分别在这些显示器上使用?

我有两个互相配合的显示器,eDP1(我的笔记本电脑)和VGA1(外接显示器)。

如果我不直接与他们互动,我希望他们每个人都分别进入挂起/待机模式,假设我正在VGA1上看电影,而eDP1则有一个半小时不工作。

我对使用不感兴趣,xrandor --off --output eDP1因为使用它的速度不够快。

我希望我的显示器可以通过简单的鼠标移动就可以工作了,这样我就可以在它们之间快速切换。

  • 运行:Ubuntu 18.04
  • 窗口管理器:OpenBox

是出于能源原因,还是视觉解决方案?
Jacob Vlijm

@Ravexina问题,您的eDP1背光灯走了多远?它会完全关闭亮度吗?如果是,请您测试一下我在askubuntu.com/a/814043/295286回答中的两个命令 吗?预先感谢您的回应
Sergiy Kolodyazhnyy

1
@Ravexina完成了,似乎工作正常,但是将使其运行一天,将在今晚发布。它会在每个屏幕上记录活动,但不会在鼠标当前处于昏暗状态/关闭屏幕,对吗?
Jacob Vlijm

1
好的,那么我可能会尝试在周末进行窗口跟踪。不幸的是,我现在没有太多时间来处理这些事情。
Sergiy Kolodyazhnyy

1
@Ravexina,谢谢。我可能很快就会发布另一个(vala)版本,由活动窗口(如果没有有效窗口的话)通过鼠标操作触发。还可以看到我们是否可以用背光做一些事情,这也可能节省一些能量。奖金期间的时间太短了,但是这个问题很有趣,无法继续进行。未完待续。再次感谢。
Jacob Vlijm '19

Answers:


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

将关闭该输出。是的,您已经提到您不想使用此解决方案,因为它不够快,但是到目前为止,它是最好的解决方案。它具有几个优点:

  • 不受按键和鼠标事件的影响
  • 独立控制输出不像 xset

xrandr --output VGA-1 --brightness 0.1将上色以这样一种方式的屏幕,它出现了,即使--brightness是一个软件解决方案,所以显示是不实际的硬件级调光,也不是关上的硬件水平。但是,它确实可以使屏幕变黑,并且还可以抵抗按键/鼠标事件。

我看过了Mate和Budgie屏保的源代码,它们都是GNOME屏保的分支,但是无论哪种情况,它们似乎都是软件解决方案,因为在源代码中没有提到DPMS。


我喜欢其他选择... +1
Fabby

1
@Fabby谢谢:)到目前为止,这是最好的选择
Sergiy Kolodyazhnyy

我认为窗口管理器正在做一些技巧,并可能提供一些挂钩。有一个名为“ Software Design”的堆栈交换站点,它可能是一个漂浮主意的好地方,即主窗口(例如Web浏览器,但不显示Conky或顶部栏显示时间)在10分钟内没有像素变化时,整个显示器(仅一个)就在30秒内开始变暗,直到它变黑为止。然后,在该监视器(我通常使用3个监视器)上导航鼠标,将在1到5秒的时间内逐渐恢复亮度。
WinEunuuchs2Unix

@ WinEunuuchs2Unix我有一个主意,需要注意一些事情,但这很棘手,是的,这取决于有问题的窗口管理器。问题是DPMS。使用DPMS会使一切变得暗淡或一无所有。我们能做的最好的就是xrandr --off现在
Sergiy Kolodyazhnyy

我对DPMS的了解有限。我认为这是省电/省电的。还有HDMI-CEC可能会给出相同的结果,但这对我来说更像是一个黑洞。我不知道是否xrandr -off关闭显示器。可能与brightness设置为零相同?这是另一个问题,我有一个运行24/7的程序,该程序分别为3台显示器设置了亮度和伽玛,即使Windows也不行。不确定夜灯,红移或助焊剂是否起作用。无论如何,这些程序可能会被xrandr搞砸。很抱歉通过推测劫持了您的答案:)
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. 在OP的请求,我提出下面的脚本切换屏幕关闭借助于xrandr。在更长的测试中,这非常糟糕。关闭的原因不是很多,但是重新激活屏幕时,屏幕布局完全混乱了。我很乐意将其发布,以查看它是否适合您的情况,但是我的建议是不要使用它。
    在脚本中,我回到将亮度设置为零。
  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-gixprintidle安装

    sudo apt install python3-gi xprintidle
    
  2. 将上面的脚本复制到一个空文件中,另存为dim_inactive,并使其可执行

  3. 通过以下命令运行它:

    /path/to/dim_inactive <idle_time_in_seconds>
    

    一个例子:

    /path/to/dim_inactive 120
    

    两分钟后将使所有鼠标不在的屏幕变暗

附加信息/说明

  • 该脚本列出了启动时的所有屏幕
  • 如果每个监视器的空闲时间(可能大于2),它将保持记录。如果显示器在x秒钟内没有被访问,则除了鼠标所在的显示器外,它都会被涂黑。
  • 根据一个好的(但很糟糕的)传统,Gnome不断打破常规并不断更改API。结果,在19.04及更高版本上运行此脚本,您将获得一些不建议使用的警告。同时,它在PEP8上不会中断。尽管如此,仍将更新到最新的API。

非常好,几乎也想写类似的东西。但我想这是重复的主题在这里-到目前为止,没有什么是比通过软件解决方案,调光等显示,没有什么硬件十岁上下
谢尔盖Kolodyazhnyy

@SergiyKolodyazhnyy Nah,只有背光会增加一些东西,但是据我现在所知就可以了。认为应该有可能,但可能会像xrandr --off我想的那样冷门。
Jacob Vlijm

@JacobVlijm是的,xrandr --off在这种情况下,我更喜欢。特别是由于VGA背光无法通过软件控制。
Sergiy Kolodyazhnyy

感谢您的所有努力,但是我得到的却是最奇怪的行为……例如:它可以使显示器变暗,但1在任何情况下都不会将亮度重置为零。当我使用键盘与外部显示器进行交互并且鼠标位于主显示器中时,外部显示器在空闲时间后会变黑。当我与主显示器没有任何交互,但是鼠标在那里时,它在那里什么也不做,当我将鼠标移至其他显示器主显示器时,它马上会变黑。
Ravexina

@Ravex(1)您的监视器是否已镜像?如果不是,则可能是由于第二个屏幕显示黑屏而停止了脚本。立即修复。(2)为什么在临时注释的[2]中解释了我的mousepos为何定义了活动屏幕(3)还应该通过(1)的更改来解决(相同原因)呵呵,不,需要重置空闲时间,可以今天晚些时候。
Jacob Vlijm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.