web-dev-qa-db-ja.com

xprintidleが30秒ごとに「リセット」を続ける理由を判断する方法

xprintidleを使用してX(Unity)アイドル時間を取得しようとしているので、一定時間後にモニターをスリープ状態にできます。 (通常のUbuntuの電源/サスペンド設定を使用するとモニターがオンに戻らないため、xset dpms force offを使用する必要があります。別の問題...)しかし、xprintidleは、30秒ごとに0 ms私のマシンを使用しているかどうか。つまり、マウスを動かしている/クリック/スクロールしているのか、キーボードで入力しているのか。何かがUnityをアイドル状態ではないと考えさせているのではないかと疑っていますが、それが何であるかはわかりません。

問題を示す出力はここにあります:

x-pc-linux% while [[ $(xprintidle) -lt 60000 ]]; do
                echo "$(date +%T) $(xprintidle)" && sleep 1;
            done
13:24:47 12
13:24:48 917
13:24:49 1924
13:24:50 2933
13:24:51 3940
13:24:52 4946
13:24:53 5955
13:24:54 6963
13:24:55 7969
13:24:56 8976
13:24:57 9982
13:24:58 10990
.
. # snip
.
13:25:08 21061
13:25:09 22069
13:25:10 23078
13:25:11 24085
13:25:12 342
13:25:13 1350
13:25:14 2358
13:25:15 3364
13:25:16 4372
13:25:17 5380
13:25:18 6388
13:25:19 7395
13:25:20 8402
13:25:21 9409
13:25:22 10417
.
. # snip
.
13:25:35 23511
13:25:36 24519
13:25:37 25525
13:25:38 26532
13:25:39 27540
13:25:40 28549
13:25:41 29556
13:25:42 551
13:25:43 1559
13:25:44 2566
^C% 

アイドル時間が12秒と42秒のマークでどのようにリセットされるかに注目してください。 (わかりましたので、私は究極の答えを持っていますが、この質問には答えません!)

w「w」コマンドからのアイドル時間の出力は何ですか? )を実行しようとしましたが、残念ながら「?xdm?」と表示されます。 Xのアイドル時間。

x-pc-linux% w
 13:37:47 up 2 days,  3:28,  4 users,  load average: 1.76, 2.04, 2.07
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
***      :0       :0               Sat10   ?xdm?   4days  0.59s /sbin/upstart --user
***      pts/1    :0               Sat10    2:09m  0.39s  0.30s zsh
***      pts/4    :0               Sun14    0.00s  5:34   0.00s w
***      pts/12   192.168.1.144    11:20   20:11  13.41s 13.32s zsh

[編集] Andrey Sidorovの回答で here のようにXScreenSaver拡張機能から直接アイドル時間を取得しようとしましたが、30秒ごとに同じタイマーがリセットされます。

x.org documentation 言及のみ

アイドルフィールドは、入力デバイスのいずれかでユーザーから最後の入力を受信して​​からのミリ秒数を指定します。

3
jdk1.0

xprintidleのソースを見ると(これをどのように行ったかについては以下を参照)、次のことがわかります。

This program prints the "idle time" of the user to stdout.  The "idle
time" is the number of milliseconds since input was received on any
input device.  If unsuccessful, the program prints a message to stderr
and exits with a non-zero exit code.

したがって、マウスを動かすとタイムアウトがリセットされると思います。問題のタイムアウトが画面のブランキング/ロックにつながるため、これは理にかなっています。

ソースをさらに見ると、xprintidleが使用する関数がわかります。 (XScreenSaverAllocInfo()DPMSQueryExtension()など)。これらの関数のmanページを読むと、詳細が表示されます(man XScreenSaverAllocInfo)。

どのようにしてソースを調べたのか:

# Includes several set-up-the-environment steps
mkdir ${HOME}/apt-src  
cd ${HOME}/apt-src
Sudo apt-get install apt-src
apt-src install xprintidle
cd xprintidle-0.2/
ls
less xprintidle.c
cd ..
apt-src remove xprintidle
5
waltinator