临时评论
- 在OP的请求,我提出下面的脚本切换屏幕关闭借助于
xrandr
。在更长的测试中,这非常糟糕。关闭的原因不是很多,但是重新激活屏幕时,屏幕布局完全混乱了。我很乐意将其发布,以查看它是否适合您的情况,但是我的建议是不要使用它。
在脚本中,我回到将亮度设置为零。
- 关于是否应该通过鼠标位置或活动窗口的位置来定义活动监视器的讨论。如果没有窗口,则后者将不起作用。我们可能根本没有一个窗口(除了桌面本身),在这种情况下,要中断的窗口的选择将是随机的(如果我们不包括该例外,则可能会中断)。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
如何设定
设置非常简单:
请确保您有两个python3-gi
和xprintidle
安装
sudo apt install python3-gi xprintidle
将上面的脚本复制到一个空文件中,另存为dim_inactive
,并使其可执行
通过以下命令运行它:
/path/to/dim_inactive <idle_time_in_seconds>
一个例子:
/path/to/dim_inactive 120
两分钟后将使所有鼠标不在的屏幕变暗
附加信息/说明
- 该脚本列出了启动时的所有屏幕
- 如果每个监视器的空闲时间(可能大于2),它将保持记录。如果显示器在x秒钟内没有被访问,则除了鼠标所在的显示器外,它都会被涂黑。
- 根据一个好的(但很糟糕的)传统,Gnome不断打破常规并不断更改API。结果,在19.04及更高版本上运行此脚本,您将获得一些不建议使用的警告。同时,它在PEP8上不会中断。尽管如此,仍将更新到最新的API。