diff --git a/js/x11/examples/windowmanager/wmSimple.js b/js/x11/examples/windowmanager/wmSimple.js new file mode 100644 index 0000000..69bafcb --- /dev/null +++ b/js/x11/examples/windowmanager/wmSimple.js @@ -0,0 +1,114 @@ +var x11 = require('./libx11.debug').X11; +var EventEmitter = require('events').EventEmitter; + +var X, root, white; +var events = x11.eventMask.Button1Motion|x11.eventMask.ButtonPress|x11.eventMask.ButtonRelease|x11.eventMask.SubstructureNotify|x11.eventMask.SubstructureRedirect|x11.eventMask.Exposure; +var frames = {}; +var dragStart = null; + +function ManageWindow(wid) +{ + console.log("MANAGE WINDOW: " + wid); + + if (wid!=0x1600003) return; + + X.GetWindowAttributes(wid, function(err, attrs) { + + if (attrs[8]) // override-redirect flag + { + // don't manage + console.log("don't manage"); + X.MapWindow(wid); + return; + } + + var fid = X.AllocID(); + frames[fid] = 1; + var winX, winY; + winX = 20; + winY = 20; + + X.GetGeometry(wid, function(err, clientGeom) { + + console.log("window geometry: ", clientGeom); + var width = clientGeom.width + 4; + var height = clientGeom.height + 24; + if (width < 50 || height < 50) return; + console.log("CreateWindow", fid, root, winX, winY, width, height); + X.CreateWindow(fid, root, winX, winY, width, height, 0, 0, 0, 0, + { + backgroundPixel: white, + eventMask: events + }); + + var ee = new EventEmitter(); + X.event_consumers[fid] = ee; + ee.on('event', function(ev) + { + console.log(['event', ev]); + if (ev.type === 17) // DestroyNotify + { + X.DestroyWindow(fid); + } else if (ev.type == 4) { + dragStart = { rootx: ev.rootx, rooty: ev.rooty, x: ev.x, y: ev.y, winX: winX, winY: winY }; + } else if (ev.type == 5) { + dragStart = null; + } else if (ev.type == 6) { + winX = dragStart.winX + ev.rootx - dragStart.rootx; + winY = dragStart.winY + ev.rooty - dragStart.rooty; + X.MoveWindow(fid, winX, winY); + } else if (ev.type == 12) { + // show + } + }); + X.ChangeSaveSet(1, wid); + X.ReparentWindow(wid, fid, 1, 21); + console.log("MapWindow", fid); + X.MapWindow(fid); + X.MapWindow(wid); + X.MoveResizeWindow(fid,20,20,800+4,600+24); + X.ReparentWindow(wid, fid, 1, 21); + }); + + }); +} + +x11.createClient(function(err, display) { + X = display.client; + X.require('render', function(err, Render) { + X.Render = Render; + + root = display.screen[0].root; + white = display.screen[0].white_pixel; + console.log('root = ' + root); + X.ChangeWindowAttributes(root, { eventMask: x11.eventMask.Exposure|x11.eventMask.SubstructureRedirect }, function(err) { + if (err.error == 10) + { + console.error('Error: another window manager already running.'); + process.exit(1); + } + }); + X.QueryTree(root, function(err, tree) { + tree.children.forEach(ManageWindow); + }); + +}) + +}).on('error', function(err) { + console.error(err); +}).on('event', function(ev) { + console.log(ev); + if (ev.type === 20) // MapRequest + { + if (!frames[ev.wid]) + ManageWindow(ev.wid); + return; + } else if (ev.type === 23) // ConfigureRequest + { + X.ResizeWindow(ev.wid, ev.width, ev.height); + } else if (ev.type === 12) { + console.log('EXPOSE', ev); + } + console.log(ev); + +});