70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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.');
 | |
|     }
 | |
|   });
 | |
| 
 | |
| });
 |