読者です 読者をやめる 読者になる 読者になる

Flex Terminal + Telnet

ちまちまと改良を続けているFlexターミナルエミュレータですが、オープンソースFlex 3.0がリリースされた記念でちょっと宣伝します。

  • インターフェイスをしっかり作ったので、ライブラリとして使いやすくなりました。
  • マルチバイト文字の扱いを割とまじめに実装しました。UTF-8EUC-JP、Shift_JISが使えます。実行中にエンコーディングを変えられます。
  • screenでもvimでもエスケープシーケンスの塊でも、まともに動くようになりました。
  • ウィンドウサイズを変えられるようになりました。
  • ANSIカラーを変えられるようになりました。

http://syuki.skr.jp/files/dhatena/20080228/fxterm.png


デモ:
http://syuki.skr.jp/files/dhatena/20080228/FxTerm.flv
(はてなに貼り付けるとあまりに小さい…右クリック→拡大するといい感じです)


ソースコードCodeRepos:/lang/actionscript/FxTermにあります。どんどんいじってください。

$ svn co http://svn.coderepos.org/share/lang/actionscript/FxTerm/trunk FxTerm
$ cd FxTerm
$ # ↓telnetクライアントをコンパイル
$ mxmlc Example.mxml
$ # ↓Flash Playerで実行してみる
$ Flash\ Player Example.swf


既知のバグ:

  • Windowsだと見ることはできるが操作することができない
  • Linuxだとフォントが等幅になってくれず、表示が崩れる
  • Mac/Windows/Linuxで、日本語フォントは等幅になってくれず、多少表示が崩れる

うーむ…。解決策求ム!
それから、あまり速くないです。単純にスクロールするくらいなら快適に使えるレベルなのですが、vimで画面を縦に分割してスクロールすると、大変重いです。
エスケープシーケンスはかなりまともに動くので、見せる分にはそこそこ使えます。


MXMLにも簡単に組み込めるようになっています。↓こんな感じで使えます。

<TelnetService id="telnet"/>
<Terminal id="terminal" dataProvider="{telnet}"/>


TelnetServiceでなくても、(1)flash.events.IEventDispatcherを実装したクラスで、(2)readBytes(buffer:ByteArray):voidメソッドが実装してあり、(3)データが届いたときにProgressEvent.PROGRESSイベントを発行するクラスであれば、dataProvider=""に指定できます。ProgressEvent.PROGRESSイベントを発行すると自動的にreadBytesメソッドが呼ばれ、ターミナルが更新されます。


逆に、Terminalクラスはflash.utils.IDataOutputインターフェイスを実装しているので、外からターミナルにデータを書き込む方式で使うこともできます。データを書き込んでからrefresh()メソッドを呼び出すとターミナルが更新されます。