Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
271d4973b0
commit
4a71e9ec3f
114
js/x11/examples/windowmanager/wmSimple.js
Normal file
114
js/x11/examples/windowmanager/wmSimple.js
Normal file
|
@ -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);
|
||||
|
||||
});
|
Loading…
Reference in New Issue
Block a user