From 48f132b3febee7ebfbd18971d16818b01bbb7a4c Mon Sep 17 00:00:00 2001 From: champii Date: Sat, 6 Sep 2014 07:51:32 +0200 Subject: [PATCH] ConfigureWindow, CreateWindow and CreateGC now give good format size to buffer, fixed some tests --- lib/corereqs.js | 350 +++++++++++++++++++++++---------------- lib/xcore.js | 1 - test/configure-window.js | 12 +- 3 files changed, 215 insertions(+), 148 deletions(-) diff --git a/lib/corereqs.js b/lib/corereqs.js index b798f9a..550c482 100644 --- a/lib/corereqs.js +++ b/lib/corereqs.js @@ -6,70 +6,207 @@ var hexy = require('./hexy').hexy; var valueMask = { CreateWindow: { - backgroundPixmap: 0x00000001, - backgroundPixel : 0x00000002, - borderPixmap : 0x00000004, - borderPixel : 0x00000008, - bitGravity : 0x00000010, - winGravity : 0x00000020, - backingStore : 0x00000040, - backingPlanes : 0x00000080, - backingPixel : 0x00000100, - overrideRedirect: 0x00000200, - saveUnder : 0x00000400, - eventMask : 0x00000800, - doNotPropagateMask: 0x00001000, - colormap : 0x00002000, - cursor : 0x00004000 + backgroundPixmap : { + mask: 0x00000001, + format: 'L' + }, + backgroundPixel : { + mask: 0x00000002, + format: 'L' + }, + borderPixmap : { + mask: 0x00000004, + format: 'L' + }, + borderPixel : { + mask: 0x00000008, + format: 'L' + }, + bitGravity : { + mask: 0x00000010, + format: 'C' + }, + winGravity : { + mask: 0x00000020, + format: 'C' + }, + backingStore : { + mask: 0x00000040, + format: 'C' + }, + backingPlanes : { + mask: 0x00000080, + format: 'L' + }, + backingPixel : { + mask: 0x00000100, + format: 'L' + }, + overrideRedirect : { + mask: 0x00000200, + format: 'C' + }, + saveUnder : { + mask: 0x00000400, + format: 'C' + }, + eventMask : { + mask: 0x00000800, + format: 'L' + }, + doNotPropagateMask : { + mask: 0x00001000, + format: 'L' + }, + colormap : { + mask: 0x00002000, + format: 'L' + }, + cursor : { + mask: 0x00004000, + format: 'L' + } }, CreateGC: { - 'function' : 0x00000001, // TODO: alias? _function? - planeMask : 0x00000002, - foreground : 0x00000004, - background : 0x00000008, - lineWidth : 0x00000010, - lineStyle : 0x00000020, - capStyle : 0x00000040, - joinStyle : 0x00000080, - fillStyle : 0x00000100, - fillRule : 0x00000200, - tile : 0x00000400, - stipple : 0x00000800, - tileStippleXOrigin: 0x00001000, - tileStippleYOrigin: 0x00002000, - font : 0x00004000, - subwindowMode: 0x00008000, - graphicsExposures: 0x00010000, - clipXOrigin : 0x00020000, - clipYOrigin : 0x00040000, - clipMask : 0x00080000, - dashOffset : 0x00100000, - dashes : 0x00200000, - arcMode : 0x00400000 + 'function' : { // TODO: alias? _function? + mask: 0x00000001, + format: 'C' + }, + planeMask : { + mask: 0x00000002, + format: 'L' + }, + foreground : { + mask: 0x00000004, + format: 'L' + }, + background : { + mask: 0x00000008, + format: 'L' + }, + lineWidth : { + mask: 0x00000010, + format: 'S' + }, + lineStyle : { + mask: 0x00000020, + format: 'C' + }, + capStyle : { + mask: 0x00000040, + format: 'C' + }, + joinStyle : { + mask: 0x00000080, + format: 'C' + }, + fillStyle : { + mask: 0x00000100, + format: 'C' + }, + fillRule : { + mask: 0x00000200, + format: 'C' + }, + tile : { + mask: 0x00000400, + format: 'L' + }, + stipple : { + mask: 0x00000800, + format: 'L' + }, + tileStippleXOrigin : { + mask: 0x00001000, + format: 's' + }, + tileStippleYOrigin : { + mask: 0x00002000, + format: 's' + }, + font : { + mask: 0x00004000, + format: 'L' + }, + subwindowMode : { + mask: 0x00008000, + format: 'C' + }, + graphicsExposures : { + mask: 0x00010000, + format: 'C' + }, + clipXOrigin : { + mask: 0x00020000, + format: 'S' + }, + clipYOrigin : { + mask: 0x00040000, + format: 'S' + }, + clipMask : { + mask: 0x00080000, + format: 'L' + }, + dashOffset : { + mask: 0x00100000, + format: 'S' + }, + dashes : { + mask: 0x00200000, + format: 'C' + }, + arcMode : { + mask: 0x00400000, + format: 'C' + } }, ConfigureWindow: { - x: 0x000001, - y: 0x000002, - width: 0x000004, - height: 0x000008, - borderWidth: 0x000010, - sibling: 0x000020, - stackMode: 0x000040 + x : { + mask: 0x000001, + format: 'sxx' + }, + y : { + mask: 0x000002, + format: 'sxx' + }, + width : { + mask: 0x000004, + format: 'Sxx' + }, + height : { + mask: 0x000008, + format: 'Sxx' + }, + borderWidth : { + mask: 0x000010, + format: 'Sxx' + }, + sibling : { + mask: 0x000020, + format: 'L' + }, + stackMode : { + mask: 0x000040, + format: 'Cxx' + } } }; + var valueMaskName = {}; for (var req in valueMask) { var masks = valueMask[req]; var names = valueMaskName[req] = {}; for (var m in masks) - names[masks[m]] = m; + names[masks[m].mask] = m; } function packValueMask(reqname, values) { var bitmask = 0; var masksList = []; + var format = ''; var reqValueMask = valueMask[reqname]; var reqValueMaskName = valueMaskName[reqname]; @@ -78,7 +215,7 @@ function packValueMask(reqname, values) for (var v in values) { - var valueBit = reqValueMask[v]; + var valueBit = reqValueMask[v].mask; if (!valueBit) throw new Error(reqname + ': incorrect value param ' + v); masksList.push(valueBit); @@ -89,9 +226,10 @@ function packValueMask(reqname, values) for (m in masksList) { var valueName = reqValueMaskName[masksList[m]]; + format += reqValueMask[valueName].format args.push( values[valueName] ); } - return [bitmask, args] + return [format, bitmask, args] } /* @@ -135,8 +273,6 @@ var templates = { var packetLength = 8 + (values ? Object.keys(values).length : 0); var format = 'CCSLLssSSSSLL'; - // create bitmask - var bitmask = 0; // TODO: slice from function arguments? var args = [1, depth, packetLength, id, parentId, x, y, width, height, borderWidth, _class, visual]; @@ -145,32 +281,10 @@ var templates = { // bitmask (bytes #24 to #31 in the packet) - 32 bit indicating what adittional arguments we supply // values list (bytes #32 .. #32+4*num_values) in order of corresponding bits TODO: it's actually not 4*num. Some values are 4b ytes, some - 1 byte - - // TODO: replace with packValueMask - var masksList = []; - for (var v in values) - { - var valueBit = valueMask['CreateWindow'][v]; - if (!valueBit) - { - throw new Error('CreateWindow: incorrect value param ' + v); - } - masksList.push(valueBit); - bitmask |= valueBit; - format += 'L'; // TODO: not all values are 4 bytes CARD32!!! - } - // values packed in order of corresponding bit - masksList.sort(); - // set bits to indicate additional values we are sending in this request - args.push(bitmask); - - // add values in the order of the bits - // TODO: maybe it's better just to scan all 32 bits anstead of sorting parameters we are actually have? - for (var m in masksList) - { - var valueName = valueMaskName['CreateWindow'][masksList[m]]; - args.push( values[valueName] ); - } + var vals = packValueMask('CreateWindow', values); + format += vals[0]; + args.push(vals[1]); + args = args.concat(vals[2]); return [format, args]; } @@ -181,13 +295,10 @@ var templates = { var format = 'CxSLL'; var packetLength = 3 + (values ? Object.keys(values).length : 0); var vals = packValueMask('CreateWindow', values); - var args = [2, packetLength, wid, vals[0]]; - var valArr = vals[1]; - for (var v in valArr) - { - format += 'L'; - args.push(valArr[v]); - } + var args = [2, packetLength, wid, vals[1]]; + var valArr = vals[2]; + format += vals[0]; + args = args.concat(valArr); return [format, args]; } ], @@ -248,60 +359,13 @@ var templates = { * } */ function(win, options) { - var format = 'CxSLSxx'; - var n = 3; - var mask = 0; - var params = []; - if (options.x !== undefined) { - mask |= valueMask.ConfigureWindow.x; - format += 'sxx'; - params.push(options.x); - ++ n; - } + var vals = packValueMask('ConfigureWindow', options); + var format = 'CxSLL' + vals[0]; + var params = [12, Object.keys(options).length + 3, win, vals[1]]; - if (options.y !== undefined) { - mask |= valueMask.ConfigureWindow.y; - format += 'sxx'; - params.push(options.y); - ++ n; - } + params = params.concat(vals[2]); - if (options.width !== undefined) { - mask |= valueMask.ConfigureWindow.width; - format += 'Sxx'; - params.push(options.width); - ++ n; - } - - if (options.height !== undefined) { - mask |= valueMask.ConfigureWindow.height; - format += 'Sxx'; - params.push(options.height); - ++ n; - } - - if (options.borderWidth !== undefined) { - mask |= valueMask.ConfigureWindow.borderWidth; - format += 'Sxx'; - params.push(options.borderWidth); - ++ n; - } - - if (options.sibling !== undefined) { - mask |= valueMask.ConfigureWindow.sibling; - format += 'L'; - params.push(options.sibling); - ++ n; - } - - if (options.stackMode !== undefined) { - mask |= valueMask.ConfigureWindow.stackMode; - format += 'Cxxx'; - params.push(options.stackMode); - ++ n; - } - - return [format, [12, n, win, mask].concat(params)]; + return [format, params]; } ], @@ -671,13 +735,15 @@ var templates = { var packetLength = 4 + (values ? Object.keys(values).length : 0); var args = [55, packetLength, cid, drawable]; var vals = packValueMask('CreateGC', values); - args.push(vals[0]); // values bitmask - var valArr = vals[1]; - for (var v in valArr) - { - format += 'L'; // TODO: we know format string length in advance and += inefficient for string - args.push(valArr[v]); - } + format += vals[0] + args.push(vals[1]); // values bitmask + args = args.concat(vals[2]) + // var valArr = vals[2]; + // for (var v in valArr) + // { + // format += 'L'; // TODO: we know format string length in advance and += inefficient for string + // args.push(valArr[v]); + // } return [format, args]; } ], diff --git a/lib/xcore.js b/lib/xcore.js index 6ccfefe..97e3fdd 100644 --- a/lib/xcore.js +++ b/lib/xcore.js @@ -592,7 +592,6 @@ module.exports.createClient = function(options, initCb) client.on('connect', function(display) { // opt-in BigReq if (!options.disableBigRequests) { - console.log('Enable Big Requests') client.require('big-requests', function(BigReq) { BigReq.Enable(function(err, maxLen) { display.max_request_length = maxLen; diff --git a/test/configure-window.js b/test/configure-window.js index cc6c9f7..c65c819 100644 --- a/test/configure-window.js +++ b/test/configure-window.js @@ -22,34 +22,35 @@ describe('ConfigureWindow', function() { }); }); - client.on('error', done); + client.on('error', function (err) { + console.error('Error : ', err); + }); }); it('should ResizeWindow correctly to 200x300 pixels', function(done) { var self = this; - this.X.ResizeWindow(this.wid, 200, 300); this.X.once('event', function(ev) { ev.type.should.equal(22); /* ConfigureNotify */ ev.height.should.equal(300); ev.width.should.equal(200); done(); }); + this.X.ResizeWindow(this.wid, 200, 300); }); it('should MoveWindow correctly to x: 100, y: 150 pixels', function(done) { var self = this; - this.X.MoveWindow(this.wid, 100, 150); this.X.once('event', function(ev) { ev.type.should.equal(22); /* ConfigureNotify */ ev.x.should.equal(100); ev.y.should.equal(150); done(); }); + this.X.MoveWindow(this.wid, 100, 150); }); it('should MoveResizeWindow correctly to x: 200, y: 250 and 500x100 pixels', function(done) { var self = this; - this.X.MoveResizeWindow(this.wid, 200, 250, 500, 100); this.X.once('event', function(ev) { ev.type.should.equal(22); /* ConfigureNotify */ ev.x.should.equal(200); @@ -58,16 +59,17 @@ describe('ConfigureWindow', function() { ev.width.should.equal(500); done(); }); + this.X.MoveResizeWindow(this.wid, 200, 250, 500, 100); }); it('should RaiseWindow correctly', function(done) { var self = this; - this.X.RaiseWindow(this.wid); this.X.once('event', function(ev) { ev.type.should.equal(22); /* ConfigureNotify */ ev.aboveSibling.should.equal(self.wid_helper); done(); }); + this.X.RaiseWindow(this.wid); }); after(function(done) {