From c1ee1fea65125009548fb59dbdd3d4175287bce3 Mon Sep 17 00:00:00 2001 From: sidorares Date: Tue, 30 Aug 2011 15:16:07 +1000 Subject: [PATCH] GetKeyboardMapping fix + test --- lib/x11/corereqs.js | 18 +++++++++++++++++- lib/x11/index.js | 5 ++++- lib/x11/xcore.js | 11 ++++++----- test/getkeyboardmapping.js | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 test/getkeyboardmapping.js diff --git a/lib/x11/corereqs.js b/lib/x11/corereqs.js index 7306089..b8d4fd0 100644 --- a/lib/x11/corereqs.js +++ b/lib/x11/corereqs.js @@ -410,5 +410,21 @@ module.exports = { } return res; } - ] + ], + + GetKeyboardMapping: [ + function(startCode, num) { + return [ 'CxSCCxx', [101, 2, startCode, num] ] + }, + function(buff, listLength) { + var res = []; + var format = ''; + for (var i=0; i < listLength; ++i) + format += 'L'; + for (var offset=0; offset < buff.length - 4*listLength; offset += 4*listLength) + res.push(buff.unpack(format, offset)); + console.log(res); + return res; + } + ] } diff --git a/lib/x11/index.js b/lib/x11/index.js index eeae01c..ef228b3 100644 --- a/lib/x11/index.js +++ b/lib/x11/index.js @@ -1,4 +1,7 @@ var core = require('./xcore'); var em = require('./eventmask').eventMask; +var keysyms = require('./keysyms'); + module.exports.createClient = core.createClient; -module.exports.eventMask = em; \ No newline at end of file +module.exports.eventMask = em; +module.exports.keySyms = keysyms; \ No newline at end of file diff --git a/lib/x11/xcore.js b/lib/x11/xcore.js index d79b322..36f06d4 100644 --- a/lib/x11/xcore.js +++ b/lib/x11/xcore.js @@ -44,14 +44,14 @@ function XClient(stream, displayNum, screenNum) pack_stream.on('data', function( data ) { //console.error(hexy(data, {prefix: 'from packer '})); - for (var i=0; i < data.length; ++i) - console.log('<<< ' + data[i]); + //for (var i=0; i < data.length; ++i) + // console.log('<<< ' + data[i]); stream.write(data); }); stream.on('data', function( data ) { //console.error(hexy(data, {prefix: 'to unpacker '})); - for (var i=0; i < data.length; ++i) - console.log('>>> ' + data[i]); + //for (var i=0; i < data.length; ++i) + // console.log('>>> ' + data[i]); pack_stream.write(data); }); @@ -171,7 +171,7 @@ XClient.prototype.unpackEvent = function(type, seq, extra, code, raw) event.type = type; event.seq = seq; - if (type == 4 || type == 5 || type == 6) { // motion event + if (type == 2 || type == 4 || type == 5 || type == 6) { // motion event var values = raw.unpack('LLLSSSSSC'); //TODO: should be LLLLsssssSC //event.raw = values; // TODO: use unpackTo??? @@ -254,6 +254,7 @@ XClient.prototype.expectReplyHeader = function() var code = res[1]; var ev = client.unpackEvent(type, seq_num, extra, code, buf); client.emit('event', ev); + console.log(ev); var ee = client.event_consumers[ev.wid]; if (ee) { ee.emit('event', ev); diff --git a/test/getkeyboardmapping.js b/test/getkeyboardmapping.js new file mode 100644 index 0000000..78d4e4a --- /dev/null +++ b/test/getkeyboardmapping.js @@ -0,0 +1,34 @@ +var x11 = require('../lib/x11'); + +var xclient = x11.createClient(); +var ks = x11.keySyms; +var ks2Name = {}; +for (var key in ks) + ks2Name[ ks[key] ] = key; +var kk2Name = {}; + +xclient.on('connect', function(display) { + var X = this; + var min = display.min_keycode; + var max = display.max_keycode; + X.GetKeyboardMapping(min, max-min, function(list) { + for (i in list) + { + var sublist = list[i]; + kk2Name[i] = []; + for (j in sublist) + kk2Name[i].push(ks2Name[sublist[j]]); + } + + var root = display.screen[0].root; + var wid = X.AllocID(); + var white = display.screen[0].white_pixel; + var black = display.screen[0].black_pixel; + X.CreateWindow(wid, root, 10, 10, 400, 300, 1, 1, 0, { backgroundPixel: white, eventMask: x11.eventMask.KeyPress}); + X.MapWindow(wid); + + X.on('event', function(ev) { + console.log(kk2Name[ev.keycode]); + }); + }); +});