Hatena::ブログ(Diary)

TAKETYONの作業記録 at りなざうテクノウ


 | 

2004-07-16

[][][]Qtopia Shell Bridge Dialog その12 現在調査続行中(^^;)

 と言うことで、2004/07/15、qshdlg待望のバージョンアップ。0.5.9に上がりました。

 今回から、フォーカス当たってる部分の値優先、インプットボックスの位置変更が可能になりましたんで、

フォルダ選択画面

 こんなカンジの選択メニューを作ってみたりしてます(^^)。

 で、

フォルダ選択画面2

 こんなカンジで、選択した内容を、

設定画面1

 別画面での設定メニューのインプットボックスに、そのまま item(QString)で初期値として入力してます。

 で、それは良いのですが、このスクリプトだと、画面切り替わった瞬間、どこにもフォーカスが当たってない状態になりまして、その状態で画面上の[OK]ボタンをペンで押したりすると・・・・

設定画面2

 設定項目クリア。いやいやいや・・・(^^;)。

 まぁ、要するにこの場合、空き文字が送られてるみたいなんですけどね。

 で、さらにこの状態の説明・検証するためにソリッドなスクリプト書き直してたんですが・・・何回書き直しても、画面切り替わった瞬間、必ずインプットボックスにフォーカスが当たり、同じ状況にならないんですよ。でも、大元のスクリプトだと必ずフォーカス飛ぶ(爆)

 ちなみに、インプットボックスや、[OK]ボタンメッセージビュー等にフォーカスが当たってる場合は普通にインプットボックスの内容がもっぺん渡されるだけなんで、これはこれで問題は無いんですが・・・。

 とりあえず、どういう条件でフォーカスが飛ぶのかを特定せんとなぁ。本チャンのスクリプトで実際飛んでるから、実害出まくり(^^;)。

[][][]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それぞれでフォーカス飛ぶの確認した上で、メッセージの量調整しましたが、まだフォーカスがちゃんとインプットボックスに当たる場合は、メッセージの数を増やしてくと、多分どっかでフォーカス飛んじゃうと思います。

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

 | 

Linux Zaurus Technical Know-howにもどる