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以降ではこの問題は解消されています。