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