Cleaned up the mouse interface, added mouse support to VNC, and split off the VNC keymap to vnc_keymap.c with more documenting comments in that file so we can update it as we learn.
This commit is contained in:
142
src/vnc.c
142
src/vnc.c
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Implement the VNC remote renderer with LibVNCServer.
|
||||
*
|
||||
* Version: @(#)lnx_vnc.c 1.0.4 2017/10/18
|
||||
* Version: @(#)vnc.c 1.0.6 2017/10/22
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Based on raw code by RichardG, <richardg867@gmail.com>
|
||||
@@ -20,16 +20,16 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
#include "86box.h"
|
||||
#include "device.h"
|
||||
#include "video/video.h"
|
||||
#include "plat.h"
|
||||
#include "plat_keyboard.h"
|
||||
#include "plat_mouse.h"
|
||||
#include "ui.h"
|
||||
#define BITMAP MY_BITMAP
|
||||
#include <rfb/rfb.h>
|
||||
#undef BITMAP
|
||||
#include "86box.h"
|
||||
#include "device.h"
|
||||
#include "video/video.h"
|
||||
#include "mouse.h"
|
||||
#include "plat.h"
|
||||
#include "plat_keyboard.h"
|
||||
#include "ui.h"
|
||||
#include "vnc.h"
|
||||
|
||||
|
||||
@@ -44,110 +44,16 @@ static int clients;
|
||||
static int updatingSize;
|
||||
static int allowedX,
|
||||
allowedY;
|
||||
|
||||
static int keysyms_00[] = {
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 00-07
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 08-0f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 10-17
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 18-1f
|
||||
0x0039, 0x2a02, 0x2a28, 0x2a04, 0x2a05, 0x2a06, 0x2a08, 0x0028, // 20-27
|
||||
0x2a0a, 0x2a0b, 0x2a09, 0x2a0d, 0x0033, 0x000c, 0x0034, 0x0035, // 28-2f
|
||||
0x000b, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, // 30-37
|
||||
0x0009, 0x000a, 0x2a27, 0x0027, 0x2a33, 0x000d, 0x2a34, 0x2a35, // 38-3f
|
||||
0x2a03, 0x2a1e, 0x2a30, 0x2a2e, 0x2a20, 0x2a12, 0x2a21, 0x2a22, // 40-47
|
||||
0x2a23, 0x2a17, 0x2a24, 0x2a25, 0x2a26, 0x2a32, 0x2a31, 0x2a18, // 48-4f
|
||||
0x2a19, 0x2a10, 0x2a13, 0x2a1f, 0x2a14, 0x2a16, 0x2a2f, 0x2a11, // 50-57
|
||||
0x2a2d, 0x2a15, 0x2a2c, 0x001a, 0x0000, 0x001b, 0x2a07, 0x2a0c, // 58-5f
|
||||
0x0029, 0x001e, 0x0030, 0x002e, 0x0020, 0x0012, 0x0021, 0x0022, // 60-67
|
||||
0x0023, 0x0017, 0x0024, 0x0025, 0x0026, 0x0032, 0x0031, 0x0018, // 68-6f
|
||||
0x0019, 0x0010, 0x0013, 0x001f, 0x0014, 0x0016, 0x002f, 0x0011, // 70-77
|
||||
0x002d, 0x0015, 0x002c, 0x2a1a, 0x0000, 0x2a1b, 0x2a29, 0x0000, // 78-7f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 80-87
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 88-8f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 90-97
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 98-9f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // a0-a7
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // a8-af
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // b0-b7
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // b8-bf
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // c0-c7
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // c8-cf
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // d0-d7
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // d8-df
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // e0-e7
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // e8-ef
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // f0-f7
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 // f8-ff
|
||||
};
|
||||
|
||||
static int keysyms_ff[] = {
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 00-07
|
||||
0x000e, 0x000f, 0x0000, 0x004c, 0x0000, 0x001c, 0x0000, 0x0000, // 08-0f
|
||||
0x0000, 0x0000, 0x0000, 0xff45, 0x0000, 0x0000, 0x0000, 0x0000, // 10-17
|
||||
0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, // 18-1f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 20-27
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 28-2f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 30-37
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 38-3f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 40-47
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 48-4f
|
||||
0x0047, 0x00cb, 0xaac8, 0x00cd, 0x00d0, 0x0049, 0x0051, 0x004f, // 50-57
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 58-5f
|
||||
0x0000, 0x0000, 0x0000, 0x0052, 0x0000, 0x0000, 0x0000, 0x00dd, // 60-67
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 68-6f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 70-77
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 78-7f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 80-87
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009c, 0x0000, 0x0000, // 88-8f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 90-97
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 98-9f
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // a0-a7
|
||||
0x0000, 0x0000, 0x0037, 0x004e, 0x0000, 0x004a, 0x0000, 0x00b5, // a8-af
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // b0-b7
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x003b, 0x003c, // b8-bf
|
||||
0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, // c0-c7
|
||||
0x0057, 0x0058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // c8-cf
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // d0-d7
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // d8-df
|
||||
0x0000, 0x0036, 0x0000, 0x001d, 0x009d, 0x0000, 0x0000, 0x0000, // e0-e7
|
||||
0x0000, 0x0038, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // e8-ef
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // f0-f7
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0053 // f8-ff
|
||||
};
|
||||
static int ptr_x, ptr_y, ptr_but;
|
||||
|
||||
|
||||
static void
|
||||
vnc_kbdevent(rfbBool down, rfbKeySym k, rfbClientPtr cl)
|
||||
{
|
||||
int will_press = 0;
|
||||
int key;
|
||||
(void)cl;
|
||||
|
||||
#if 0
|
||||
pclog("VNC: kbdevent %d %x\n", down, k);
|
||||
#endif
|
||||
|
||||
if ((k >> 8) == 0x00) {
|
||||
will_press = keysyms_00[k & 0xff];
|
||||
} else if ((k >> 8) == 0xff) {
|
||||
will_press = keysyms_ff[k & 0xff];
|
||||
}
|
||||
|
||||
if (will_press <= 0) return;
|
||||
|
||||
#if 0
|
||||
pclog("VNC: translated to %x %x\n",
|
||||
(will_press >> 8) & 0xff, will_press & 0xff);
|
||||
#endif
|
||||
|
||||
/* First key. */
|
||||
key = (will_press >> 8) & 0xff;
|
||||
if (key > 0)
|
||||
recv_key[key] = down;
|
||||
|
||||
/* Second key. */
|
||||
key = will_press & 0xff;
|
||||
if (key > 0)
|
||||
recv_key[key] = down;
|
||||
/* Handle it through the lookup tables. */
|
||||
vnc_kbinput(down?1:0, (int)k);
|
||||
}
|
||||
|
||||
|
||||
@@ -155,9 +61,23 @@ static void
|
||||
vnc_ptrevent(int but, int x, int y, rfbClientPtr cl)
|
||||
{
|
||||
if (x>=0 && x<allowedX && y>=0 && y<allowedY) {
|
||||
pclog("VNC: mouse event, x=%d, y=%d, buttons=%02x\n", x, y, but);
|
||||
/* VNC uses absolute positions within the window, no deltas. */
|
||||
if (x != ptr_x || y != ptr_y) {
|
||||
mouse_x += (x - ptr_x);
|
||||
mouse_y += (y - ptr_y);
|
||||
ptr_x = x; ptr_y = y;
|
||||
}
|
||||
|
||||
/* TODO: stuff a new "packet" into the platform mouse buffer. */
|
||||
if (but != ptr_but) {
|
||||
mouse_buttons = 0;
|
||||
if (but & 0x01)
|
||||
mouse_buttons |= 0x01;
|
||||
if (but & 0x02)
|
||||
mouse_buttons |= 0x04;
|
||||
if (but & 0x04)
|
||||
mouse_buttons |= 0x02;
|
||||
ptr_but = but;
|
||||
}
|
||||
}
|
||||
|
||||
rfbDefaultPtrAddEvent(but, x, y, cl);
|
||||
@@ -187,6 +107,12 @@ vnc_newclient(rfbClientPtr cl)
|
||||
|
||||
pclog("VNC: new client: %s\n", cl->host);
|
||||
if (++clients == 1) {
|
||||
/* Reset the mouse. */
|
||||
ptr_x = allowedX/2;
|
||||
ptr_y = allowedY/2;
|
||||
mouse_x = mouse_y = mouse_z = 0;
|
||||
mouse_buttons = 0x00;
|
||||
|
||||
/* We now have clients, un-pause the emulator if needed. */
|
||||
pclog("VNC: unpausing..\n");
|
||||
plat_pause(0);
|
||||
|
||||
Reference in New Issue
Block a user