From 27c70c73155a6bf44e5b02ca6d3978347b56cdde Mon Sep 17 00:00:00 2001 From: plehmkuhl Date: Tue, 2 Feb 2016 16:26:41 +0100 Subject: [PATCH 1/3] Reads nessage_type from ClientMessage. See: https://tronche.com/gui/x/xlib/events/client-communication/client-message.html --- lib/xcore.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/xcore.js b/lib/xcore.js index 350b270..3d32752 100644 --- a/lib/xcore.js +++ b/lib/xcore.js @@ -404,6 +404,7 @@ XClient.prototype.unpackEvent = function(type, seq, extra, code, raw, headerBuf) event.name = 'ClientMessage'; event.format = code; event.wid = extra; + event.message_type = raw.unpack('L'); var format = (code === 32) ? 'LLLLL' : (code === 16) ? 'SSSSSSSSSS' : 'CCCCCCCCCCCCCCCCCCCC'; event.data = raw.unpack(format, 4); } else if (type == 34) { From 4fd03859110b14a3305919e4f17d43ec6935951e Mon Sep 17 00:00:00 2001 From: plehmkuhl Date: Wed, 3 Feb 2016 11:08:58 +0100 Subject: [PATCH 2/3] Fixed datatype returned by message_type on ClientMessage event. Added Testcase. --- lib/xcore.js | 2 +- test/client-message.js | 121 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 test/client-message.js diff --git a/lib/xcore.js b/lib/xcore.js index 3d32752..f4744a7 100644 --- a/lib/xcore.js +++ b/lib/xcore.js @@ -404,7 +404,7 @@ XClient.prototype.unpackEvent = function(type, seq, extra, code, raw, headerBuf) event.name = 'ClientMessage'; event.format = code; event.wid = extra; - event.message_type = raw.unpack('L'); + event.message_type = raw.unpack('L')[0]; var format = (code === 32) ? 'LLLLL' : (code === 16) ? 'SSSSSSSSSS' : 'CCCCCCCCCCCCCCCCCCCC'; event.data = raw.unpack(format, 4); } else if (type == 34) { diff --git a/test/client-message.js b/test/client-message.js new file mode 100644 index 0000000..33d0d19 --- /dev/null +++ b/test/client-message.js @@ -0,0 +1,121 @@ +var x11 = require('../lib'); +var UnpackStream = require('../lib/unpackstream.js'); +var should = require('should'); + +//Used Atoms +var ATOM = {}; + +describe('ClientMessage', function() { + before(function(done) { + var self = this; + var client = x11.createClient(function(err, dpy) { + should.not.exist(err); + self.X = dpy.client; + self.wid = self.X.AllocID(); + self.X.CreateWindow(self.wid, dpy.screen[0].root, 0, 0, 1, 1); // 1x1 pixel window + + //Ugly but works for now + self.X.InternAtom(false, 'TEST_ATOM_1', function(err, atom) { + should.not.exist(err); + ATOM['TEST_ATOM_1'] = atom; + + self.X.InternAtom(false, 'TEST_ATOM_2', function(err, atom) { + should.not.exist(err); + ATOM['TEST_ATOM_2'] = atom; + done(); + }); + }); + }); + + client.on('error', function (err) { + console.error('Error : ', err); + }); + }); + + it('should receive client message with format=8', function(done) { + var self = this; + + var client = x11.createClient(function(err, dpy) { + should.not.exist(err); + self.X.once('event', function(ev) { + ev.name.should.equal('ClientMessage'); + ev.wid.should.equal(self.wid); + ev.message_type.should.equal(ATOM.TEST_ATOM_1); + ev.data.should.be.an.Array(); + ev.data.length.should.equal(20); + done(); + }); + + var X = dpy.client; + var eventData = new Buffer(32); + eventData.writeInt8(33, 0); //Event Type 33 = ClientMessage + eventData.writeInt8(8, 1); //Format + eventData.writeInt32LE(self.wid, 4); //Window ID + eventData.writeInt32LE(ATOM.TEST_ATOM_1, 8); //Message Type + + X.SendEvent(self.wid, false, 0, eventData); + }); + + client.on('error', done); + }); + + it('should receive client message with format=16', function(done) { + var self = this; + + var client = x11.createClient(function(err, dpy) { + should.not.exist(err); + self.X.once('event', function(ev) { + ev.name.should.equal('ClientMessage'); + ev.wid.should.equal(self.wid); + ev.message_type.should.equal(ATOM.TEST_ATOM_1); + ev.data.should.be.an.Array(); + ev.data.length.should.equal(10); + done(); + }); + + var X = dpy.client; + var eventData = new Buffer(32); + eventData.writeInt8(33, 0); //Event Type 33 = ClientMessage + eventData.writeInt8(16, 1); //Format + eventData.writeInt32LE(self.wid, 4); //Window ID + eventData.writeInt32LE(ATOM.TEST_ATOM_1, 8); //Message Type + + X.SendEvent(self.wid, false, 0, eventData); + }); + + client.on('error', done); + }); + + it('should receive client message with format=32', function(done) { + var self = this; + + var client = x11.createClient(function(err, dpy) { + should.not.exist(err); + self.X.once('event', function(ev) { + ev.name.should.equal('ClientMessage'); + ev.wid.should.equal(self.wid); + ev.message_type.should.equal(ATOM.TEST_ATOM_1); + ev.data.should.be.an.Array(); + ev.data.length.should.equal(5); + done(); + }); + + var X = dpy.client; + var eventData = new Buffer(32); + eventData.writeInt8(33, 0); //Event Type 33 = ClientMessage + eventData.writeInt8(32, 1); //Format + eventData.writeInt32LE(self.wid, 4); //Window ID + eventData.writeInt32LE(ATOM.TEST_ATOM_1, 8); //Message Type + + X.SendEvent(self.wid, false, 0, eventData); + }); + + client.on('error', done); + }); + + after(function(done) { + this.X.DestroyWindow(this.wid); + this.X.on('end', done); + this.X.terminate(); + }); +}); From d327261c749da6f3f387abf63f8f51c0c054515e Mon Sep 17 00:00:00 2001 From: plehmkuhl Date: Wed, 3 Feb 2016 11:42:32 +0100 Subject: [PATCH 3/3] Adjusted testcase "client-message.js" to match other tests. --- test/client-message.js | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/test/client-message.js b/test/client-message.js index 33d0d19..f9bcc10 100644 --- a/test/client-message.js +++ b/test/client-message.js @@ -14,22 +14,15 @@ describe('ClientMessage', function() { self.wid = self.X.AllocID(); self.X.CreateWindow(self.wid, dpy.screen[0].root, 0, 0, 1, 1); // 1x1 pixel window - //Ugly but works for now self.X.InternAtom(false, 'TEST_ATOM_1', function(err, atom) { should.not.exist(err); ATOM['TEST_ATOM_1'] = atom; - self.X.InternAtom(false, 'TEST_ATOM_2', function(err, atom) { - should.not.exist(err); - ATOM['TEST_ATOM_2'] = atom; - done(); - }); + done(); }); }); - client.on('error', function (err) { - console.error('Error : ', err); - }); + client.on('error', done); }); it('should receive client message with format=8', function(done) {