2016-04-02 8 views
0

私はウェブサーバーを実行しているタッチスクリーンキオスクを持っています。画面が一定の時間触れられていない場合は、スライドショーを表示したい。その目的のために、私は以下のスクリプトを持っています。起動時にカスタムスクリーンセーバーを起動するのは、手動でスクリーンセーバーを起動する場合とは異なります

#!/bin/sh 

# Wanted trigger timeout in milliseconds. 
IDLE_TIME=$((15*1000)) 

# Sequence to execute when timeout triggers. 
trigger_cmd() { 
DISPLAY=:0 feh -ZXYrzFD 10 /home/pi/screensaver/img --zoom fill & 
    echo '"pkill -n feh; pkill -n xbindkeys"'>/home/pi/screensaver/xbindkeys.temp 
    echo "b:1">>/home/pi/screensaver/xbindkeys.temp 
    DISPLAY=:0 xbindkeys -n -f /home/pi/screensaver/xbindkeys.temp 
    sudo rm /home/pi/screensaver/xbindkeys.temp 
} 

sleep_time=$IDLE_TIME 
triggered=false 

# ceil() instead of floor() 
while sleep $(((sleep_time+999)/1000)); do 
    idle=$(DISPLAY=:0 xprintidle) 
    if [ $idle -gt $IDLE_TIME ]; then 
     if ! $triggered; then 
      trigger_cmd 
      triggered=true 
      sleep_time=$IDLE_TIME 
     fi 
    else 
     triggered=false 
     # Give 100 ms buffer to avoid frantic loops shortly before triggers. 
     sleep_time=$((IDLE_TIME-idle+100)) 
    fi 
done 

私はxprintidleを使用して、画面のアイドル時間を確認します。 xbindkeysの部分は、画面に触れたときにfehを殺すためのものです。手動でスクリプトを開始すると、一度画面に触れるとスライドショーを閉じることができ、指定したアイドル時間の後に再び開くことができます。 init.dでスクリプトを使用してスクリプトを開始すると、再度スライドショーを開く前に画面を2回タッチする必要があります。一度だけ画面に触れた場合はスライドショーを再開しません。
init.dのスクリプトは、上記のスクリプトをユーザーpiとして開始するだけです。

ブート時にスクリプトを開始すると、スクリプトがアイドルタイマーを開始するのに2回クリックする必要があるように見えるのはなぜですか?

+0

ログインしているユーザーの数はいくつですか? – tijko

+0

piユーザーだけが – kaascroissant

答えて

1

DISPLAY環境変数が設定されている(つまり、ユーザーpiがログインしていない)前に、タッチスクリーンスクリプトがinit.dで実行されている可能性があります。

.bash_profileから実行してください。そうすれば、すべてのユーザ環境変数は特に$DISPLAYに設定され、ログイン時にスクリプトは一度実行されます。

+1

にログインしています。 – kaascroissant

関連する問題