diff --git a/lib/units/device/plugins/vnc/index.js b/lib/units/device/plugins/vnc/index.js index 2a697680..9829d5c8 100644 --- a/lib/units/device/plugins/vnc/index.js +++ b/lib/units/device/plugins/vnc/index.js @@ -11,10 +11,12 @@ var lifecycle = require('../../../../util/lifecycle') var VncServer = require('./util/server') var VncConnection = require('./util/connection') +var PointerTranslator = require('./util/pointertranslator') module.exports = syrup.serial() .dependency(require('../screen/stream')) - .define(function(options, screenStream) { + .dependency(require('../touch')) + .define(function(options, screenStream, touch) { var log = logger.createLogger('device:plugins:vnc') function createServer() { @@ -63,6 +65,24 @@ module.exports = syrup.serial() , updateRequests: 0 } + var pointerTranslator = new PointerTranslator() + + pointerTranslator.on('touchdown', function(event) { + touch.touchDown(event) + }) + + pointerTranslator.on('touchmove', function(event) { + touch.touchMove(event) + }) + + pointerTranslator.on('touchup', function(event) { + touch.touchUp(event) + }) + + pointerTranslator.on('touchcommit', function() { + touch.touchCommit() + }) + function vncStartListener(frameProducer) { return new Promise(function(resolve/*, reject*/) { connState.frameWidth = frameProducer.banner.virtualWidth @@ -126,6 +146,10 @@ module.exports = syrup.serial() maybeSendFrame() }) + conn.on('pointer', function(event) { + pointerTranslator.push(event) + }) + conn.on('close', function() { screenStream.broadcastSet.remove(id) }) diff --git a/lib/units/device/plugins/vnc/util/connection.js b/lib/units/device/plugins/vnc/util/connection.js index 8ce5382e..0bce128b 100644 --- a/lib/units/device/plugins/vnc/util/connection.js +++ b/lib/units/device/plugins/vnc/util/connection.js @@ -21,8 +21,8 @@ function VncConnection(conn, options) { this._serverVersion = VncConnection.V3_008 this._serverSupportedSecurity = [VncConnection.SECURITY_NONE] - this._serverWidth = 720 - this._serverHeight = 1280 + this._serverWidth = 1080 + this._serverHeight = 1920 this._serverPixelFormat = new PixelFormat({ bitsPerPixel: 32 , depth: 24 @@ -368,9 +368,11 @@ VncConnection.prototype._read = function() { break case VncConnection.STATE_NEED_CLIENT_MESSAGE_POINTEREVENT: if ((chunk = this._consume(5))) { - // buttonMask = chunk[0] - // xPosition = chunk.readUInt16BE(1, true) - // yPosition = chunk.readUInt16BE(3, true) + this.emit('pointer', { + buttonMask: chunk[0] + , xPosition: chunk.readUInt16BE(1, true) / this._serverWidth + , yPosition: chunk.readUInt16BE(3, true) / this._serverHeight + }) this._changeState(VncConnection.STATE_NEED_CLIENT_MESSAGE) } break diff --git a/lib/units/device/plugins/vnc/util/pointertranslator.js b/lib/units/device/plugins/vnc/util/pointertranslator.js new file mode 100644 index 00000000..8161efa8 --- /dev/null +++ b/lib/units/device/plugins/vnc/util/pointertranslator.js @@ -0,0 +1,66 @@ +var util = require('util') + +var EventEmitter = require('eventemitter3').EventEmitter + +function PointerTranslator() { + this.previousEvent = null +} + +util.inherits(PointerTranslator, EventEmitter) + +PointerTranslator.prototype.push = function(event) { + if (event.buttonMask & 0xFE) { + // Non-primary buttons included, ignore. + return + } + + if (this.previousEvent) { + var buttonChanges = event.buttonMask ^ this.previousEvent.buttonMask + + // If the primary button changed, we have an up/down event. + if (buttonChanges & 1) { + // If it's pressed now, that's a down event. + if (event.buttonMask & 1) { + this.emit('touchdown', { + contact: 1 + , x: event.xPosition + , y: event.yPosition + }) + this.emit('touchcommit') + } + // It's not pressed, so we have an up event. + else { + this.emit('touchup', { + contact: 1 + }) + this.emit('touchcommit') + } + } + // Otherwise, if we're still holding the primary button down, + // that's a move event. + else if (event.buttonMask & 1) { + this.emit('touchmove', { + contact: 1 + , x: event.xPosition + , y: event.yPosition + }) + this.emit('touchcommit') + } + } + else { + // If it's the first event we get and the primary button's pressed, + // it's a down event. + if (event.buttonMask & 1) { + this.emit('touchdown', { + contact: 1 + , x: event.xPosition + , y: event.yPosition + }) + this.emit('touchcommit') + } + } + + this.previousEvent = event +} + +module.exports = PointerTranslator