Hatena::ブログ(Diary)

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


 | 

2004-07-17

[][][]Qtopia Shell Bridge Dialog その14 追加報告

 と、言うことでさくっと 0.6.0がリリースされました。いつもながら・・・(^^;)。

 ってコトで、昨日のスクリプトを再度検証してみます。

 とりあえず、[Set]-[Browse]でインプットボックスの初期値を取得します。初期値が二画面目のインプットボックスに入った所で、フォーカスがどこにも当たらない状態になるところまでは、昨日と全く同じです。

 で、この状態で[OK]ボタンを押すと・・・、

 インプットボックスはクリアされますが、値に変化はありません。

 さらに、このまま未フォーカスの状態で、[OK]ボタンを何度押しても値は変わりません。

 この状態で、インプットボックスにフォーカスを移し[OK]を押すと、当然インプットボックスは空の状態ですんで、空文字列が送られ、値はクリアされます。

 ちなみに、インプットボックスが空の状態で、[OK]にフォーカスを移し、ボタンを押すと未フォーカスの時と同様に、何の反応も返しません。このへんは、0.5.6以前の処理と同じってことになるのかな?。

 気になることがあるとすれば、通常インプットボックスで入力を行った場合、値が引き渡された後、もう一度ウィンドウが再描画され、初期値が再セット(ここらへんは、スクリプトの組み方にもよりますが)されます。

 ですが、未フォーカスで[OK]ボタンを押した時にはそれが為されないんですよね。ただ、単純にインプットボックスがクリアされちゃう。

 多分、このインプットボックスのクリアに関しては、qshdlg内部の処理なんで、スクリプトで行ってる初期値のセットなんかが無視されちゃうからだとは思うんですが。

 まぁ、致命的と言うものでは無くなりましたが、感覚的には多少変・・・って感は残りますね(苦笑)。

 とは言え未フォーカスの状態になること自体、本来は例外処理になるもんなんで、ウィンドウ描画の都度、きちんとフォーカス指定をしてやれれば問題は無いと思うんですが・・・。

[][][]Qtopia Shell Bridge Dialog その15 フォーカス処理

 と、言うことで 0.6.0で追加されたフォーカス処理も試してみました。

# focus2.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
 echo 'focus(QString)' Reply > $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
 echo 'focus(QString)' Reply > $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}
 echo 'focus(QString)' Reply > $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

 基本的には、昨日のスクリプトにフォーカスの指定を一行・・・(3窓あるから、実際は3行)追加しただけです。focus.langは昨日と全く同じモノなので、割愛しました。

 で、結論としては・・・フォーカスが飛んじゃう条件の時は、今回のフォーカス指定も正しく為されないようです。

 まぁ、それ以外にも立ち上げ時点で、最初のウィンドウのフォーカス指定(Reply)も正しく当たってくれなかったりするんですが・・・。ちなみに、二窓目から戻ってくる時はちゃんとフォーカス当たります(^^;)。

 やっぱ、このへんは各コントロールの配置が完了する前に、フォーカスの指定が為されてしまい、指定すべきコントロールを見失った結果、フォーカスが飛んじゃってるんじゃないかと・・・。

 同一のパイプに入る分に関しては、順番に処理されるハズなんですけどねぇ。

 | 

Linux Zaurus Technical Know-howにもどる