mirror of
https://github.com/danbulant/node-x11
synced 2026-06-07 08:40:48 +00:00
commit
b39672b9d3
7 changed files with 2620 additions and 1004 deletions
|
|
@ -12,7 +12,7 @@ var ButtonRelease = x11.eventMask.ButtonRelease;
|
||||||
// image and coords file from http://www.patrick-wied.at/projects/heatmap-keyboard/
|
// image and coords file from http://www.patrick-wied.at/projects/heatmap-keyboard/
|
||||||
// TODO: add simple tool to use&tag coords in own keyboard photo
|
// TODO: add simple tool to use&tag coords in own keyboard photo
|
||||||
// jpeg decoder is slightly modified version of https://github.com/notmasteryet/jpgjs
|
// jpeg decoder is slightly modified version of https://github.com/notmasteryet/jpgjs
|
||||||
var kbdImg = require('./node-jpg').readJpeg('./keyboard.jpg');
|
var kbdImg = require('./node-jpg').readJpeg(__dirname+'/keyboard.jpg');
|
||||||
var keycoords = require('./coordinates');
|
var keycoords = require('./coordinates');
|
||||||
|
|
||||||
// from https://github.com/substack/node-keysym
|
// from https://github.com/substack/node-keysym
|
||||||
|
|
|
||||||
69
examples/key-recognition.js
Normal file
69
examples/key-recognition.js
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
var x11 = require('..');
|
||||||
|
|
||||||
|
// The list provided by GetKeyboardMapping has sublists where each position
|
||||||
|
// represents the result for some key composition.
|
||||||
|
keyComposition = [
|
||||||
|
'Key',
|
||||||
|
'shift + Key',
|
||||||
|
'modeSwitch + Key',
|
||||||
|
'modeSwitch + shift + Key',
|
||||||
|
'altGr + Key',
|
||||||
|
'altGr + shift + Key'
|
||||||
|
]
|
||||||
|
|
||||||
|
x11.createClient(function(err, display){
|
||||||
|
if (err) throw err
|
||||||
|
|
||||||
|
var min = display.min_keycode, // TODO: explain min_keycode
|
||||||
|
max = display.max_keycode, // TODO: explain max_keycode
|
||||||
|
chr2Data = [], // allow us to find a char by the charcode
|
||||||
|
key2Data = []; // associate chars to a keycode
|
||||||
|
|
||||||
|
// The keySyms is a hash of mnemonic char names, associated to an integer
|
||||||
|
// charcode and its description.
|
||||||
|
for (codeName in x11.keySyms) {
|
||||||
|
keyData = x11.keySyms[codeName];
|
||||||
|
chr2Data[keyData.code] = { codeName: codeName, description: keyData.description };
|
||||||
|
}
|
||||||
|
|
||||||
|
var X = display.client,
|
||||||
|
wid = X.AllocID(), // Get a free integer id to a new window.
|
||||||
|
root = display.screen[0].root, // The mother window. Like your window manager.
|
||||||
|
evKeyPress = x11.eventMask.KeyPress, // Allow to filter for KeyPress events.
|
||||||
|
white = display.screen[0].white_pixel; // Will paint the window.
|
||||||
|
|
||||||
|
// Get the local key mapping to build key2Data.
|
||||||
|
X.GetKeyboardMapping(min, max-min, function(err, list) {
|
||||||
|
for (var i=0; i < list.length; ++i) {
|
||||||
|
var name = key2Data[i+min] = [];
|
||||||
|
var sublist = list[i];
|
||||||
|
for (var j=0; j < sublist.length; ++j)
|
||||||
|
name.push(chr2Data[sublist[j]]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Launch a window to listen by key events:
|
||||||
|
X.CreateWindow(wid, root, 0, 0, 100, 100, 0, 0, 0, 0, { backgroundPixel: white, eventMask: evKeyPress });
|
||||||
|
X.MapWindow(wid);
|
||||||
|
|
||||||
|
X.on('event', function(ev) {
|
||||||
|
if (ev.type == 2) { // filter by KeyPress. Useful if you have a more open eventMask.
|
||||||
|
var key = key2Data[ev.keycode]; // key is a list of chars related to the pressed key.
|
||||||
|
if (key) {
|
||||||
|
console.log('\n>> key pressed:', ev.keycode);
|
||||||
|
for (var i=0; i<key.length; i++) // Describe each related char
|
||||||
|
if (key[i])
|
||||||
|
console.log(
|
||||||
|
key[i].codeName, '\t', (
|
||||||
|
key[i].description ? key[i].description : 'no description'
|
||||||
|
), (
|
||||||
|
keyComposition[i] ? '\t' + keyComposition[i] : ''
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
console.log('>> keyCode '+ ev.keycode +' was not recognized.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
@ -5,7 +5,7 @@ var keysym = require('keysym');
|
||||||
var ks = x11.keySyms;
|
var ks = x11.keySyms;
|
||||||
var ks2Name = {};
|
var ks2Name = {};
|
||||||
for (var key in ks)
|
for (var key in ks)
|
||||||
ks2Name[ ks[key] ] = key;
|
ks2Name[ ks[key].code ] = key;
|
||||||
var kk2Name = {};
|
var kk2Name = {};
|
||||||
|
|
||||||
x11.createClient(function(err, display) {
|
x11.createClient(function(err, display) {
|
||||||
|
|
|
||||||
|
|
@ -250,7 +250,7 @@ x11.createClient(function(err, display) {
|
||||||
var ks = x11.keySyms;
|
var ks = x11.keySyms;
|
||||||
var ks2Name = {};
|
var ks2Name = {};
|
||||||
for (var key in ks)
|
for (var key in ks)
|
||||||
ks2Name[ ks[key] ] = key;
|
ks2Name[ ks[key].code ] = key;
|
||||||
var kk2Name = {};
|
var kk2Name = {};
|
||||||
var min = display.min_keycode;
|
var min = display.min_keycode;
|
||||||
var max = display.max_keycode;
|
var max = display.max_keycode;
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,15 @@
|
||||||
var core = require('./xcore');
|
var core = require('./xcore');
|
||||||
var em = require('./eventmask').eventMask;
|
var em = require('./eventmask').eventMask;
|
||||||
var keysyms = require('./keysyms');
|
|
||||||
var server = require('./xserver');
|
var server = require('./xserver');
|
||||||
|
|
||||||
module.exports.createClient = core.createClient;
|
module.exports.createClient = core.createClient;
|
||||||
module.exports.createServer = server.createServer;
|
module.exports.createServer = server.createServer;
|
||||||
module.exports.eventMask = em;
|
module.exports.eventMask = em;
|
||||||
module.exports.keySyms = keysyms;
|
|
||||||
|
|
||||||
|
Object.defineProperty(module.exports, 'keySyms', {
|
||||||
|
enumerable: true,
|
||||||
|
get: function() { return require('./keysyms'); }
|
||||||
|
});
|
||||||
|
|
||||||
//TODO:
|
//TODO:
|
||||||
// keepe everything in namespace for consistensy (eventMask, keySyms, class, destination ...
|
// keepe everything in namespace for consistensy (eventMask, keySyms, class, destination ...
|
||||||
|
|
|
||||||
3506
lib/keysyms.js
3506
lib/keysyms.js
File diff suppressed because it is too large
Load diff
35
lib/keysyms.update.sh
Executable file
35
lib/keysyms.update.sh
Executable file
|
|
@ -0,0 +1,35 @@
|
||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
keysymdef_url=http://cgit.freedesktop.org/xorg/proto/xproto/plain/keysymdef.h
|
||||||
|
keysymdef=$(mktemp)
|
||||||
|
|
||||||
|
wget $keysymdef_url -O $keysymdef
|
||||||
|
|
||||||
|
(
|
||||||
|
echo "
|
||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\
|
||||||
|
|
||||||
|
This file is automatically translated from X.Org's xproto/keysymdef.h
|
||||||
|
Please, do not update this file with your hands, run $(basename "$0").
|
||||||
|
|
||||||
|
\\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
"
|
||||||
|
|
||||||
|
sed -r '
|
||||||
|
s/#ifdef\s+/\/\/ Group /
|
||||||
|
s/#endif.*//
|
||||||
|
s/#define\s+([^ ]+)(\s+)([^ ]+)\s*\/\*\s*([^\*]+[^ ])\s*\*\// \1:\2{ code: \3, description: "\4" },/
|
||||||
|
s/(\b)U\+([0-9A-F]+)(\b)/\1(\\u\2)\3/i
|
||||||
|
s/#define\s+([^ ]+)(\s+)([^ ]+)/ \1:\2{ code: \3, description: null },/
|
||||||
|
#s/#define\s+([^ ]+)(\s+[^ ]+)/ \1:\2,/
|
||||||
|
' $keysymdef
|
||||||
|
|
||||||
|
echo -n '
|
||||||
|
NoSymbol: 0
|
||||||
|
};'
|
||||||
|
|
||||||
|
) > "$(dirname "$0")/keysyms.js"
|
||||||
|
|
||||||
|
rm $keysymdef
|
||||||
Loading…
Reference in a new issue