143 lines
3.8 KiB
JavaScript
143 lines
3.8 KiB
JavaScript
// http://www.x.org/releases/X11R7.6/doc/xextproto/shape.pdf
|
|
|
|
var x11 = Require('x11/core/x11');
|
|
// TODO: move to templates
|
|
|
|
exports.requireExt = function(display, callback)
|
|
{
|
|
function captureStack()
|
|
{
|
|
var err = new Error;
|
|
//err.name = reqName;
|
|
Error.captureStackTrace(err, arguments.callee);
|
|
display.client.seq2stack[display.client.seq_num] = err.stack;
|
|
}
|
|
|
|
var X = display.client;
|
|
X.QueryExtension('SHAPE', function(err, ext) {
|
|
|
|
if (!ext.present)
|
|
return callback(new Error('extension not available'));
|
|
|
|
ext.Kind = {
|
|
Bounding: 0,
|
|
Clip: 1,
|
|
Input: 2
|
|
};
|
|
|
|
ext.Op = {
|
|
Set: 0,
|
|
Union: 1,
|
|
Intersect: 2,
|
|
Subtract: 3,
|
|
Invert: 4
|
|
};
|
|
|
|
ext.Ordering = {
|
|
Unsorted: 0,
|
|
YSorted: 1,
|
|
YXSorted: 2,
|
|
YXBanded: 3
|
|
};
|
|
|
|
ext.QueryVersion = function(cb)
|
|
{
|
|
X.seq_num++;
|
|
// captureStack();
|
|
X.pack_stream.pack('CCSLL', [ext.majorOpcode, 0, 1]);
|
|
X.replies[X.seq_num] = [
|
|
function(buf, opt) {
|
|
var res = buf.unpack('SS');
|
|
return res;
|
|
},
|
|
cb
|
|
];
|
|
X.pack_stream.flush();
|
|
}
|
|
|
|
// Accepts rectangles as [[x, y, width, height]]
|
|
ext.Rectangles = function( op, kind, window, x, y, rectangles, ordering /* = Ordering.Unsorted */ )
|
|
{
|
|
if (ordering === undefined)
|
|
ordering = ext.Ordering.Unsorted;
|
|
|
|
var length = 4 + rectangles.length * 2;
|
|
|
|
X.seq_num++;
|
|
// captureStack();
|
|
X.pack_stream.pack('CCSCCCxLss', [ext.majorOpcode, 1, length, op, kind, ordering, window, x, y]);
|
|
for (var i = 0; i < rectangles.length; ++i) {
|
|
var r = rectangles[i];
|
|
X.pack_stream.pack('ssSS', r);
|
|
}
|
|
X.pack_stream.flush();
|
|
}
|
|
|
|
ext.Mask = function( op, kind, window, x, y, bitmap )
|
|
{
|
|
X.seq_num++;
|
|
// captureStack();
|
|
X.pack_stream.pack('CCSCCxxLssL', [ext.majorOpcode, 2, 5, op, kind, window, x, y, bitmap]);
|
|
X.pack_stream.flush();
|
|
}
|
|
|
|
ext.SelectInput = function( window, enable )
|
|
{
|
|
X.seq_num++;
|
|
// captureStack();
|
|
X.pack_stream.pack('CCSLCxxx', [ext.majorOpcode, 6, 3, window, enable ]);
|
|
X.pack_stream.flush();
|
|
}
|
|
|
|
ext.InputSelected = function( window, cb )
|
|
{
|
|
X.seq_num++;
|
|
// captureStack();
|
|
X.pack_stream.pack('CCSL', [ext.majorOpcode, 7, 2, window ]);
|
|
X.replies[X.seq_num] = [
|
|
function(buf, opt) {
|
|
return opt;
|
|
},
|
|
cb
|
|
];
|
|
X.pack_stream.flush();
|
|
}
|
|
|
|
callback(null, ext);
|
|
|
|
/*
|
|
ext.QueryVersion(function(err, version) {
|
|
ext.major = version[0];
|
|
ext.minor = version[1];
|
|
callback(null, ext);
|
|
});
|
|
*/
|
|
|
|
ext.events = {
|
|
ShapeNotify: 0
|
|
}
|
|
|
|
X.eventParsers[ext.firstEvent + ext.events.ShapeNotify] = function(type, seq, extra, code, raw)
|
|
{
|
|
var event = {};
|
|
event.type = type;
|
|
event.kind = code;
|
|
event.seq = seq;
|
|
|
|
event.window = extra;
|
|
|
|
var values = raw.unpack('ssSSLC');
|
|
|
|
event.x = values[0];
|
|
event.y = values[1];
|
|
event.width = values[2];
|
|
event.height = values[3];
|
|
event.time = values[4];
|
|
event.shaped = values[5];
|
|
event.name = 'ShapeNotify';
|
|
|
|
return event;
|
|
};
|
|
});
|
|
}
|