node.js向けのterminfoをwrapしたc++モジュールを作った
今日の目標地点まで実装完了。
下記のようなjavascriptで、カーソルをhjklで上下左右に動かすのに成功した。
var TERMUTIL=require('./build/default/termutil'); var term=new TERMUTIL.Term(); var keymap={ 113: // q function(){ process.exit(); }, 0x68: // h function(){ term.tcmd('cub1'); }, 0x6a: // j function(){ term.tcmd('cud1'); }, 0x6b: // k function(){ term.tcmd('cuu1'); }, 0x6c: // l function(){ term.tcmd('cuf1'); }, }; //var stdin = process.openStdin(); //stdin.on('data', function(chunk){ この方式だとkeyrepeat(non canonical)がかかったあたりでsegv。謎 term.on('keyinput', function(code){ if(code in keymap){ keymap[code](); } else{ process.stdout.write('['+code+']'); } });
C++のソースはあとで整理してから載せる、多分。
要点は、
- C++のclassとか関数登録(v8)
- C++関数側での引数受け取り(v8)
- libevイベント登録とコールバックからのnode.jsのEvent発動(node.js)
- EventEmitterの継承(node.js)
といったところか。
前もってcool.io(元rev。libevのrubyバインディング)を触っていたので、libevがさくっと理解できて順調なのであった。