SSHクライアントを制作中
引き続きSSHクライアントを制作中。
入出力だけの機能になるのでUIとか簡単と思ってたが、制御コードの実装とかめんどい。
カーソル位置の制御とかは、サーバーからASCIIコード27の'ESC'に続けて91の'['、さらにパラメータが続いて最後に英大文字。
っていうコードがきて、それに従って制御する感じぽい。
Control Sequence Introducer(CSI)っていうものらしい。
不完全な感じがするが、座標系のコマンドは実装した。
ただ、スクロールで座標ずれてくるからそのへんの対応が必要がありそう。
あと、Ctrlキーで制御するようなコマンドの送信はどうやるんだ?
というわけでハマったが、
ASCIIコードの64'@'から95'_'までの32文字に、Ctrlが押されている場合は64を引いた値がASCIIコード0-31の制御コードに対応してる。
というわけで、対応するASCII制御コードを送れば機能する。
でもって、AndroidのキーコードはASCIIコードとは違うので対応させる必要がある。
範囲中のA-ZはASCIIコードで65-90で、Ctrlで64減算すると1-26になり、Androidのキーコードでは29-54の範囲で連番になってるので、キーコードから28を引けば対応する制御コードになる。
Ctrlが押されている場合はgetUnicodeChar()が0の印字不能文字となる。
その他のキーは連番じゃないので個別に設定する必要がありそうだが、'^'と'_'はキーボードによってShiftが必要だからと思うが定数化されてない。なので、その2つは非対応にした。
まあ、そんなわけで、Ctrl+CとかCtrl+Dなんかが送れるようになった。
あとは、
スクロール系の処理。
スクリーンサイズの送信。(フォントサイズを計算する必要があるね)
色系の処理。
ってな感じかな。
nanoとかviとかエディタコマンドに対応させるのが難易度高い部分と思うが、テスト用のSSH鯖にnanoが入ってなかった。
公開鍵認証に対応させたらnano入りの鯖に繋いで試してみるが、
スクリーンショット取るのに外部鯖だとホスト名とかユーザー名とか隠したい。
手元にテスト鯖用意してやるかな。
入出力だけの機能になるのでUIとか簡単と思ってたが、制御コードの実装とかめんどい。
カーソル位置の制御とかは、サーバーからASCIIコード27の'ESC'に続けて91の'['、さらにパラメータが続いて最後に英大文字。
っていうコードがきて、それに従って制御する感じぽい。
Control Sequence Introducer(CSI)っていうものらしい。
不完全な感じがするが、座標系のコマンドは実装した。
ただ、スクロールで座標ずれてくるからそのへんの対応が必要がありそう。
あと、Ctrlキーで制御するようなコマンドの送信はどうやるんだ?
というわけでハマったが、
ASCIIコードの64'@'から95'_'までの32文字に、Ctrlが押されている場合は64を引いた値がASCIIコード0-31の制御コードに対応してる。
というわけで、対応するASCII制御コードを送れば機能する。
でもって、AndroidのキーコードはASCIIコードとは違うので対応させる必要がある。
範囲中のA-ZはASCIIコードで65-90で、Ctrlで64減算すると1-26になり、Androidのキーコードでは29-54の範囲で連番になってるので、キーコードから28を引けば対応する制御コードになる。
Ctrlが押されている場合はgetUnicodeChar()が0の印字不能文字となる。
その他のキーは連番じゃないので個別に設定する必要がありそうだが、'^'と'_'はキーボードによってShiftが必要だからと思うが定数化されてない。なので、その2つは非対応にした。
まあ、そんなわけで、Ctrl+CとかCtrl+Dなんかが送れるようになった。
あとは、
スクロール系の処理。
スクリーンサイズの送信。(フォントサイズを計算する必要があるね)
色系の処理。
ってな感じかな。
nanoとかviとかエディタコマンドに対応させるのが難易度高い部分と思うが、テスト用のSSH鯖にnanoが入ってなかった。
公開鍵認証に対応させたらnano入りの鯖に繋いで試してみるが、
スクリーンショット取るのに外部鯖だとホスト名とかユーザー名とか隠したい。
手元にテスト鯖用意してやるかな。