6

Linuxでスクリーンセーバーを無効にするためのより良いクロスDEの方法は何ですか?ここで何かを見つけましたが、それはgnome-screensaver専用です。キーストロークまたはX.OrgAPIをシミュレートして、スクリーンセーバーのアクティブ化を無効にする方法があるかどうか疑問に思っています。

4

3 に答える 3

4

私はこれをしばらく前に調べていましたが、最終的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)

これは理想的ではありませんが、dbusまたはgnome-screensaver-command.

私は呼び出しが本当に好きではなくxwininfo、よりクリーンな方法があればいいのにと思いますが、これまでのところより良いものを見つけることができませんでした. このアプローチのもう 1 つの問題xwininfoは、アプリ ウィンドウの代わりにルート ウィンドウの ID を使用することです。ルート ウィンドウの代わりにアプリ ウィンドウ ID を使用するresume_screensaverと、ウィンドウが破棄されるとすぐに再開されるため、メソッドの必要性がなくなります。

また、キーストロークをシミュレートしたい場合は、私がしばらく使用してきた単純な bash スクリプトを次に示します。xdotool個別にインストールする必要があります。

#!/bin/bash
while : 
do
   sleep 200
   nice -n 1 xdotool key shift
   echo .
done

アップデート

上記の python ソリューションを 1 年以上使用した後、ときどきゾンビ プロセスや のインスタンスが多すぎることがわかったので、掘り下げた後、 Gnome 固有xdg-screensaverのより単純な代替手段を見つけましたが、非 Gnome DE (XFCE) は、Gnome デスクトップがなくてもコア Gnome ライブラリが多くの GTK ベースのアプリで必要とされるためです。

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()
于 2012-07-21T15:39:29.410 に答える