Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
b0e6c58cb4
commit
8b5b2453fe
129
js/x11/core/examples/vncviewer/vncgui.js
Normal file
129
js/x11/core/examples/vncviewer/vncgui.js
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var rfb = require('./rfbclient');
|
||||||
|
var x11 = require('../../lib');
|
||||||
|
|
||||||
|
// TODO: use optimist for args parsing
|
||||||
|
var host = process.argv[2];
|
||||||
|
var port = process.argv[3];
|
||||||
|
var password = process.argv[4]
|
||||||
|
if (!host)
|
||||||
|
host = '127.0.0.1';
|
||||||
|
if (!port)
|
||||||
|
port = 5900;
|
||||||
|
|
||||||
|
var opts = {};
|
||||||
|
opts.host = host;
|
||||||
|
opts.port = port;
|
||||||
|
opts.password = password;
|
||||||
|
opts.rfbfile = process.argv[5];
|
||||||
|
//opts.rfbFileOut = process.argv[5];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var Exposure = x11.eventMask.Exposure;
|
||||||
|
var PointerMotion = x11.eventMask.PointerMotion;
|
||||||
|
var ButtonPress = x11.eventMask.ButtonPress;
|
||||||
|
var ButtonRelease = x11.eventMask.ButtonRelease;
|
||||||
|
var KeyPress = x11.eventMask.KeyPress;
|
||||||
|
var KeyRelease = x11.eventMask.KeyRelease;
|
||||||
|
|
||||||
|
x11.createClient(function(err, display) {
|
||||||
|
var X = display.client;
|
||||||
|
X.require('big-requests', function(err, BigReq) {
|
||||||
|
BigReq.Enable(function(err, maxLen) {
|
||||||
|
var keycode2keysym = [];
|
||||||
|
var min = display.min_keycode;
|
||||||
|
var max = display.max_keycode;
|
||||||
|
X.GetKeyboardMapping(min, max-min, function(err, list) {
|
||||||
|
for (var i=0; i < list.length; ++i)
|
||||||
|
{
|
||||||
|
var keycode = i + min;
|
||||||
|
var keysyms = list[i];
|
||||||
|
keycode2keysym[keycode] = keysyms;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var root = display.screen[0].root;
|
||||||
|
var white = display.screen[0].white_pixel;
|
||||||
|
var black = display.screen[0].black_pixel;
|
||||||
|
|
||||||
|
var r = rfb.createConnection(opts);
|
||||||
|
r.on('connect', function() {
|
||||||
|
|
||||||
|
var wid = X.AllocID();
|
||||||
|
X.CreateWindow(wid, root, 0, 0, r.width, r.height);
|
||||||
|
X.ChangeWindowAttributes(wid, {
|
||||||
|
backgroundPixel: black,
|
||||||
|
eventMask: Exposure|PointerMotion|ButtonPress|ButtonRelease|KeyPress|KeyRelease
|
||||||
|
});
|
||||||
|
X.ChangeProperty(0, wid, X.atoms.WM_NAME, X.atoms.STRING, 8, r.title);
|
||||||
|
X.MapWindow(wid);
|
||||||
|
|
||||||
|
var gc = X.AllocID();
|
||||||
|
X.CreateGC(gc, wid, { foreground: black, background: white } );
|
||||||
|
|
||||||
|
//var pixbuf = X.AllocID();
|
||||||
|
//X.CreatePixmap(pixbuf, wid, 32, r.width, r.height);
|
||||||
|
//var pic = X.AllocID();
|
||||||
|
//Render.CreatePicture(pic, pixbuf, Render.rgba32);
|
||||||
|
|
||||||
|
var buttonsState = 0;
|
||||||
|
X.on('error', function(err) {
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
X.on('event', function(ev) {
|
||||||
|
if (ev.type == 12) // expose
|
||||||
|
{
|
||||||
|
// TODO: update only expose rect
|
||||||
|
//X.PutImage(2, wid, gc, 128, 128, 0, 0, 0, 24, bitmap);
|
||||||
|
} else if (ev.type == 6) { // mousemove
|
||||||
|
r.pointerEvent(ev.x, ev.y, buttonsState);
|
||||||
|
} else if (ev.type == 4 || ev.type == 5) { // mousedown
|
||||||
|
var buttonBit = 1 << (ev.keycode - 1);
|
||||||
|
// set button bit
|
||||||
|
if (ev.type == 4)
|
||||||
|
buttonsState |= buttonBit;
|
||||||
|
else
|
||||||
|
buttonsState &= ~buttonBit;
|
||||||
|
r.pointerEvent(ev.x, ev.y, buttonsState);
|
||||||
|
} else if (ev.type == 2 || ev.type == 3) {
|
||||||
|
var shift = ev.buttons & 1;
|
||||||
|
var keysym = keycode2keysym[ev.keycode][shift];
|
||||||
|
var isDown = (ev.type == 2) ? 1 : 0;
|
||||||
|
r.keyEvent(keysym, isDown);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
r.on('resize', function(rect)
|
||||||
|
{
|
||||||
|
X.ResizeWindow(wid, rect.width, rect.height);
|
||||||
|
});
|
||||||
|
r.on('rect', function(rect) {
|
||||||
|
if (rect.encoding == rfb.encodings.raw) {
|
||||||
|
// format, drawable, gc, width, height, dstX, dstY, leftPad, depth, data
|
||||||
|
X.PutImage(2, wid, gc, rect.width, rect.height, rect.x, rect.y, 0, 24, rect.buffer);
|
||||||
|
} else if (rect.encoding == rfb.encodings.copyRect) {
|
||||||
|
X.CopyArea(wid, wid, gc, rect.src.x, rect.src.y, rect.x, rect.y, rect.width, rect.height);
|
||||||
|
} else if (rect.encoding == rfb.encodings.hextile) {
|
||||||
|
console.log('hextile rec! (currently not fully supported');
|
||||||
|
console.log(rect);
|
||||||
|
rect.on('tile', function(tile) {
|
||||||
|
X.PutImage(2, wid, gc, 16, 16, tile.x, tile.y, 0, 24, tile.buffer);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
X.on('end', function() {
|
||||||
|
r.terminate();
|
||||||
|
});
|
||||||
|
|
||||||
|
}); // r.on('connect)
|
||||||
|
}); // GetKeyboardMapping
|
||||||
|
}); // BigReq.Enable
|
||||||
|
|
||||||
|
}); // require('big-requests
|
||||||
|
|
||||||
|
}); // x11.createClient
|
Loading…
Reference in New Issue
Block a user