SVX日記
2006-05-29(Mon) キーボードのキーボード化、ソフトの巻
作り始めてすぐ、Rubyでリアルタイムキー入力(ちょっと違うけど)って、どうやってやるの? という疑問にブチ当たった。うーん……今回やりたいコトは、以前にcccdct(wavカッター)で作ったインスタントプレイ機能に極めて近いんだよな。すかさず、オイラ用cvsリポジトリからcccdctをチェックアウトして、内容を確認……ん? cursesライブラリを使うと、$stdin.getcの挙動が変わる!? なんだかよくわからんが、特に必要はないけどcursesライブラリはインクルードしとこうか……うんうん、これこれッ!! キーを叩いたらリアルタイムに反応。これでよし。
あとはキーとサンプルファイルとのテーブルを作りこむだけの単純作業。ただしオイラは「窓使いの憂鬱」を使って、日本語キーボードの上に英語キーボードの定義を被せているので、一部のキーが死んでいる。そこで、チョイチョイとdot.mayuを変更し、死んでいるキーに意味もなく中カッコを割り当てたりする……よっしゃ!! ほとんどのキーが利用できるようになった。キーの入力検出部、完成!!
1 #!/usr/bin/ruby
2
3 require 'curses'
4
5 Curses.init_screen
6
7 winX = Curses.cols - 0
8 winY = Curses.lines - 0
9 win = Curses::Window.new(winY, winX, 0, 0)
10
11 table = Hash[*[ 27, ["Esc",'2cs'],
12 9, ["Tab",'2d'], ?1, ["1", '2ds'],
13 ?q, ["q", '2e'], ?2, ["2", ' '],
14 ?a, ["a", '0gs'], ?w, ["w", '2f'], ?3, ["3", '2fs'],
15 ?z, ["z", '0a'], ?s, ["s", '0as'], ?e, ["e", '2g'], ?4, ["4", '2gs'],
16 ?x, ["x", '0b'], ?d, ["d", ' '], ?r, ["r", '2a'], ?5, ["5", '2as'],
17 ?c, ["c", '1c'], ?f, ["f", '1cs'], ?t, ["t", '2b'], ?6, ["6", ' '],
18 ?v, ["v", '1d'], ?g, ["g", '1ds'], ?y, ["y", '3c'], ?7, ["7", '3cs'],
19 ?b, ["b", '1e'], ?h, ["h", ' '], ?u, ["u", '3d'], ?8, ["8", '3ds'],
20 ?n, ["n", '1f'], ?j, ["j", '1fs'], ?i, ["i", '3e'], ?9, ["9", ' '],
21 ?m, ["m", '1g'], ?k, ["k", '1gs'], ?o, ["o", '3f'], ?0, ["0", '3fs'],
22 ?,, [",", '1a'], ?l, ["l", '1as'], ?p, ["p", '3g'], ?-, ["-", '3gs'],
23 ?., [".", '1b'], ?;, [";", ' '], ?[, ["[", '3a'], ?=, ["=", '3as'],
24 ?/, ["/", '2c'], ?', ["'", '2cs'], ?], ["]", '3b'], ?\\,["\\", ' '],
25 ?{, ["{", '2d'], ?}, ["}", '2ds'], 13, ["Ent",'4c'], 8, ["BS", '4cs']
26 ]]
27
28 loop {
29 key = $stdin.getc
30 p key
31 p table[key]
32 }