mirror of
https://github.com/danbulant/node-x11
synced 2026-05-27 14:01:52 +00:00
ConfigureWindow, CreateWindow and CreateGC now give good format size to buffer, fixed some tests
This commit is contained in:
parent
3b6f692d54
commit
48f132b3fe
3 changed files with 215 additions and 148 deletions
350
lib/corereqs.js
350
lib/corereqs.js
|
|
@ -6,70 +6,207 @@ var hexy = require('./hexy').hexy;
|
||||||
|
|
||||||
var valueMask = {
|
var valueMask = {
|
||||||
CreateWindow: {
|
CreateWindow: {
|
||||||
backgroundPixmap: 0x00000001,
|
backgroundPixmap : {
|
||||||
backgroundPixel : 0x00000002,
|
mask: 0x00000001,
|
||||||
borderPixmap : 0x00000004,
|
format: 'L'
|
||||||
borderPixel : 0x00000008,
|
},
|
||||||
bitGravity : 0x00000010,
|
backgroundPixel : {
|
||||||
winGravity : 0x00000020,
|
mask: 0x00000002,
|
||||||
backingStore : 0x00000040,
|
format: 'L'
|
||||||
backingPlanes : 0x00000080,
|
},
|
||||||
backingPixel : 0x00000100,
|
borderPixmap : {
|
||||||
overrideRedirect: 0x00000200,
|
mask: 0x00000004,
|
||||||
saveUnder : 0x00000400,
|
format: 'L'
|
||||||
eventMask : 0x00000800,
|
},
|
||||||
doNotPropagateMask: 0x00001000,
|
borderPixel : {
|
||||||
colormap : 0x00002000,
|
mask: 0x00000008,
|
||||||
cursor : 0x00004000
|
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: {
|
CreateGC: {
|
||||||
'function' : 0x00000001, // TODO: alias? _function?
|
'function' : { // TODO: alias? _function?
|
||||||
planeMask : 0x00000002,
|
mask: 0x00000001,
|
||||||
foreground : 0x00000004,
|
format: 'C'
|
||||||
background : 0x00000008,
|
},
|
||||||
lineWidth : 0x00000010,
|
planeMask : {
|
||||||
lineStyle : 0x00000020,
|
mask: 0x00000002,
|
||||||
capStyle : 0x00000040,
|
format: 'L'
|
||||||
joinStyle : 0x00000080,
|
},
|
||||||
fillStyle : 0x00000100,
|
foreground : {
|
||||||
fillRule : 0x00000200,
|
mask: 0x00000004,
|
||||||
tile : 0x00000400,
|
format: 'L'
|
||||||
stipple : 0x00000800,
|
},
|
||||||
tileStippleXOrigin: 0x00001000,
|
background : {
|
||||||
tileStippleYOrigin: 0x00002000,
|
mask: 0x00000008,
|
||||||
font : 0x00004000,
|
format: 'L'
|
||||||
subwindowMode: 0x00008000,
|
},
|
||||||
graphicsExposures: 0x00010000,
|
lineWidth : {
|
||||||
clipXOrigin : 0x00020000,
|
mask: 0x00000010,
|
||||||
clipYOrigin : 0x00040000,
|
format: 'S'
|
||||||
clipMask : 0x00080000,
|
},
|
||||||
dashOffset : 0x00100000,
|
lineStyle : {
|
||||||
dashes : 0x00200000,
|
mask: 0x00000020,
|
||||||
arcMode : 0x00400000
|
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: {
|
ConfigureWindow: {
|
||||||
x: 0x000001,
|
x : {
|
||||||
y: 0x000002,
|
mask: 0x000001,
|
||||||
width: 0x000004,
|
format: 'sxx'
|
||||||
height: 0x000008,
|
},
|
||||||
borderWidth: 0x000010,
|
y : {
|
||||||
sibling: 0x000020,
|
mask: 0x000002,
|
||||||
stackMode: 0x000040
|
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 = {};
|
var valueMaskName = {};
|
||||||
for (var req in valueMask) {
|
for (var req in valueMask) {
|
||||||
var masks = valueMask[req];
|
var masks = valueMask[req];
|
||||||
var names = valueMaskName[req] = {};
|
var names = valueMaskName[req] = {};
|
||||||
for (var m in masks)
|
for (var m in masks)
|
||||||
names[masks[m]] = m;
|
names[masks[m].mask] = m;
|
||||||
}
|
}
|
||||||
|
|
||||||
function packValueMask(reqname, values)
|
function packValueMask(reqname, values)
|
||||||
{
|
{
|
||||||
var bitmask = 0;
|
var bitmask = 0;
|
||||||
var masksList = [];
|
var masksList = [];
|
||||||
|
var format = '';
|
||||||
var reqValueMask = valueMask[reqname];
|
var reqValueMask = valueMask[reqname];
|
||||||
var reqValueMaskName = valueMaskName[reqname];
|
var reqValueMaskName = valueMaskName[reqname];
|
||||||
|
|
||||||
|
|
@ -78,7 +215,7 @@ function packValueMask(reqname, values)
|
||||||
|
|
||||||
for (var v in values)
|
for (var v in values)
|
||||||
{
|
{
|
||||||
var valueBit = reqValueMask[v];
|
var valueBit = reqValueMask[v].mask;
|
||||||
if (!valueBit)
|
if (!valueBit)
|
||||||
throw new Error(reqname + ': incorrect value param ' + v);
|
throw new Error(reqname + ': incorrect value param ' + v);
|
||||||
masksList.push(valueBit);
|
masksList.push(valueBit);
|
||||||
|
|
@ -89,9 +226,10 @@ function packValueMask(reqname, values)
|
||||||
for (m in masksList)
|
for (m in masksList)
|
||||||
{
|
{
|
||||||
var valueName = reqValueMaskName[masksList[m]];
|
var valueName = reqValueMaskName[masksList[m]];
|
||||||
|
format += reqValueMask[valueName].format
|
||||||
args.push( values[valueName] );
|
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 packetLength = 8 + (values ? Object.keys(values).length : 0);
|
||||||
var format = 'CCSLLssSSSSLL';
|
var format = 'CCSLLssSSSSLL';
|
||||||
|
|
||||||
// create bitmask
|
|
||||||
var bitmask = 0;
|
|
||||||
// TODO: slice from function arguments?
|
// TODO: slice from function arguments?
|
||||||
var args = [1, depth, packetLength, id, parentId, x, y, width, height, borderWidth, _class, visual];
|
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
|
// 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
|
// 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
|
||||||
|
|
||||||
|
var vals = packValueMask('CreateWindow', values);
|
||||||
// TODO: replace with packValueMask
|
format += vals[0];
|
||||||
var masksList = [];
|
args.push(vals[1]);
|
||||||
for (var v in values)
|
args = args.concat(vals[2]);
|
||||||
{
|
|
||||||
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] );
|
|
||||||
}
|
|
||||||
return [format, args];
|
return [format, args];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -181,13 +295,10 @@ var templates = {
|
||||||
var format = 'CxSLL';
|
var format = 'CxSLL';
|
||||||
var packetLength = 3 + (values ? Object.keys(values).length : 0);
|
var packetLength = 3 + (values ? Object.keys(values).length : 0);
|
||||||
var vals = packValueMask('CreateWindow', values);
|
var vals = packValueMask('CreateWindow', values);
|
||||||
var args = [2, packetLength, wid, vals[0]];
|
var args = [2, packetLength, wid, vals[1]];
|
||||||
var valArr = vals[1];
|
var valArr = vals[2];
|
||||||
for (var v in valArr)
|
format += vals[0];
|
||||||
{
|
args = args.concat(valArr);
|
||||||
format += 'L';
|
|
||||||
args.push(valArr[v]);
|
|
||||||
}
|
|
||||||
return [format, args];
|
return [format, args];
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
@ -248,60 +359,13 @@ var templates = {
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
function(win, options) {
|
function(win, options) {
|
||||||
var format = 'CxSLSxx';
|
var vals = packValueMask('ConfigureWindow', options);
|
||||||
var n = 3;
|
var format = 'CxSLL' + vals[0];
|
||||||
var mask = 0;
|
var params = [12, Object.keys(options).length + 3, win, vals[1]];
|
||||||
var params = [];
|
|
||||||
if (options.x !== undefined) {
|
|
||||||
mask |= valueMask.ConfigureWindow.x;
|
|
||||||
format += 'sxx';
|
|
||||||
params.push(options.x);
|
|
||||||
++ n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.y !== undefined) {
|
params = params.concat(vals[2]);
|
||||||
mask |= valueMask.ConfigureWindow.y;
|
|
||||||
format += 'sxx';
|
|
||||||
params.push(options.y);
|
|
||||||
++ n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.width !== undefined) {
|
return [format, params];
|
||||||
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)];
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
@ -671,13 +735,15 @@ var templates = {
|
||||||
var packetLength = 4 + (values ? Object.keys(values).length : 0);
|
var packetLength = 4 + (values ? Object.keys(values).length : 0);
|
||||||
var args = [55, packetLength, cid, drawable];
|
var args = [55, packetLength, cid, drawable];
|
||||||
var vals = packValueMask('CreateGC', values);
|
var vals = packValueMask('CreateGC', values);
|
||||||
args.push(vals[0]); // values bitmask
|
format += vals[0]
|
||||||
var valArr = vals[1];
|
args.push(vals[1]); // values bitmask
|
||||||
for (var v in valArr)
|
args = args.concat(vals[2])
|
||||||
{
|
// var valArr = vals[2];
|
||||||
format += 'L'; // TODO: we know format string length in advance and += inefficient for string
|
// for (var v in valArr)
|
||||||
args.push(valArr[v]);
|
// {
|
||||||
}
|
// format += 'L'; // TODO: we know format string length in advance and += inefficient for string
|
||||||
|
// args.push(valArr[v]);
|
||||||
|
// }
|
||||||
return [format, args];
|
return [format, args];
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -592,7 +592,6 @@ module.exports.createClient = function(options, initCb)
|
||||||
client.on('connect', function(display) {
|
client.on('connect', function(display) {
|
||||||
// opt-in BigReq
|
// opt-in BigReq
|
||||||
if (!options.disableBigRequests) {
|
if (!options.disableBigRequests) {
|
||||||
console.log('Enable Big Requests')
|
|
||||||
client.require('big-requests', function(BigReq) {
|
client.require('big-requests', function(BigReq) {
|
||||||
BigReq.Enable(function(err, maxLen) {
|
BigReq.Enable(function(err, maxLen) {
|
||||||
display.max_request_length = maxLen;
|
display.max_request_length = maxLen;
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
it('should ResizeWindow correctly to 200x300 pixels', function(done) {
|
||||||
var self = this;
|
var self = this;
|
||||||
this.X.ResizeWindow(this.wid, 200, 300);
|
|
||||||
this.X.once('event', function(ev) {
|
this.X.once('event', function(ev) {
|
||||||
ev.type.should.equal(22); /* ConfigureNotify */
|
ev.type.should.equal(22); /* ConfigureNotify */
|
||||||
ev.height.should.equal(300);
|
ev.height.should.equal(300);
|
||||||
ev.width.should.equal(200);
|
ev.width.should.equal(200);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
this.X.ResizeWindow(this.wid, 200, 300);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should MoveWindow correctly to x: 100, y: 150 pixels', function(done) {
|
it('should MoveWindow correctly to x: 100, y: 150 pixels', function(done) {
|
||||||
var self = this;
|
var self = this;
|
||||||
this.X.MoveWindow(this.wid, 100, 150);
|
|
||||||
this.X.once('event', function(ev) {
|
this.X.once('event', function(ev) {
|
||||||
ev.type.should.equal(22); /* ConfigureNotify */
|
ev.type.should.equal(22); /* ConfigureNotify */
|
||||||
ev.x.should.equal(100);
|
ev.x.should.equal(100);
|
||||||
ev.y.should.equal(150);
|
ev.y.should.equal(150);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
this.X.MoveWindow(this.wid, 100, 150);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should MoveResizeWindow correctly to x: 200, y: 250 and 500x100 pixels', function(done) {
|
it('should MoveResizeWindow correctly to x: 200, y: 250 and 500x100 pixels', function(done) {
|
||||||
var self = this;
|
var self = this;
|
||||||
this.X.MoveResizeWindow(this.wid, 200, 250, 500, 100);
|
|
||||||
this.X.once('event', function(ev) {
|
this.X.once('event', function(ev) {
|
||||||
ev.type.should.equal(22); /* ConfigureNotify */
|
ev.type.should.equal(22); /* ConfigureNotify */
|
||||||
ev.x.should.equal(200);
|
ev.x.should.equal(200);
|
||||||
|
|
@ -58,16 +59,17 @@ describe('ConfigureWindow', function() {
|
||||||
ev.width.should.equal(500);
|
ev.width.should.equal(500);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
this.X.MoveResizeWindow(this.wid, 200, 250, 500, 100);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should RaiseWindow correctly', function(done) {
|
it('should RaiseWindow correctly', function(done) {
|
||||||
var self = this;
|
var self = this;
|
||||||
this.X.RaiseWindow(this.wid);
|
|
||||||
this.X.once('event', function(ev) {
|
this.X.once('event', function(ev) {
|
||||||
ev.type.should.equal(22); /* ConfigureNotify */
|
ev.type.should.equal(22); /* ConfigureNotify */
|
||||||
ev.aboveSibling.should.equal(self.wid_helper);
|
ev.aboveSibling.should.equal(self.wid_helper);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
this.X.RaiseWindow(this.wid);
|
||||||
});
|
});
|
||||||
|
|
||||||
after(function(done) {
|
after(function(done) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue