Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
7fe01f56f2
commit
d847661346
129
js/x11/examples/vncviewer/vncgui.js
Normal file
129
js/x11/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