在Linux中禁用屏幕保护程序的跨DE方法有什么用?我在这里找到了something,但它只适用于gnome-screensaver.我想知道是否有任何方法可以模拟击键或某些X.Org API来禁用屏幕保护程序激活.
解决方法:
我不久前一直在研究这个问题,最后结束了使用xdg-screensaver,我通过subprocess调用它.
import subprocess
def suspend_screensaver():
window_id = subprocess.Popen('xwininfo -root | grep xwininfo | cut -d" " -f4', stdout=subprocess.PIPE, shell=True).stdout.read().strip()
#run xdg-screensaver on root window
subprocess.call(['xdg-screensaver', 'suspend', window_id])
def resume_screensaver(window_id):
subprocess.Popen('xdg-screensaver resume ' + window_id, shell=True)
这并不理想,但显然没有其他解决方案不会涉及到特定于DE的东西,如dbus或gnome-screensaver-command.
我真的不喜欢对xwininfo的调用,并希望有一个更清洁的方式,但到目前为止找不到更好的东西. xwininfo方法的另一个问题是它使用根窗口的id而不是app窗口.使用应用程序窗口ID而不是根窗口将删除对resume_screensaver方法的需要,因为它会在窗口被销毁后立即恢复.
如果你想模拟击键,这是一个我用了一段时间的天真的bash脚本.它确实需要xdotool,必须单独安装.
#!/bin/bash
while :
do
sleep 200
nice -n 1 xdotool key shift
echo .
done
UPDATE
在使用上面的python解决方案超过一年之后,发现它偶尔会创建僵尸进程和/或xdg-screensaver的太多实例,所以在挖掘之后,我发现了一个更简单的替代方案,它是Gnome特定的,但适用于我甚至在非Gnome DE(XFCE)中,因为即使你没有Gnome桌面,许多基于GTK的应用程序也需要核心Gnome库.
import subprocess
def suspend_screensaver():
'suspend linux screensaver'
proc = subprocess.Popen('gsettings set org.gnome.desktop.screensaver idle-activation-enabled false', shell=True)
proc.wait()
def resume_screensaver():
'resume linux screensaver'
proc = subprocess.Popen('gsettings set org.gnome.desktop.screensaver idle-activation-enabled true', shell=True)
proc.wait()