From 87591795ec5cb920b6bad8c1f6e46baac0649325 Mon Sep 17 00:00:00 2001 From: Walter Berggren Date: Fri, 5 Aug 2016 09:41:48 +0200 Subject: [PATCH] Add scroll support --- client/jsmpg-vnc.js | 26 +++++++++++++++----------- source/app.c | 23 ++++++++++++----------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/client/jsmpg-vnc.js b/client/jsmpg-vnc.js index 3132f9c..aa04886 100644 --- a/client/jsmpg-vnc.js +++ b/client/jsmpg-vnc.js @@ -16,8 +16,8 @@ var lastMouse = {x: 0, y: 0}; if( mouseLock ) { // FUCK YEAH, VENDOR PREFIXES. LOVE EM! canvas.requestPointerLock = canvas.requestPointerLock || - canvas.mozRequestPointerLock || - canvas.webkitRequestPointerLock || + canvas.mozRequestPointerLock || + canvas.webkitRequestPointerLock || (function(){}); } @@ -33,6 +33,7 @@ var KEY_DOWN = 0x01, MOUSE_1_UP = 0x0004, MOUSE_2_DOWN = 0x0008, MOUSE_2_UP = 0x0010; + MOUSEEVENTF_WHEEL = 0x0800; // struct input_key_t { uint16 type, uint16 state; uint16 key_code; } var sendKey = function(ev, action, key) { @@ -40,10 +41,11 @@ var sendKey = function(ev, action, key) { ev.preventDefault(); }; -// struct input_mouse_t { uint16 type, uint16 flags; float32 x; float32 y; } -var mouseDataBuffer = new ArrayBuffer(12); +// struct input_mouse_t { uint16 type, uint16 flags; float32 x; float32 y; int16 amount } +var mouseDataBuffer = new ArrayBuffer(16); var mouseDataTypeFlags = new Uint16Array(mouseDataBuffer, 0); var mouseDataCoords = new Float32Array(mouseDataBuffer, 4); +var mouseScrollAmount = new Int32Array(mouseDataBuffer, 12); var sendMouse = function(ev, action) { var type = 0; @@ -51,19 +53,19 @@ var sendMouse = function(ev, action) { if( action ) { type |= INPUT_MOUSE_BUTTON; - + // Attempt to lock pointer at mouse1 down if( mouseLock && action === MOUSE_1_DOWN ) { canvas.requestPointerLock(); } } - + // Only make relative mouse movements if no button is pressed if( !action && mouseLock ) { type |= INPUT_MOUSE_RELATIVE; - + var p = ev.changedTouches ? ev.changedTouches[0] : ev; - + // FUCK, DID I MENTION I LOOOOOVE VENDOR PREFIXES? SO USEFUL! x = p.movementX || p.mozMovementX || p.webkitMovementX; y = p.movementY || p.mozMovementY || p.webkitMovementY; @@ -81,11 +83,11 @@ var sendMouse = function(ev, action) { // button presses. if( !mouseLock ) { type |= INPUT_MOUSE_ABSOLUTE; - + var rect = canvas.getBoundingClientRect(); var scaleX = canvas.width / (rect.right-rect.left), scaleY = canvas.height / (rect.bottom-rect.top); - + var p = event.changedTouches ? ev.changedTouches[0] : ev; var x = (p.clientX - rect.left) * scaleX, y = (p.clientY - rect.top) * scaleY; @@ -95,7 +97,8 @@ var sendMouse = function(ev, action) { mouseDataTypeFlags[1] = (action||0); mouseDataCoords[0] = x; mouseDataCoords[1] = y; - + mouseScrollAmount[0] = (ev.wheelDelta||0); + client.send(mouseDataBuffer); ev.preventDefault(); }; @@ -109,6 +112,7 @@ window.addEventListener('keyup', function(ev) { sendKey(ev, KEY_UP, ev.keyCode); canvas.addEventListener('mousemove', function(ev){ sendMouse(ev, null); }, false); canvas.addEventListener('mousedown', function(ev){ sendMouse(ev, ev.button == 2 ? MOUSE_2_DOWN : MOUSE_1_DOWN); }, false); canvas.addEventListener('mouseup', function(ev){ sendMouse(ev, ev.button == 2 ? MOUSE_2_UP : MOUSE_1_UP); }, false); +canvas.addEventListener('mousewheel', function(ev){ sendMouse(ev, MOUSEEVENTF_WHEEL); }, false); // Touch canvas.addEventListener('touchstart', function(ev){ diff --git a/source/app.c b/source/app.c index 259299f..ad0d3c4 100644 --- a/source/app.c +++ b/source/app.c @@ -28,9 +28,9 @@ typedef enum { input_type_mouse_button = 0x0002, input_type_mouse_absolute = 0x0004, input_type_mouse_relative = 0x0008, - input_type_mouse = - input_type_mouse_button | - input_type_mouse_absolute | + input_type_mouse = + input_type_mouse_button | + input_type_mouse_absolute | input_type_mouse_relative } input_type_t; @@ -44,6 +44,7 @@ typedef struct { unsigned short type; unsigned short flags; float x, y; + int amount; //For scrolling } input_mouse_t; @@ -73,7 +74,7 @@ app_t *app_create(HWND window, int port, int bit_rate, int out_width, int out_he self->mouse_speed = APP_MOUSE_SPEED; self->grabber = grabber_create(window); - + if( !out_width ) { out_width = self->grabber->width; } if( !out_height ) { out_height = self->grabber->height; } if( !bit_rate ) { bit_rate = out_width * 1500; } // estimate bit rate based on output size @@ -83,7 +84,7 @@ app_t *app_create(HWND window, int port, int bit_rate, int out_width, int out_he out_width, out_height, // out size bit_rate ); - + self->server = server_create(port, APP_FRAME_BUFFER_SIZE); if( !self->server ) { printf("Error: could not create Server; try using another port\n"); @@ -128,8 +129,8 @@ int app_on_http_req(app_t *self, libwebsocket *socket, char *request) { void app_on_connect(app_t *self, libwebsocket *socket) { printf("\nclient connected: %s\n", server_get_client_address(self->server, socket)); - jsmpeg_header_t header = { - {'j','s','m','p'}, + jsmpeg_header_t header = { + {'j','s','m','p'}, swap_int16(self->encoder->out_width), swap_int16(self->encoder->out_height) }; server_send(self->server, socket, &header, sizeof(header), server_type_binary); @@ -190,8 +191,8 @@ void app_on_message(app_t *self, libwebsocket *socket, void *data, size_t len) { } if( type & input_type_mouse_button ) { - //printf("mouse button %d\n", input->flags); - mouse_event(input->flags, 0, 0, 0, NULL); + //printf("mouse button %d and scroll amount %d\n", input->flags, input->amount); + mouse_event(input->flags, 0, 0, input->amount, NULL); } } } @@ -221,13 +222,13 @@ void app_run(app_t *self, int target_fps) { double encode_time = timer_measure(encode_time) { size_t encoded_size = APP_FRAME_BUFFER_SIZE - sizeof(jsmpeg_frame_t); encoder_encode(self->encoder, pixels, frame->data, &encoded_size); - + if( encoded_size ) { frame->size = swap_int32(sizeof(jsmpeg_frame_t) + encoded_size); server_broadcast(self->server, frame, sizeof(jsmpeg_frame_t) + encoded_size, server_type_binary); } } - + printf("fps:%3d (grabbing:%6.2fms, scaling/encoding:%6.2fms)\r", (int)fps, grab_time, encode_time); }