mishimaの日記: イベントディスパッチその2
いつの間にやらタレコまれていたり、といろいろあったが、
その結果他の人の意見を読むことができたので有益であった。
で、まず最初に訂正。先日「今Lispによく似てると気付いた」と書いたが、
2ヶ月ほど前に同様のことを日記に書いていたのを忘れていた。
忘れっぽいな俺。
そして本題。イベントディスパッチの問題は全然解決していない。
今重要だと考えている点を書き出そう。
1. xgsh 以外の言語(つまり子プロセス)でのイベント処理がかんたんであること
(つまり、標準入出力やコマンド呼び出しで何もかもできなければならない)
2. 繰り返し使うコマンドがある場合、
プロセス生成のオーバヘッドをできる限り抑えること
3. 複数の子プロセスが並列に動けるようこと
例えば、ファイル内容をテキストとして表示する xgsh で動くファイラを考えよう。
#! /usr/local/bin/xgsh
_import_ /home/mishima/.xgsh/libexec xgsh/
xgsh/openwindow ROOT --size=640x480 --layout=flow
xgsh/openmenu ROOT/MENU --size=640x24 --src=file:hoge/menu.txt
xgsh/opentree ROOT/LIST --size=160x456
xgsh/openeditor ROOT/VIEW --size=480x456
find . | xgsh/readtree ROOT/LIST
_setsource_ SIMPLE_EVENT xgsh/simple_event_reader
_while_ @SIMPLE_EVENT :
_switch_ $_ :
_case_ "ROOT/MENNU:Quit" :
_last_;
_case_ "ROOT/LIST:Select:(.*)" : #
echo "file:$1" | xgsh/readeditor ROOT/VIEW
xgsh/closeeditor ROOT/VIEW
xgsh/closetree ROOT/LIST
xgsh/closemenu ROOT/MENU
xgsh/closewindow ROOT
_exit_ 0
こんなものか。
xgsh が起動したと同時に、
本物の標準入出力は別のファイルデスクリプタにコピーされて、
xgsh の標準入出力はバックエンドの GUI マネージャと繋がる。
_import_ は特定のディレクトリに置いてあるコマンドを指定した名前空間へ読み込む。
xgsh/openwindow ROOT は、
標準出力を通してウィンドウ生成イベントを出力し、
標準入力から結果が成功したかどうかを読み込むだけの処理。
まずこんなものをたたき台にして、いろいろと穴をあげつらってみよう。
a. _ を予約語につけるのはウザい。まあそれはいいや。
b. xgsh/openmenu コマンド。menu を作るぞー、というイベントを送った後、
標準入力から結果を読もうとするのだが、そのときウィンドウ ROOT
のイベント(WindowCloseとか)が送られてきたらどうするの?
イベントが捨てられちゃうじゃん。
c. もひとつ、別のイベントソース(例えば…ネットワークとか)が
加わったとき、どうやってイベントを待てばいい?
d. 逆に、複数の子プロセスに同じイベントを分配したいときは?
で、b. が先日からずっと考えてる問題なのだ。
イベントディスパッチその2 More ログイン