Qtopia Shell Bridge Dialog その13 原因(多分)判明(苦笑)

 上記の件ですが、ようやっと症状再現(^^;)するスクリプト出来ました。


# focus.sh
#!/bin/bash

# Define argument
export QSHDLG_APP=FocusTest
INPUT=/var/spool/qshdlg/input_${QSHDLG_APP}
OUTPUT=/var/spool/qshdlg/output_${QSHDLG_APP}
CONTROL=/var/spool/qshdlg/control_${QSHDLG_APP}
LANG_FILE="/home/zaurus/work/focus.lang"
MOUNT_DIR="/home/zaurus/Documents/smb"
CURRENT_DIR="/home/zaurus/Documents"

####################################

window1(){

echo 'hideInput()' > ${CONTROL}
echo 'hideSelect()' > ${CONTROL}
echo 'hideReply()' > ${CONTROL}
echo 'hideMessage()' > ${CONTROL}
echo 'hideDefault()' > ${CONTROL}
echo 'direction(QString,QString)' ViewButton LeftToRight > ${CONTROL}
echo 'direction(QString,QString)' Button TopToBottom > ${CONTROL}
echo 'direction(QString,QString)' ViewInput TopToBottom > ${CONTROL}
echo 'update()' > ${CONTROL}

echo 'cancel(QString)' "Cancel_Qshdlg" > $CONTROL

echo 'item(QString,QString)' "Set" "Setting_Qshdlg" > $CONTROL
echo 'item(QString,QString)' "Exit" "Cancel_Qshdlg" > $CONTROL
echo 'showReply()' > $CONTROL

echo 'showMessage()' > $CONTROL
echo 'description(QString)' "'This is a test script.'" > $CONTROL

echo 'show()' > $CONTROL

read ARG_RTN < $INPUT
case $ARG_RTN in
Setting_Qshdlg)
echo 'clear()' > ${CONTROL}
window2
;;
Cancel_Qshdlg)
echo 'reject()' > ${CONTROL}
exit
;;
esac
}

window2(){
echo 'hideInput()' > ${CONTROL}
echo 'hideSelect()' > ${CONTROL}
echo 'hideReply()' > ${CONTROL}
echo 'hideMessage()' > ${CONTROL}
echo 'hideDefault()' > ${CONTROL}

echo 'direction(QString,QString)' ViewButton LeftToRight > ${CONTROL}
echo 'direction(QString,QString)' Button TopToBottom > ${CONTROL}
echo 'direction(QString,QString)' ViewInput TopToBottom > ${CONTROL}
echo 'update()' > ${CONTROL}

echo 'cancel(QString)' "Cancel_Qshdlg" > $CONTROL

echo 'item(QString,QString)' "Browse" "DirBrowse_Qshdlg" > $CONTROL
echo 'item(QString,QString)' "Back" "Cancel_Qshdlg" > $CONTROL
echo 'showReply()' > $CONTROL

echo 'showMessage()' > $CONTROL
echo 'description(QString)' "'=$MOUNT_DIR'" > $CONTROL

# grep "msg_line" $LANG_FILE | sed -e 's/^.*=/description(QString) /' > $CONTROL # 原因(^^;)
# grep "msg_line" $LANG_FILE | sed -e 's/^.*=/description(QString) /' > $CONTROL # 原因(^^;)
# grep "msg_line" $LANG_FILE | sed -e 's/^.*=/description(QString) /' > $CONTROL # 原因(^^;)
# grep "msg_line" $LANG_FILE | sed -e 's/^.*=/description(QString) /' > $CONTROL # 原因(^^;)

echo 'item(QString)' "'$MOUNT_DIR'" > $CONTROL
echo 'showInput()' > $CONTROL

echo 'showDefault()' > $CONTROL
echo 'show()' > $CONTROL

read ARG_RTN < $INPUT
case $ARG_RTN in
DirBrowse_Qshdlg)
echo 'clear()' > ${CONTROL}
window3
;;
Cancel_Qshdlg)
echo 'clear()' > ${CONTROL}
window1
;;
*)
MOUNT_DIR="$ARG_RTN"
echo 'clear()' > ${CONTROL}
window2
;;
esac
}

window3(){
echo 'hideDefault()' > ${CONTROL}
echo 'hideInput()' > ${CONTROL}
echo 'hideMessage()' > ${CONTROL}
echo 'hideReply()' > ${CONTROL}

echo 'direction(QString,QString)' ViewButton LeftToRight > ${CONTROL}
echo 'direction(QString,QString)' Button TopToBottom > ${CONTROL}
echo 'direction(QString,QString)' ViewInput BottomToTop > ${CONTROL}
echo 'stretch(QString,int)' select 1 > ${CONTROL}
echo 'update()' > ${CONTROL}

echo 'cancel(QString)' BacktoPreviousWin_Qshdlg > ${CONTROL}
echo 'item(QString,QString)' "Set" SetDir_Qshdlg > ${CONTROL}
echo 'item(QString,QString)' "Back" BacktoPreviousWin_Qshdlg > ${CONTROL}

echo 'showReply()' > ${CONTROL}

ls -aF1 | grep '\/$' | sed -e 's/^/\"/' | sed -e 's/$/\"/' | sed -e 's/^/item(QString) /' > $CONTROL
echo 'showSelect()' > $CONTROL

echo 'item(QString)' "'$CURRENT_DIR'" > ${CONTROL}
echo 'showInput()' > ${CONTROL}

echo 'show()' > ${CONTROL}

read arg_dirname < $INPUT
case $arg_dirname in
SetDir_Qshdlg)
MOUNT_DIR="$CURRENT_DIR"
echo 'clear()' > ${CONTROL}
window2
;;
BacktoPreviousWin_Qshdlg)
echo 'clear()' > ${CONTROL}
window2
;;
*)
cd "$arg_dirname"
CURRENT_DIR="`pwd`"
echo 'clear()' > ${CONTROL}
window3
;;
esac
}

####################################

# Init qshdlg
qshdlg -t "FocusTest" -c utf8 -N -n -M -s custom -C &
while [ ! -p ${CONTROL} ]
do
:
done

# Start routine

cd "$CURRENT_DIR"

window1


# focus.lang

msg_line="----------------------"

 んと、どうもアウトプットビューへの描画が間に合わない場合にフォーカスが飛んじゃうみたいですね。

 と言うか、先に他のコントロールが出来上がっちゃうのがマズいのかな?。だとすると、スクリプトの組み方、も少し考えると回避出来るのかもしれません。このへんは引き続き調査続行・・・と(^^;)。

 普通に、シェルスクリプト内部で echo 'description(QString)' したりする分には、よっぽど多量のメッセ送ったりしない限りは大丈夫みたいです。

 ただ、今回は、日本語周りの都合で外部のコマンド(grep | sed)呼び出したり、色々処理したりした結果、無視できないオーバーヘッドが発生したってトコでしょうか。使ってる人間の方には判らない速度差なんですけどねぇ(笑)。

 ただ、外部コマンドの呼び出しが全て OUTか?と言うとそういう訳でも無く、今回のスクリプトでも、一回だけ grep | sed してやる分にはちゃんとインプットボックスにフォーカス入ります。
 逆に、内部だけで処理してても、メッセージを多量に表示させたりすると、やっぱりフォーカス飛んだり。

 何回か試してみたところ、処理時間がボーダーラインぎりぎりのトコにあったりすると、同じスクリプトでもフォーカス飛んだり飛ばなかったりします(^^;)。

 このへんは純粋にタイミングの問題のようで。

 一応、手元の C760と、 B500、 A300それぞれでフォーカス飛ぶの確認した上で、メッセージの量調整しましたが、まだフォーカスがちゃんとインプットボックスに当たる場合は、メッセージの数を増やしてくと、多分どっかでフォーカス飛んじゃうと思います。

 まぁ、今晩にでもまたバージョン上がりそうな気配なんで、フォーカス飛んでも大丈夫になりそうですが(笑)。