Flashでターミナルエミュレータ

気付けばこのブログをほったらかしであることに気付いた。ちょっと方向転換して、-develな内容を書いてくことにしてみようかな。


というわけで、今は次期Partty!計画が一番アクティブに進んでいるのでそのネタを。(いや、VIVER COREかな…WikiFormeかも?)

Partty!の共有ターミナルをFlashで見られるようにしようと思っている。そのためにはFlashでターミナルエミュレータを実装するか、サーバーでターミナルエミュレータを実行してその結果をFlashで描画するかのどちらかを実装しないといけない。


まずFlashでターミナルエミュレータを実装する方法は、正攻法だけどちょっとキツイ。xtermとかputtyとかscreenのソースを読んでみたりしたけど、vimやscreenがちゃんとに動くようにエスケープシーケンスを実装するのは大変。

AdHocな思いつきで、サーバー上でX11とXnestとxtermを動かして、そのフレームバッファをビットマップに変換してFlashに送ってやる方法も思いついたけど、重いし、なんか汚い。

次の思いつきは、puttyをサーバーで実行して、puttyのディスプレイバッファを巻き上げてFlashに送り、レンダリングしてやる方法。puttyUNIXでも動く。悪くない感じ。

で、今発見した方法が、rote(http://rote.sourceforge.net/)を使ってエスケープシーケンス付きのテキストをncursesに描画もらい、ncursesのバッファをターミナルの代わりにFlashに転送する。ncursesのバッファは文字+文字の属性の配列の配列(行×列)で、扱いやすい。


roteを使う方法の不安材料は、マルチバイト文字に対応しているのかどうか。要確認。ncurses側は対応しているらしいので大丈夫。roteのソースコードが異様に短いのもちょと不安。全部で1300行くらいしかない。
puttyはマルチバイト文字にもしっかり対応している。でもputtyは完全なターミナルエミュレータで、ディスプレイへの表示とかキーボードからの入力とかのコードが入っていて、大きくて複雑。読みにくい。そもそもterminal.cとterminal.hだけで7千行近くあるし。うへ。