From e6c683d631550c882b86fbaaff623e14324d1d7c Mon Sep 17 00:00:00 2001 From: Andrey Sidorov Date: Tue, 28 Feb 2012 17:18:12 +1100 Subject: [PATCH] window manager --- examples/wm/wm.js | 87 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 examples/wm/wm.js diff --git a/examples/wm/wm.js b/examples/wm/wm.js new file mode 100644 index 0000000..5f2d8f3 --- /dev/null +++ b/examples/wm/wm.js @@ -0,0 +1,87 @@ +var x11 = require('../../lib/x11'); +var EventEmitter = require('events').EventEmitter; + +var X, root; +var events = x11.eventMask.Button1Motion|x11.eventMask.ButtonPress|x11.eventMask.ButtonRelease|x11.eventMask.SubstructureNotify|x11.eventMask.SubstructureRedirect +var frames = {}; +var dragStart = null; + +function ManageWindow(wid) +{ + X.GetWindowAttributes(wid, function(attrs) { + + if (attrs[8]) + { + X.MapWindow(wid); + return; + } + + var fid = X.AllocID(); + frames[fid] = 1; + var winX, winY; + winX = parseInt(Math.random()*300); + winY = parseInt(Math.random()*300); + + X.GetGeometry(wid, function(clientGeom) { + var width = clientGeom.width + 4; + var height = clientGeom.height + 24; + X.CreateWindow(fid, root, winX, winY, width, height, 1, 1, 0, + { + backgroundPixel: 0xffffe0, + eventMask: events + }); + var ee = new EventEmitter(); + X.event_consumers[fid] = ee; + ee.on('event', function(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); + } + }); + X.ChangeSaveSet(1, wid); + X.ReparentWindow(wid, fid, 1, 21); + X.MapWindow(fid); + X.MapWindow(wid); + }); + + }); +} + +x11.createClient(function(display) { + X = display.client; + root = display.screen[0].root; + console.log('root = ' + root); + X.ChangeWindowAttributes(root, { eventMask: x11.eventMask.SubstructureRedirect }, function(err) { + if (err.error == 10) + { + console.error('Error: another window manager already running.'); + process.exit(1); + } + }); + X.QueryTree(root, function(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); + } + console.log(ev); +});