diff --git a/lib/ext/fixes.js b/lib/ext/fixes.js index 6152b72..c6711b3 100644 --- a/lib/ext/fixes.js +++ b/lib/ext/fixes.js @@ -3,6 +3,19 @@ var x11 = require('..'); // TODO: move to templates +function parse_rectangle(buf, pos) { + if (!pos) { + pos = 0; + } + + return { + x : buf[pos], + y : buf[pos + 1], + width : buf[pos + 2], + height : buf[pos + 3] + } +} + exports.requireExt = function(display, callback) { var X = display.client; @@ -35,6 +48,66 @@ exports.requireExt = function(display, callback) X.pack_stream.flush(); }; + ext.CreateRegion = function(region, rects) { + X.seq_num ++; + var format = 'CCSL'; + format += Array(rects.length + 1).join('ssSS'); + var args = [ ext.majorOpcode, 5, 2 + (rects.length << 1), region ]; + rects.forEach(function(rect) { + args.push(rect.x); + args.push(rect.y); + args.push(rect.width); + args.push(rect.height); + }); + + X.pack_stream.pack(format, args); + X.pack_stream.flush(); + } + + ext.DestroyRegion = function(region) { + X.seq_num ++; + X.pack_stream.pack('CCSL', [ ext.majorOpcode, 10, 2, region ]); + X.pack_stream.flush(); + } + + ext.UnionRegion = function(src1, src2, dst) { + X.seq_num ++; + X.pack_stream.pack('CCSLLL', [ ext.majorOpcode, 13, 4, src1, src2, dst ]); + X.pack_stream.flush(); + } + + ext.TranslateRegion = function(region, dx, dy) { + X.seq_num ++; + X.pack_stream.pack('CCSLss', [ ext.majorOpcode, 17, 3, region, dx, dy ]); + X.pack_stream.flush(); + } + + ext.FetchRegion = function(region, cb) { + X.seq_num ++; + X.pack_stream.pack('CCSL', [ ext.majorOpcode, 19, 2, region ]); + X.replies[X.seq_num] = [ + function(buf, opt) { + var n_rectangles = (buf.length - 24) >> 3; + var format = 'ssSSxxxxxxxxxxxxxxxx'; + format += Array(n_rectangles + 1).join('ssSS'); + var res = buf.unpack(format); + var reg = { + extents : parse_rectangle(res), + rectangles : [] + }; + + for (var i = 0; i < n_rectangles; ++ i) { + reg.rectangles.push(parse_rectangle(res, 4 + (i << 2))); + } + + return reg; + }, + cb + ]; + + X.pack_stream.flush(); + } + ext.QueryVersion(5, 0, function(err, vers) { ext.major = vers[0]; ext.minor = vers[1];