Makes vnc server talk to vsoc_input_service

No longer configures its own virtual devices.

Test: run locally
Bug: 67895611
Change-Id: I84c5acae1a1f1de9473c7f9a81c06d07863c4255
diff --git a/guest/frontend/vnc_server/Android.mk b/guest/frontend/vnc_server/Android.mk
index 7a01360..2e676ac 100644
--- a/guest/frontend/vnc_server/Android.mk
+++ b/guest/frontend/vnc_server/Android.mk
@@ -29,6 +29,7 @@
 
 LOCAL_C_INCLUDES := \
     device/google/cuttlefish_common \
+    device/google/cuttlefish_kernel \
     external/libjpeg-turbo \
     external/jsoncpp/include
 
@@ -36,23 +37,22 @@
 LOCAL_VENDOR_MODULE := true
 LOCAL_MODULE_TAGS := optional
 LOCAL_SRC_FILES := \
-	blackboard.cpp \
-	frame_buffer_watcher.cpp \
-	jpeg_compressor.cpp \
-	main.cpp \
-	simulated_hw_composer.cpp \
-	tcp_socket.cpp \
-	VirtualInputDevice.cpp \
-	virtual_inputs.cpp \
-	vnc_client_connection.cpp \
-	vnc_server.cpp \
+    blackboard.cpp \
+    frame_buffer_watcher.cpp \
+    jpeg_compressor.cpp \
+    main.cpp \
+    simulated_hw_composer.cpp \
+    tcp_socket.cpp \
+    virtual_inputs.cpp \
+    vnc_client_connection.cpp \
+    vnc_server.cpp \
 
 LOCAL_CFLAGS := \
-	$(VSOC_VERSION_CFLAGS) \
-	-std=gnu++11 \
-	-Wall -Werror \
-	-Wno-error-unused -Wno-error=unused-parameter \
-	-Wno-attributes
+    $(VSOC_VERSION_CFLAGS) \
+    -std=gnu++11 \
+    -Wall -Werror \
+    -Wno-error-unused -Wno-error=unused-parameter \
+    -Wno-attributes
 
 LOCAL_CFLAGS += -Wno-error=implicit-exception-spec-mismatch
 
diff --git a/guest/frontend/vnc_server/VirtualInputDevice.cpp b/guest/frontend/vnc_server/VirtualInputDevice.cpp
deleted file mode 100644
index c757532..0000000
--- a/guest/frontend/vnc_server/VirtualInputDevice.cpp
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <linux/input.h>
-#include <linux/uinput.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <vector>
-
-#include "keysyms.h"
-
-#define LOG_TAG "RemoterVirtualInput"
-#include <cutils/log.h>
-#include <cutils/properties.h>
-
-#include "VirtualInputDevice.h"
-
-#define ARRAY_SIZE(a)           \
-  ((sizeof(a) / sizeof(*(a))) / \
-   static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
-
-//////////////////////////
-// VirtualButton Support
-//////////////////////////
-
-namespace cvd {
-uint32_t VirtualButton::Senabled_events_[] = {EV_KEY};
-
-VirtualButton::VirtualButton(const char* name, uint32_t input_keycode)
-    : VirtualInputDevice(name, BUS_USB, 0x6006, 0x6007, 1),
-      input_keycode_(input_keycode) {
-  if (!VirtualInputDevice::Init(Senabled_events_, ARRAY_SIZE(Senabled_events_),
-                                &input_keycode_, 1, NULL, 0, NULL, 0)) {
-    LOG_FATAL("VirtualInputDevice Init() failed");
-  }
-}
-
-void VirtualButton::HandleButtonPressEvent(bool button_down) {
-  EmitEvent(EV_KEY, input_keycode_, button_down);
-  EmitEvent(EV_SYN, 0, 0);
-}
-
-//////////////////////////
-// VirtualKeyboard Support
-//////////////////////////
-
-uint32_t VirtualKeyboard::Senabled_events_[] = {EV_KEY};
-
-struct KeyEventToInput {
-  uint32_t xk;
-  uint32_t input_code;
-};
-
-static const KeyEventToInput key_table[] = {
-    {xk::AltLeft, KEY_LEFTALT},
-    {xk::ControlLeft, KEY_LEFTCTRL},
-    {xk::ShiftLeft, KEY_LEFTSHIFT},
-    {xk::AltRight, KEY_RIGHTALT},
-    {xk::ControlRight, KEY_RIGHTCTRL},
-    {xk::ShiftRight, KEY_RIGHTSHIFT},
-    {xk::MetaLeft, KEY_LEFTMETA},
-    {xk::MetaRight, KEY_RIGHTMETA},
-    {xk::MultiKey, KEY_COMPOSE},
-
-    {xk::CapsLock, KEY_CAPSLOCK},
-    {xk::NumLock, KEY_NUMLOCK},
-    {xk::ScrollLock, KEY_SCROLLLOCK},
-
-    {xk::BackSpace, KEY_BACKSPACE},
-    {xk::Tab, KEY_TAB},
-    {xk::Return, KEY_ENTER},
-    {xk::Escape, KEY_ESC},
-
-    {' ', KEY_SPACE},
-    {'!', KEY_1},
-    {'"', KEY_APOSTROPHE},
-    {'#', KEY_3},
-    {'$', KEY_4},
-    {'%', KEY_5},
-    {'^', KEY_6},
-    {'&', KEY_7},
-    {'\'', KEY_APOSTROPHE},
-    {'(', KEY_9},
-    {')', KEY_0},
-    {'*', KEY_8},
-    {'+', KEY_EQUAL},
-    {',', KEY_COMMA},
-    {'-', KEY_MINUS},
-    {'.', KEY_DOT},
-    {'/', KEY_SLASH},
-    {'0', KEY_0},
-    {'1', KEY_1},
-    {'2', KEY_2},
-    {'3', KEY_3},
-    {'4', KEY_4},
-    {'5', KEY_5},
-    {'6', KEY_6},
-    {'7', KEY_7},
-    {'8', KEY_8},
-    {'9', KEY_9},
-    {':', KEY_SEMICOLON},
-    {';', KEY_SEMICOLON},
-    {'<', KEY_COMMA},
-    {'=', KEY_EQUAL},
-    {'>', KEY_DOT},
-    {'?', KEY_SLASH},
-    {'@', KEY_2},
-    {'A', KEY_A},
-    {'B', KEY_B},
-    {'C', KEY_C},
-    {'D', KEY_D},
-    {'E', KEY_E},
-    {'F', KEY_F},
-    {'G', KEY_G},
-    {'H', KEY_H},
-    {'I', KEY_I},
-    {'J', KEY_J},
-    {'K', KEY_K},
-    {'L', KEY_L},
-    {'M', KEY_M},
-    {'N', KEY_N},
-    {'O', KEY_O},
-    {'P', KEY_P},
-    {'Q', KEY_Q},
-    {'R', KEY_R},
-    {'S', KEY_S},
-    {'T', KEY_T},
-    {'U', KEY_U},
-    {'V', KEY_V},
-    {'W', KEY_W},
-    {'X', KEY_X},
-    {'Y', KEY_Y},
-    {'Z', KEY_Z},
-    {'[', KEY_LEFTBRACE},
-    {'\\', KEY_BACKSLASH},
-    {']', KEY_RIGHTBRACE},
-    {'-', KEY_MINUS},
-    {'_', KEY_MINUS},
-    {'`', KEY_GRAVE},
-    {'a', KEY_A},
-    {'b', KEY_B},
-    {'c', KEY_C},
-    {'d', KEY_D},
-    {'e', KEY_E},
-    {'f', KEY_F},
-    {'g', KEY_G},
-    {'h', KEY_H},
-    {'i', KEY_I},
-    {'j', KEY_J},
-    {'k', KEY_K},
-    {'l', KEY_L},
-    {'m', KEY_M},
-    {'n', KEY_N},
-    {'o', KEY_O},
-    {'p', KEY_P},
-    {'q', KEY_Q},
-    {'r', KEY_R},
-    {'s', KEY_S},
-    {'t', KEY_T},
-    {'u', KEY_U},
-    {'v', KEY_V},
-    {'w', KEY_W},
-    {'x', KEY_X},
-    {'y', KEY_Y},
-    {'z', KEY_Z},
-    {'{', KEY_LEFTBRACE},
-    {'\\', KEY_BACKSLASH},
-    {'|', KEY_BACKSLASH},
-    {'}', KEY_RIGHTBRACE},
-    {'~', KEY_GRAVE},
-
-    {xk::F1, KEY_F1},
-    {xk::F2, KEY_F2},
-    {xk::F3, KEY_F3},
-    {xk::F4, KEY_F4},
-    {xk::F5, KEY_F5},
-    {xk::F6, KEY_F6},
-    {xk::F7, KEY_F7},
-    {xk::F8, KEY_F8},
-    {xk::F9, KEY_F9},
-    {xk::F10, KEY_F10},
-    {xk::F11, KEY_F11},
-    {xk::F12, KEY_F12},
-    {xk::F13, KEY_F13},
-    {xk::F14, KEY_F14},
-    {xk::F15, KEY_F15},
-    {xk::F16, KEY_F16},
-    {xk::F17, KEY_F17},
-    {xk::F18, KEY_F18},
-    {xk::F19, KEY_F19},
-    {xk::F20, KEY_F20},
-    {xk::F21, KEY_F21},
-    {xk::F22, KEY_F22},
-    {xk::F23, KEY_F23},
-    {xk::F24, KEY_F24},
-
-    {xk::Keypad0, KEY_KP0},
-    {xk::Keypad1, KEY_KP1},
-    {xk::Keypad2, KEY_KP2},
-    {xk::Keypad3, KEY_KP3},
-    {xk::Keypad4, KEY_KP4},
-    {xk::Keypad5, KEY_KP5},
-    {xk::Keypad6, KEY_KP6},
-    {xk::Keypad7, KEY_KP7},
-    {xk::Keypad8, KEY_KP8},
-    {xk::Keypad9, KEY_KP9},
-    {xk::KeypadMultiply, KEY_KPASTERISK},
-    {xk::KeypadSubtract, KEY_KPMINUS},
-    {xk::KeypadAdd, KEY_KPPLUS},
-    {xk::KeypadDecimal, KEY_KPDOT},
-    {xk::KeypadEnter, KEY_KPENTER},
-    {xk::KeypadDivide, KEY_KPSLASH},
-    {xk::KeypadEqual, KEY_KPEQUAL},
-    {xk::PlusMinus, KEY_KPPLUSMINUS},
-
-    {xk::SysReq, KEY_SYSRQ},
-    {xk::LineFeed, KEY_LINEFEED},
-    {xk::Home, KEY_HOME},
-    {xk::Up, KEY_UP},
-    {xk::PageUp, KEY_PAGEUP},
-    {xk::Left, KEY_LEFT},
-    {xk::Right, KEY_RIGHT},
-    {xk::End, KEY_END},
-    {xk::Down, KEY_DOWN},
-    {xk::PageDown, KEY_PAGEDOWN},
-    {xk::Insert, KEY_INSERT},
-    {xk::Delete, KEY_DELETE},
-    {xk::Pause, KEY_PAUSE},
-    {xk::KeypadSeparator, KEY_KPCOMMA},
-    {xk::Yen, KEY_YEN},
-    {xk::Cancel, KEY_STOP},
-    {xk::Redo, KEY_AGAIN},
-    {xk::Undo, KEY_UNDO},
-    {xk::Find, KEY_FIND},
-    {xk::Print, KEY_PRINT},
-    {xk::VolumeDown, KEY_VOLUMEDOWN},
-    {xk::Mute, KEY_MUTE},
-    {xk::VolumeUp, KEY_VOLUMEUP},
-    {xk::Menu, KEY_MENU},
-    {xk::VNCMenu, KEY_MENU},
-};
-
-VirtualKeyboard::VirtualKeyboard(const char* name)
-    : VirtualInputDevice(name, BUS_USB, 0x6006, 0x6008, 1) {
-  std::vector<uint32_t> keycodes(ARRAY_SIZE(key_table));
-  for (size_t i = 0; i < keycodes.size(); ++i) {
-    keymapping_[key_table[i].xk] = key_table[i].input_code;
-    keycodes[i] = key_table[i].input_code;
-  }
-
-  if (!VirtualInputDevice::Init(Senabled_events_, ARRAY_SIZE(Senabled_events_),
-                                &keycodes[0], keycodes.size(), NULL, 0, NULL,
-                                0)) {
-    LOG_FATAL("VirtualInputDevice Init() failed");
-  }
-}
-
-void VirtualKeyboard::GenerateKeyPressEvent(int keycode, bool button_down) {
-  if (keymapping_.count(keycode)) {
-    EmitEvent(EV_KEY, keymapping_[keycode], button_down);
-    EmitEvent(EV_SYN, 0, 0);
-  }
-  ALOGI("Unknown keycode %d", keycode);
-}
-
-//////////////////////////
-// VirtualTouchPad Support
-//////////////////////////
-
-uint32_t VirtualTouchPad::Senabled_events_[] = {EV_ABS, EV_KEY, EV_SYN};
-uint32_t VirtualTouchPad::Senabled_keys_[] = {BTN_TOUCH};
-uint32_t VirtualTouchPad::Senabled_abs_[] = {ABS_X, ABS_Y};
-uint32_t VirtualTouchPad::Senabled_props_[] = {INPUT_PROP_DIRECT};
-
-VirtualTouchPad::VirtualTouchPad(const char* name, int x_res, int y_res)
-    : VirtualInputDevice(name, BUS_USB, 0x6006, 0x6006, 1),
-      x_res_(x_res),
-      y_res_(y_res) {
-  // Customization of uinput_user_dev() must happen before calling our base
-  // Init().
-  uinput_user_dev()->absmin[ABS_X] = 0;
-  uinput_user_dev()->absmax[ABS_X] = x_res_;
-  uinput_user_dev()->absmin[ABS_Y] = 0;
-  uinput_user_dev()->absmax[ABS_Y] = y_res_;
-
-  if (!VirtualInputDevice::Init(Senabled_events_, ARRAY_SIZE(Senabled_events_),
-                                Senabled_keys_, ARRAY_SIZE(Senabled_keys_),
-                                Senabled_abs_, ARRAY_SIZE(Senabled_abs_),
-                                Senabled_props_, ARRAY_SIZE(Senabled_props_))) {
-    LOG_FATAL("VirtualInputDevice Init() failed");
-  }
-}
-
-void VirtualTouchPad::HandlePointerEvent(bool touch_down, int x, int y) {
-  EmitEvent(EV_ABS, ABS_X, x);
-  EmitEvent(EV_ABS, ABS_Y, y);
-  EmitEvent(EV_KEY, BTN_TOUCH, touch_down);
-  EmitEvent(EV_SYN, 0, 0);
-}
-
-//////////////////////////////////
-// Base VirtualInputDevice Support
-//////////////////////////////////
-VirtualInputDevice::VirtualInputDevice(const char* name, uint16_t bus_type,
-                                       uint16_t vendor, uint16_t product,
-                                       uint16_t version)
-    : fd_(-1) {
-  memset(&uinput_user_dev_, 0, sizeof(uinput_user_dev_));
-  strncpy(uinput_user_dev_.name, name, sizeof(uinput_user_dev_.name));
-  uinput_user_dev_.id.bustype = bus_type;
-  uinput_user_dev_.id.vendor = vendor;
-  uinput_user_dev_.id.product = product;
-  uinput_user_dev_.id.version = version;
-}
-
-VirtualInputDevice::~VirtualInputDevice() {
-  if (fd_ != -1) {
-    close(fd_);
-    fd_ = -1;
-  }
-}
-
-bool VirtualInputDevice::Init(uint32_t* events, int num_events, uint32_t* keys,
-                              int num_keys, uint32_t* abs, int num_abs,
-                              uint32_t* props, int num_props) {
-  if ((fd_ = open("/dev/uinput", O_WRONLY | O_NONBLOCK)) < 0) {
-    SLOGE("Failed to open /dev/uinput (%s)", strerror(errno));
-    return false;
-  }
-  if (events && !EnableEventBits(events, num_events)) {
-    SLOGE("Failed to set event bits (%s)", strerror(errno));
-    return false;
-  }
-  if (keys && !EnableKeyBits(keys, num_keys)) {
-    SLOGE("Failed to set key bits (%s)", strerror(errno));
-    return false;
-  }
-  if (abs && !EnableAbsBits(abs, num_abs)) {
-    SLOGE("Failed to set abs bits (%s)", strerror(errno));
-    return false;
-  }
-  if (props && !EnablePropBits(props, num_props)) {
-    SLOGE("Failed to set prop bits (%s)", strerror(errno));
-    return false;
-  }
-  if (!FinalizeDeviceCreation()) {
-    SLOGE("Failed to finalize device creation (%s)", strerror(errno));
-    return false;
-  }
-  return true;
-}
-
-bool VirtualInputDevice::EmitEvent(uint16_t type, uint16_t code,
-                                   uint32_t value) {
-  struct input_event ev;
-  ev.type = type;
-  ev.code = code;
-  ev.value = value;
-  if (write(fd_, &ev, sizeof(ev)) < 0) {
-    SLOGE("write() failed (%s)", strerror(errno));
-    return false;
-  }
-  return true;
-}
-
-bool VirtualInputDevice::DoIoctls(int request, uint32_t* list,
-                                  int num_elements) {
-  for (int i = 0; i < num_elements; i++) {
-    int rc = ioctl(fd_, request, *list++);
-    if (rc < 0) {
-      SLOGE("ioctl failed (%s)", strerror(errno));
-      return false;
-    }
-  }
-  return true;
-}
-
-bool VirtualInputDevice::EnableEventBits(uint32_t* events, int num_elements) {
-  return DoIoctls(UI_SET_EVBIT, events, num_elements);
-}
-
-bool VirtualInputDevice::EnableKeyBits(uint32_t* keys, int num_elements) {
-  return DoIoctls(UI_SET_KEYBIT, keys, num_elements);
-}
-
-bool VirtualInputDevice::EnableAbsBits(uint32_t* abs, int num_elements) {
-  return DoIoctls(UI_SET_ABSBIT, abs, num_elements);
-}
-
-bool VirtualInputDevice::EnablePropBits(uint32_t* props, int num_elements) {
-// JB and ICE do not have the latest uinput headers.
-#ifndef UI_SET_PROPBIT
-#define UI_SET_PROPBIT _IOW(UINPUT_IOCTL_BASE, 110, int)
-#endif  // #ifndef UI_SET_PROPBIT
-  return DoIoctls(UI_SET_PROPBIT, props, num_elements);
-}
-
-bool VirtualInputDevice::FinalizeDeviceCreation() {
-  if (write(fd_, &uinput_user_dev_, sizeof(uinput_user_dev_)) < 0) {
-    SLOGE("Unable to set input device info (%s)", strerror(errno));
-    return false;
-  }
-  if (ioctl(fd_, UI_DEV_CREATE) < 0) {
-    SLOGE("Unable to create input device (%s)", strerror(errno));
-    return false;
-  }
-  return true;
-}
-
-}  // namespace cvd
diff --git a/guest/frontend/vnc_server/VirtualInputDevice.h b/guest/frontend/vnc_server/VirtualInputDevice.h
deleted file mode 100644
index d25f45c..0000000
--- a/guest/frontend/vnc_server/VirtualInputDevice.h
+++ /dev/null
@@ -1,93 +0,0 @@
-#pragma once
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <linux/uinput.h>
-#include <map>
-
-namespace cvd {
-// Base virtual input device class which contains a bunch of boiler-plate code.
-class VirtualInputDevice {
-public:
-  VirtualInputDevice(const char* name, uint16_t bus_type, uint16_t vendor,
-                     uint16_t product, uint16_t version);
-  virtual ~VirtualInputDevice();
-
-protected:
-  bool Init(uint32_t* events, int num_events, uint32_t* keys, int num_keys,
-            uint32_t* abs, int num_abs, uint32_t* props, int num_props);
-
-  bool EmitEvent(uint16_t type, uint16_t code, uint32_t value);
-
-  struct uinput_user_dev* uinput_user_dev() { return &uinput_user_dev_; }
-
-private:
-  bool EnableEventBits(uint32_t* events, int num_elements);
-  bool EnableKeyBits(uint32_t* keys, int num_elements);
-  bool EnableAbsBits(uint32_t* abs, int num_elements);
-  bool EnablePropBits(uint32_t* props, int num_elements);
-  bool DoIoctls(int request, uint32_t* list, int num_elements);
-  bool FinalizeDeviceCreation();
-
-  int fd_;
-  struct uinput_user_dev uinput_user_dev_;
-};
-
-// Virtual touch-pad.
-class VirtualTouchPad : public VirtualInputDevice {
-public:
-  VirtualTouchPad(const char* name, int x_res, int y_res);
-  virtual ~VirtualTouchPad() {}
-
-  void HandlePointerEvent(bool touch_down, int x, int y);
-
-private:
-  static uint32_t Senabled_events_[];
-  static uint32_t Senabled_keys_[];
-  static uint32_t Senabled_abs_[];
-  static uint32_t Senabled_props_[];
-
-  int x_res_;
-  int y_res_;
-};
-
-// Virtual button.
-class VirtualButton : public VirtualInputDevice {
-public:
-  VirtualButton(const char* name, uint32_t input_keycode);
-  virtual ~VirtualButton() {}
-
-  void HandleButtonPressEvent(bool button_down);
-
-private:
-  static uint32_t Senabled_events_[];
-  uint32_t input_keycode_;
-};
-
-// Virtual keyboard.
-class VirtualKeyboard : public VirtualInputDevice {
-public:
-  VirtualKeyboard(const char* name);
-  virtual ~VirtualKeyboard() {}
-
-  void GenerateKeyPressEvent(int code, bool down);
-
-private:
-  static uint32_t Senabled_events_[];
-  std::map<uint32_t, uint32_t> keymapping_;
-};
-
-}  // namespace cvd
diff --git a/guest/frontend/vnc_server/virtual_inputs.cpp b/guest/frontend/vnc_server/virtual_inputs.cpp
index ab4bb7a..bd6ebdd 100644
--- a/guest/frontend/vnc_server/virtual_inputs.cpp
+++ b/guest/frontend/vnc_server/virtual_inputs.cpp
@@ -15,21 +15,228 @@
  */
 
 #include "virtual_inputs.h"
+
+#include <linux/input.h>
+#include <linux/uinput.h>
+
 #include <mutex>
 
-using cvd::vnc::VirtualInputs;
+#include "log/log.h"
 
-void VirtualInputs::GenerateKeyPressEvent(int code, bool down) {
-  std::lock_guard<std::mutex> guard(m_);
-  virtual_keyboard_.GenerateKeyPressEvent(code, down);
+#include "keysyms.h"
+
+using cvd::vnc::VirtualInputs;
+using vsoc::input_events::InputEventsRegionView;
+
+namespace {
+  void AddKeyMappings(std::map<uint32_t, uint32_t>* key_mapping) {
+    (*key_mapping)[cvd::xk::AltLeft] = KEY_LEFTALT;
+    (*key_mapping)[cvd::xk::ControlLeft] = KEY_LEFTCTRL;
+    (*key_mapping)[cvd::xk::ShiftLeft] = KEY_LEFTSHIFT;
+    (*key_mapping)[cvd::xk::AltRight] = KEY_RIGHTALT;
+    (*key_mapping)[cvd::xk::ControlRight] = KEY_RIGHTCTRL;
+    (*key_mapping)[cvd::xk::ShiftRight] = KEY_RIGHTSHIFT;
+    (*key_mapping)[cvd::xk::MetaLeft] = KEY_LEFTMETA;
+    (*key_mapping)[cvd::xk::MetaRight] = KEY_RIGHTMETA;
+    (*key_mapping)[cvd::xk::MultiKey] = KEY_COMPOSE;
+
+    (*key_mapping)[cvd::xk::CapsLock] = KEY_CAPSLOCK;
+    (*key_mapping)[cvd::xk::NumLock] = KEY_NUMLOCK;
+    (*key_mapping)[cvd::xk::ScrollLock] = KEY_SCROLLLOCK;
+
+    (*key_mapping)[cvd::xk::BackSpace] = KEY_BACKSPACE;
+    (*key_mapping)[cvd::xk::Tab] = KEY_TAB;
+    (*key_mapping)[cvd::xk::Return] = KEY_ENTER;
+    (*key_mapping)[cvd::xk::Escape] = KEY_ESC;
+
+    (*key_mapping)[' '] = KEY_SPACE;
+    (*key_mapping)['!'] = KEY_1;
+    (*key_mapping)['"'] = KEY_APOSTROPHE;
+    (*key_mapping)['#'] = KEY_3;
+    (*key_mapping)['$'] = KEY_4;
+    (*key_mapping)['%'] = KEY_5;
+    (*key_mapping)['^'] = KEY_6;
+    (*key_mapping)['&'] = KEY_7;
+    (*key_mapping)['\''] = KEY_APOSTROPHE;
+    (*key_mapping)['('] = KEY_9;
+    (*key_mapping)[')'] = KEY_0;
+    (*key_mapping)['*'] = KEY_8;
+    (*key_mapping)['+'] = KEY_EQUAL;
+    (*key_mapping)[','] = KEY_COMMA;
+    (*key_mapping)['-'] = KEY_MINUS;
+    (*key_mapping)['.'] = KEY_DOT;
+    (*key_mapping)['/'] = KEY_SLASH;
+    (*key_mapping)['0'] = KEY_0;
+    (*key_mapping)['1'] = KEY_1;
+    (*key_mapping)['2'] = KEY_2;
+    (*key_mapping)['3'] = KEY_3;
+    (*key_mapping)['4'] = KEY_4;
+    (*key_mapping)['5'] = KEY_5;
+    (*key_mapping)['6'] = KEY_6;
+    (*key_mapping)['7'] = KEY_7;
+    (*key_mapping)['8'] = KEY_8;
+    (*key_mapping)['9'] = KEY_9;
+    (*key_mapping)[':'] = KEY_SEMICOLON;
+    (*key_mapping)[';'] = KEY_SEMICOLON;
+    (*key_mapping)['<'] = KEY_COMMA;
+    (*key_mapping)['='] = KEY_EQUAL;
+    (*key_mapping)['>'] = KEY_DOT;
+    (*key_mapping)['?'] = KEY_SLASH;
+    (*key_mapping)['@'] = KEY_2;
+    (*key_mapping)['A'] = KEY_A;
+    (*key_mapping)['B'] = KEY_B;
+    (*key_mapping)['C'] = KEY_C;
+    (*key_mapping)['D'] = KEY_D;
+    (*key_mapping)['E'] = KEY_E;
+    (*key_mapping)['F'] = KEY_F;
+    (*key_mapping)['G'] = KEY_G;
+    (*key_mapping)['H'] = KEY_H;
+    (*key_mapping)['I'] = KEY_I;
+    (*key_mapping)['J'] = KEY_J;
+    (*key_mapping)['K'] = KEY_K;
+    (*key_mapping)['L'] = KEY_L;
+    (*key_mapping)['M'] = KEY_M;
+    (*key_mapping)['N'] = KEY_N;
+    (*key_mapping)['O'] = KEY_O;
+    (*key_mapping)['P'] = KEY_P;
+    (*key_mapping)['Q'] = KEY_Q;
+    (*key_mapping)['R'] = KEY_R;
+    (*key_mapping)['S'] = KEY_S;
+    (*key_mapping)['T'] = KEY_T;
+    (*key_mapping)['U'] = KEY_U;
+    (*key_mapping)['V'] = KEY_V;
+    (*key_mapping)['W'] = KEY_W;
+    (*key_mapping)['X'] = KEY_X;
+    (*key_mapping)['Y'] = KEY_Y;
+    (*key_mapping)['Z'] = KEY_Z;
+    (*key_mapping)['['] = KEY_LEFTBRACE;
+    (*key_mapping)['\\'] = KEY_BACKSLASH;
+    (*key_mapping)[']'] = KEY_RIGHTBRACE;
+    (*key_mapping)['-'] = KEY_MINUS;
+    (*key_mapping)['_'] = KEY_MINUS;
+    (*key_mapping)['`'] = KEY_GRAVE;
+    (*key_mapping)['a'] = KEY_A;
+    (*key_mapping)['b'] = KEY_B;
+    (*key_mapping)['c'] = KEY_C;
+    (*key_mapping)['d'] = KEY_D;
+    (*key_mapping)['e'] = KEY_E;
+    (*key_mapping)['f'] = KEY_F;
+    (*key_mapping)['g'] = KEY_G;
+    (*key_mapping)['h'] = KEY_H;
+    (*key_mapping)['i'] = KEY_I;
+    (*key_mapping)['j'] = KEY_J;
+    (*key_mapping)['k'] = KEY_K;
+    (*key_mapping)['l'] = KEY_L;
+    (*key_mapping)['m'] = KEY_M;
+    (*key_mapping)['n'] = KEY_N;
+    (*key_mapping)['o'] = KEY_O;
+    (*key_mapping)['p'] = KEY_P;
+    (*key_mapping)['q'] = KEY_Q;
+    (*key_mapping)['r'] = KEY_R;
+    (*key_mapping)['s'] = KEY_S;
+    (*key_mapping)['t'] = KEY_T;
+    (*key_mapping)['u'] = KEY_U;
+    (*key_mapping)['v'] = KEY_V;
+    (*key_mapping)['w'] = KEY_W;
+    (*key_mapping)['x'] = KEY_X;
+    (*key_mapping)['y'] = KEY_Y;
+    (*key_mapping)['z'] = KEY_Z;
+    (*key_mapping)['{'] = KEY_LEFTBRACE;
+    (*key_mapping)['\\'] = KEY_BACKSLASH;
+    (*key_mapping)['|'] = KEY_BACKSLASH;
+    (*key_mapping)['}'] = KEY_RIGHTBRACE;
+    (*key_mapping)['~'] = KEY_GRAVE;
+
+    (*key_mapping)[cvd::xk::F1] = KEY_F1;
+    (*key_mapping)[cvd::xk::F2] = KEY_F2;
+    (*key_mapping)[cvd::xk::F3] = KEY_F3;
+    (*key_mapping)[cvd::xk::F4] = KEY_F4;
+    (*key_mapping)[cvd::xk::F5] = KEY_F5;
+    (*key_mapping)[cvd::xk::F6] = KEY_F6;
+    (*key_mapping)[cvd::xk::F7] = KEY_F7;
+    (*key_mapping)[cvd::xk::F8] = KEY_F8;
+    (*key_mapping)[cvd::xk::F9] = KEY_F9;
+    (*key_mapping)[cvd::xk::F10] = KEY_F10;
+    (*key_mapping)[cvd::xk::F11] = KEY_F11;
+    (*key_mapping)[cvd::xk::F12] = KEY_F12;
+    (*key_mapping)[cvd::xk::F13] = KEY_F13;
+    (*key_mapping)[cvd::xk::F14] = KEY_F14;
+    (*key_mapping)[cvd::xk::F15] = KEY_F15;
+    (*key_mapping)[cvd::xk::F16] = KEY_F16;
+    (*key_mapping)[cvd::xk::F17] = KEY_F17;
+    (*key_mapping)[cvd::xk::F18] = KEY_F18;
+    (*key_mapping)[cvd::xk::F19] = KEY_F19;
+    (*key_mapping)[cvd::xk::F20] = KEY_F20;
+    (*key_mapping)[cvd::xk::F21] = KEY_F21;
+    (*key_mapping)[cvd::xk::F22] = KEY_F22;
+    (*key_mapping)[cvd::xk::F23] = KEY_F23;
+    (*key_mapping)[cvd::xk::F24] = KEY_F24;
+
+    (*key_mapping)[cvd::xk::Keypad0] = KEY_KP0;
+    (*key_mapping)[cvd::xk::Keypad1] = KEY_KP1;
+    (*key_mapping)[cvd::xk::Keypad2] = KEY_KP2;
+    (*key_mapping)[cvd::xk::Keypad3] = KEY_KP3;
+    (*key_mapping)[cvd::xk::Keypad4] = KEY_KP4;
+    (*key_mapping)[cvd::xk::Keypad5] = KEY_KP5;
+    (*key_mapping)[cvd::xk::Keypad6] = KEY_KP6;
+    (*key_mapping)[cvd::xk::Keypad7] = KEY_KP7;
+    (*key_mapping)[cvd::xk::Keypad8] = KEY_KP8;
+    (*key_mapping)[cvd::xk::Keypad9] = KEY_KP9;
+    (*key_mapping)[cvd::xk::KeypadMultiply] = KEY_KPASTERISK;
+    (*key_mapping)[cvd::xk::KeypadSubtract] = KEY_KPMINUS;
+    (*key_mapping)[cvd::xk::KeypadAdd] = KEY_KPPLUS;
+    (*key_mapping)[cvd::xk::KeypadDecimal] = KEY_KPDOT;
+    (*key_mapping)[cvd::xk::KeypadEnter] = KEY_KPENTER;
+    (*key_mapping)[cvd::xk::KeypadDivide] = KEY_KPSLASH;
+    (*key_mapping)[cvd::xk::KeypadEqual] = KEY_KPEQUAL;
+    (*key_mapping)[cvd::xk::PlusMinus] = KEY_KPPLUSMINUS;
+
+    (*key_mapping)[cvd::xk::SysReq] = KEY_SYSRQ;
+    (*key_mapping)[cvd::xk::LineFeed] = KEY_LINEFEED;
+    (*key_mapping)[cvd::xk::Home] = KEY_HOME;
+    (*key_mapping)[cvd::xk::Up] = KEY_UP;
+    (*key_mapping)[cvd::xk::PageUp] = KEY_PAGEUP;
+    (*key_mapping)[cvd::xk::Left] = KEY_LEFT;
+    (*key_mapping)[cvd::xk::Right] = KEY_RIGHT;
+    (*key_mapping)[cvd::xk::End] = KEY_END;
+    (*key_mapping)[cvd::xk::Down] = KEY_DOWN;
+    (*key_mapping)[cvd::xk::PageDown] = KEY_PAGEDOWN;
+    (*key_mapping)[cvd::xk::Insert] = KEY_INSERT;
+    (*key_mapping)[cvd::xk::Delete] = KEY_DELETE;
+    (*key_mapping)[cvd::xk::Pause] = KEY_PAUSE;
+    (*key_mapping)[cvd::xk::KeypadSeparator] = KEY_KPCOMMA;
+    (*key_mapping)[cvd::xk::Yen] = KEY_YEN;
+    (*key_mapping)[cvd::xk::Cancel] = KEY_STOP;
+    (*key_mapping)[cvd::xk::Redo] = KEY_AGAIN;
+    (*key_mapping)[cvd::xk::Undo] = KEY_UNDO;
+    (*key_mapping)[cvd::xk::Find] = KEY_FIND;
+    (*key_mapping)[cvd::xk::Print] = KEY_PRINT;
+    (*key_mapping)[cvd::xk::VolumeDown] = KEY_VOLUMEDOWN;
+    (*key_mapping)[cvd::xk::Mute] = KEY_MUTE;
+    (*key_mapping)[cvd::xk::VolumeUp] = KEY_VOLUMEUP;
+    (*key_mapping)[cvd::xk::Menu] = KEY_MENU;
+    (*key_mapping)[cvd::xk::VNCMenu] = KEY_MENU;
+  }
+}
+
+VirtualInputs::VirtualInputs() {
+  bool open = input_events_region_view_.Open();
+  LOG_FATAL_IF(!open, "Failed to open Input events region view");
+  AddKeyMappings(&keymapping_);
+}
+
+void VirtualInputs::GenerateKeyPressEvent(int key_code, bool down) {
+  if (keymapping_.count(key_code)) {
+    input_events_region_view_.HandleKeyboardEvent(down, keymapping_[key_code]);
+  } else {
+    ALOGI("Unknown keycode %d", key_code);
+  }
 }
 
 void VirtualInputs::PressPowerButton(bool down) {
-  std::lock_guard<std::mutex> guard(m_);
-  virtual_power_button_.HandleButtonPressEvent(down);
+  input_events_region_view_.HandlePowerButtonEvent(down);
 }
 
 void VirtualInputs::HandlePointerEvent(bool touch_down, int x, int y) {
-  std::lock_guard<std::mutex> guard(m_);
-  virtual_touch_pad_.HandlePointerEvent(touch_down, x, y);
+  input_events_region_view_.HandleSingleTouchEvent(touch_down, x, y);
 }
diff --git a/guest/frontend/vnc_server/virtual_inputs.h b/guest/frontend/vnc_server/virtual_inputs.h
index 4b24d39..fa989a9 100644
--- a/guest/frontend/vnc_server/virtual_inputs.h
+++ b/guest/frontend/vnc_server/virtual_inputs.h
@@ -15,29 +15,27 @@
  * limitations under the License.
  */
 
-#include "VirtualInputDevice.h"
 #include "vnc_utils.h"
 
-#include <linux/input.h>
-#include <android-base/thread_annotations.h>
-
+#include <map>
 #include <mutex>
 
+#include "common/vsoc/lib/input_events_region_view.h"
+
 namespace cvd {
 namespace vnc {
 
 class VirtualInputs {
  public:
+  VirtualInputs();
+
   void GenerateKeyPressEvent(int code, bool down);
   void PressPowerButton(bool down);
   void HandlePointerEvent(bool touch_down, int x, int y);
 
  private:
-  std::mutex m_;
-  VirtualKeyboard virtual_keyboard_ GUARDED_BY(m_){"remote-keyboard"};
-  VirtualTouchPad virtual_touch_pad_ GUARDED_BY(m_){
-      "remote-touchpad", ActualScreenWidth(), ActualScreenHeight()};
-  VirtualButton virtual_power_button_ GUARDED_BY(m_){"remote-power", KEY_POWER};
+  vsoc::input_events::InputEventsRegionView input_events_region_view_;
+  std::map<uint32_t, uint32_t> keymapping_;
 };
 
 }  // namespace vnc