From 491446d1c308a1b8f3d8b4ca7763299ffc0e1896 Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:06:47 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/x11/examples/screenshot.js | 87 +++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 js/x11/examples/screenshot.js diff --git a/js/x11/examples/screenshot.js b/js/x11/examples/screenshot.js new file mode 100644 index 0000000..2d7f366 --- /dev/null +++ b/js/x11/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); +});