diff --git a/js/x11/core/examples/screenshot.js b/js/x11/core/examples/screenshot.js new file mode 100644 index 0000000..2d7f366 --- /dev/null +++ b/js/x11/core/examples/screenshot.js @@ -0,0 +1,87 @@ +var x11 = require('../lib'); +var wid = process.argv[2]; +console.log(wid); + +x11.createClient(function(err, display) { + var X = display.client; + var root = display.screen[0].root; + + var id = wid ? wid : root; + var gc = X.AllocID(); + X.CreateGC(gc, id); + var width = 0; + var hwight = 0; + X.GetGeometry(id, function(err, clientGeom) { + width = clientGeom.width; + height = clientGeom.height; + + + var dispwin = X.AllocID(); + X.CreateWindow(dispwin, root, 0, 0, width, height, 0, 0, 0, 0, { eventMask: x11.eventMask.Exposure }); + X.MapWindow(dispwin); + //X.CopyArea(idScreenshot, dispwin, gc, 0, 0, 0, 0, width, height); + + + //var idScreenshot = X.AllocID(); + //X.CreatePixmap(idScreenshot, root, 24, clientGeom.width, clientGeom.height); + // ask recursively each window to copy itself to pixmap + + function drawWithKids(list, cb) + { + if (list.length == 0) + return cb(); + var p = list.pop(); + var win = p.win; + if (win == dispwin) + return drawWithKids(list, cb); + + X.GetWindowAttributes(win, function(err, res) { + if (res[8] == 0) + return drawWithKids(list, cb); + X.GetGeometry(win, function(err, geom) { + // (srcDrawable, dstDrawable, gc, srcX, srcY, dstX, dstY, width, height) + if (win != root) + X.CopyArea(win, dispwin, gc, 0, 0, p.x + geom.xPos, p.y + geom.yPos, geom.width, geom.height); + //X.CopyArea(win, idScreenshot, gc, 0, 0, p.x + geom.xPos, p.y + geom.yPos, geom.width, geom.height); + X.QueryTree(win, function(tree) { + tree.children.reverse().forEach(function(subwin) { + list.push({win: subwin, x: p.x + geom.xPos, y: p.y + geom.yPos}); + }); + drawWithKids(list, cb); + }); + }); + }); + }; + + /* + //setInterval(function() { + var list = [{win: id, x: 0, y: 0}]; + drawWithKids(list, function() { + // (format, drawable, x, y, width, height, planeMask) + //X.GetImage(2, dispwin, 0, 0, width, height, 0xffffffff, function(data) { + //X.GetImage(2, root, 0, 0, width, height, 0xffffffff, function(data) { + // console.log(data); + //}); + console.log('DONE! ready'); + X.terminate(); + //var dispwin = X.AllocID(); + //X.CreateWindow(dispwin, root, 0, 0, width, height, 1, 1, 0, { eventMask: x11.eventMask.Exposure }); + //X.MapWindow(dispwin); + //X.CopyArea(idScreenshot, dispwin, gc, 0, 0, 0, 0, width, height); + + }); + */ + X.GetImage(2, id, 0, 0, width, height, 0xffffffff, function(err, image) { + if (err) { + console.log(err); + process.exit(1); + } + console.log(image); + // format, drawable, gc, width, height, dstX, dstY, leftPad, depth, data + X.PutImage(2, dispwin, gc, width, height, 0, 0, 0, 24, image.data); + }); + //}, 1000); + }); +}).on('error', function(err) { + console.log(err); +});