ConfigureWindow, CreateWindow and CreateGC now give good format size to buffer, fixed some tests

This commit is contained in:
champii 2014-09-06 07:51:32 +02:00
parent 3b6f692d54
commit 48f132b3fe
3 changed files with 215 additions and 148 deletions

View file

@ -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];
}
],

View file

@ -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;

View file

@ -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) {