diff --git a/lib/x11/ext/xtest.js b/lib/x11/ext/xtest.js new file mode 100644 index 0000000..e686613 --- /dev/null +++ b/lib/x11/ext/xtest.js @@ -0,0 +1,44 @@ +// http://www.x.org/releases/X11R7.6/doc/xextproto/xtest.pdf + +var x11 = require('..'); +// TODO: move to templates +exports.requireExt = function(display, callback) +{ + var X = display.client; + X.QueryExtension('XTEST', function(ext) { + + if (!ext.present) + callback(new Error('extension not available')); + + ext.QueryVersion = function(clientMaj, clientMin, callback) + { + X.seq_num++; + X.pack_stream.pack('CCSLL', [ext.majorOpcode, 0, 3, clientMaj, clientMin]); + X.replies[X.seq_num] = [ + function(buf, opt) { + var res = buf.unpack('LL'); + return res; + }, + callback + ]; + X.pack_stream.flush(); + } + + ext.KeyPress = 2; + ext.KeyRelease = 3; + ext.ButtonPress = 4; + ext.ButtonRelease = 5; + ext.MotionNotify = 6; + + ext.FakeInput = function( type, keycode, time, wid, x, y ) + { + X.seq_num++; + console.log([X.seq_num, 'CCSCCxxLLxxxxxxxxssxxxxxxxx', [ext.majorOpcode, 2, 9, type, keycode, time, wid, x, y]]); + X.pack_stream.pack('CCSCCxxLLxxxxxxxxssxxxxxxxx', [ext.majorOpcode, 2, 9, type, keycode, time, wid, x, y]); + X.pack_stream.flush(); + } + + callback(ext); + }); +} + diff --git a/test/xtesttest.js b/test/xtesttest.js new file mode 100644 index 0000000..67faac5 --- /dev/null +++ b/test/xtesttest.js @@ -0,0 +1,15 @@ +var x11 = require('../lib/x11'); + +var xclient = x11.createClient(function(display) { + var X = display.client; + var root = display.screen[0].root; + display.client.require('xtest', function(Test) { + console.log(Test); + setInterval(function() { + Test.FakeInput(Test.KeyPress, 65, 0, root, 0, 0); // space + Test.FakeInput(Test.KeyRelease, 65, 0, root, 0, 0); // space + console.log('click'); + }, 1000); + }); + display.client.on('error', function(err) { console.log(err); }); +});