Qtopia Shell Bridge Dialog その5 リプライボタンと Enterキー

 ってことで、大体それぞれのダイアログの役割も分かってきたので、もすこし立体的なメニューを試してみることに。

#!/bin/sh

# そろそろ真面目にアプリ名を設定(^^;)
export QSHDLG_APP=rtn_test
INPUT=/var/spool/qshdlg/input_$QSHDLG_APP
OUTPUT=/var/spool/qshdlg/output_$QSHDLG_APP
CONTROL=/var/spool/qshdlg/control_$QSHDLG_APP

# 変数$rtnargを初期化
rtnarg="dummy"

# カスタムダイアログをバックグランドで開く
qshdlg -t "rtn_test" -N -n -h150 -w400 -s custom -C message &
while [ ! -p $CONTROL ]
do
done

# Cancelボタンを殺しとく
echo 'cancel(QString)' Cancel > $CONTROL

# ボタンレイアウト(縦並び)
echo 'direction(QString,QString)' Button TopToBottom > $CONTROL
echo 'update()' > $CONTROL

# リプライボタン設定&表示
echo 'item(QString,QString)' "ボタン1" btn01 > $CONTROL
echo 'item(QString,QString)' "ボタン2" btn02 > $CONTROL
echo 'showReply()' > $CONTROL
echo 'show()' > $CONTROL

# 入力内容読込
read rtnarg < $INPUT

# 処理分岐
case ${rtnarg} in

	# ボタン1判定
	btn01)
		# 判定内容を記録
		echo "ボタン1を押した" > /home/zaurus/rtn_test_result.txt

		# 画面を書き換えてメッセージウインドウを表示する
		echo 'hide()' > $CONTROL
		echo 'hideReply()' > $CONTROL
		echo 'message(QString)' "ボタン1を押しました" > $CONTROL
		echo 'showMessage()' > $CONTROL
		echo 'show()' > $CONTROL

		# Cancelボタンが押されるまで処理続行
		while [ "${rtnarg}" != "Cancel" ]
			do
				read rtnarg < $INPUT
			done
			echo 'reject()' > $CONTROL
	;;

	# ボタン2判定
	btn02)
		# 判定内容を記録して、そのまま終了
		echo "ボタン2を押した" > /home/zaurus/rtn_test_result.txt
		echo "reject()" > $CONTROL
	;;

	# Cancelボタン判定
	Cancel)
		# 判定内容を記録して、そのまま終了
		echo "Cancelボタンを押した" > /home/zaurus/rtn_test_result.txt
		echo "reject()" > $CONTROL
	;;

	# OKボタン判定
	"")
		# 判定内容を記録して、そのまま終了
		echo "OKボタンを押した?" > /home/zaurus/rtn_test_result.txt
		echo "reject()" > $CONTROL
	;;

	# エラー処理
	*)
		# 判定内容、及び戻り値を記録して、そのまま終了
		echo "なんか押した" > /home/zaurus/rtn_test_result.txt
		echo "${rtnarg}" >> /home/zaurus/rtn_test_result.txt
		echo "reject()" > $CONTROL
	;;
esac


 ボタン2つだけのリプライダイアログを表示して、処理を分岐します。


 ボタン1) 判定内容を記録後、画面を切り替えて、メッセージダイアログを表示。Cancelボタンが押されるまで表示し続けます。

 ボタン2) 判定内容を記録して、そのまま終了。


 さらに、OKボタンと Cancelボタンもそれぞれ判定させます。


 とりあえず、動いてはいるんですが・・・、何か挙動が変。
 スペースキーで、各ボタンを選択する分には全く問題なく動作するんですが、Enterキーで押すと、動いたり動かなかったり・・・。あれ〜?。

 ふむむ、ファイルに落とした内容見る限りでは、戻り値はちゃんと帰ってきてるみたいなんですが・・・。。

 続けてスクリプト動かすと、キャッシュでも残るのかと、念のため変数の内容を適当な文字列に初期化してみたりもしましたが、動作に変化はありません。

 って言うか、挙動がおかしくなった時でもスクリプトはそのまま処理続行しよるトコ見ると、 Enterキー押した時点で qshdlgが落ちてるっぽい?。

 それ以前に、 Ver.0.50の更新内容で、

メッセージダイアログ以外での OKボタンは Enterキーと同一の動作

と書いてますが、ダイアログが落ちる件はともかく、少なくとも Enterではボタンの戻り値は渡ってます。
 それに対して、 OKボタンは確かにダイアログは終了しませんが、戻り値としては ""、ヌル文字列が入力PIPEに渡ってます。

 上記のスクリプトの例では、少なくとも OKと Enterの動作は同一でないような気がするんですが・・・。
 一応、立ち上げ時に「-C」で一通り試してもみましたが、 OKと Enterの挙動に変化は見られませんでした。


 ・・・うーむ、そろそろ本気で yaktyさんに直接相談しにく段階かなぁ(^^;)。

 まだまだシェルの知識が怪しいもんで、自前のスクリプトと qshdlgの問題との切り分けが自信持てないんですよね(苦笑)。

 その状態で聞きに行くのも悪いんで、一人で試行錯誤繰り返してたんですが・・・。


 ちなみに、セレクトダイアログの場合は、 OKも Enterもスペースでも戻り値がちゃんと渡り、ダイアログが落ちることもありません。

#!/bin/sh

# そろそろ真面目にアプリ名を設定(^^;)
export QSHDLG_APP=rtn_test2
INPUT=/var/spool/qshdlg/input_$QSHDLG_APP
OUTPUT=/var/spool/qshdlg/output_$QSHDLG_APP
CONTROL=/var/spool/qshdlg/control_$QSHDLG_APP

# 変数$rtnargを初期化
rtnarg="dummy"

# カスタムダイアログをバックグランドで開く
qshdlg -t "rtn_test" -N -n -h150 -w400 -s custom &
while [ ! -p $CONTROL ]
do
done

# Cancelボタンを殺しとく
echo 'cancel(QString)' Cancel > $CONTROL

# セレクトビューレイアウト
echo 'direction(QString,QString)' View TopToBottom > $CONTROL
echo 'direction(QString,QString)' ViewButton LeftToRight > $CONTROL
echo 'direction(QString,QString)' Button TopToBottom > $CONTROL
echo 'stretch(QString,int)' select 1 > $CONTROL
echo 'update()' > $CONTROL

# リスト設定&表示
echo 'item(QString,QString)' "リスト1" btn01 > $CONTROL
echo 'item(QString,QString)' "リスト2" btn02 > $CONTROL
echo 'showSelect()' > $CONTROL
echo 'show()' > $CONTROL

# 入力内容読込
read rtnarg < $INPUT

# 処理分岐
case ${rtnarg} in

	# リスト1判定
	btn01)
		# 判定内容を記録
		echo "リスト1を選んだ" > /home/zaurus/rtn_test2_result.txt

		# 画面を書き換えてメッセージウインドウを表示する
		echo 'hide()' > $CONTROL
		echo 'hideSelect()' > $CONTROL
		echo 'message(QString)' "リスト1を選択しました" > $CONTROL
		echo 'showMessage()' > $CONTROL
		echo 'show()' > $CONTROL

		# Cancelボタンが押されるまで処理続行
		while [ "${rtnarg}" != "Cancel" ]
			do
				read rtnarg < $INPUT
			done
			echo 'reject()' > $CONTROL
	;;

	# リスト2判定
	btn02)
		# 判定内容を記録して、そのまま終了
		echo "リスト2を選択した" > /home/zaurus/rtn_test2_result.txt
		echo "reject()" > $CONTROL
	;;

	# Cancelボタン判定
	Cancel)
		# 判定内容を記録して、そのまま終了
		echo "Cancelボタンを押した" > /home/zaurus/rtn_test2_result.txt
		echo "reject()" > $CONTROL
	;;

	# OKボタン判定
	"")
		# 判定内容を記録して、そのまま終了
		echo "OKボタンを押した?" > /home/zaurus/rtn_test2_result.txt
		echo "reject()" > $CONTROL
	;;

	# エラー処理
	*)
		# 判定内容、及び戻り値を記録して、そのまま終了
		echo "なんか押した" > /home/zaurus/rtn_test2_result.txt
		echo "${rtnarg}" >> /home/zaurus/rtn_test2_result.txt
		echo "reject()" > $CONTROL
	;;
esac


 ふーむ、troさんのopera7の日本語設定パッケージが全部、セレクトダイアログで出来てるのはこのせいかいねぇ?(^^;)。


2004/07/10追記 この件に関しては、作者(yakty)さまにご報告後、qshdlg本体のVer. Upで解決しました。qshdlg Ver 0.5.6以降ではこの問題は解消されています。