130 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "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
 |