Bring back input support for the currently active window

This commit is contained in:
Simon Fels 2016-11-09 17:13:58 +01:00
commit 1d2c2814ac
8 changed files with 454 additions and 7 deletions

View file

@ -119,6 +119,7 @@ set(SOURCES
anbox/ubuntu/platform_api_skeleton.cpp
anbox/ubuntu/window_creator.cpp
anbox/ubuntu/window.cpp
anbox/ubuntu/keycode_converter.cpp
anbox/dbus/interface.h
anbox/dbus/skeleton/service.cpp

View file

@ -140,7 +140,7 @@ anbox::cmds::Run::Run(const BusFactory& bus_factory)
// { qemud_connector->socket_file(), "/dev/qemud" },
{ qemu_pipe_connector->socket_file(), "/dev/qemu_pipe" },
{ bridge_connector->socket_file(), "/dev/anbox_bridge" },
{ "/dev/input", "/dev/input" },
{ config::host_input_device_path(), "/dev/input" },
{ "/dev/binder", "/dev/binder" },
{ "/dev/ashmem", "/dev/ashmem" },
};

View file

@ -0,0 +1,284 @@
/*
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "anbox/ubuntu/keycode_converter.h"
#include <linux/input.h>
namespace anbox {
namespace ubuntu {
std::uint16_t KeycodeConverter::convert(const SDL_Scancode &scan_code) {
for (std::uint16_t n = 0; n < code_map.size(); n++) {
if (code_map[n] == scan_code)
return n;
}
return KEY_RESERVED;
}
const std::array<SDL_Scancode, 249> KeycodeConverter::code_map = {{
SDL_SCANCODE_UNKNOWN, /* KEY_RESERVED 0 */
SDL_SCANCODE_ESCAPE, /* KEY_ESC 1 */
SDL_SCANCODE_1, /* KEY_1 2 */
SDL_SCANCODE_2, /* KEY_2 3 */
SDL_SCANCODE_3, /* KEY_3 4 */
SDL_SCANCODE_4, /* KEY_4 5 */
SDL_SCANCODE_5, /* KEY_5 6 */
SDL_SCANCODE_6, /* KEY_6 7 */
SDL_SCANCODE_7, /* KEY_7 8 */
SDL_SCANCODE_8, /* KEY_8 9 */
SDL_SCANCODE_9, /* KEY_9 10 */
SDL_SCANCODE_0, /* KEY_0 11 */
SDL_SCANCODE_MINUS, /* KEY_MINUS 12 */
SDL_SCANCODE_EQUALS, /* KEY_EQUAL 13 */
SDL_SCANCODE_BACKSPACE, /* KEY_BACKSPACE 14 */
SDL_SCANCODE_TAB, /* KEY_TAB 15 */
SDL_SCANCODE_Q, /* KEY_Q 16 */
SDL_SCANCODE_W, /* KEY_W 17 */
SDL_SCANCODE_E, /* KEY_E 18 */
SDL_SCANCODE_R, /* KEY_R 19 */
SDL_SCANCODE_T, /* KEY_T 20 */
SDL_SCANCODE_Y, /* KEY_Y 21 */
SDL_SCANCODE_U, /* KEY_U 22 */
SDL_SCANCODE_I, /* KEY_I 23 */
SDL_SCANCODE_O, /* KEY_O 24 */
SDL_SCANCODE_P, /* KEY_P 25 */
SDL_SCANCODE_LEFTBRACKET, /* KEY_LEFTBRACE 26 */
SDL_SCANCODE_RIGHTBRACKET, /* KEY_RIGHTBRACE 27 */
SDL_SCANCODE_RETURN, /* KEY_ENTER 28 */
SDL_SCANCODE_LCTRL, /* KEY_LEFTCTRL 29 */
SDL_SCANCODE_A, /* KEY_A 30 */
SDL_SCANCODE_S, /* KEY_S 31 */
SDL_SCANCODE_D, /* KEY_D 32 */
SDL_SCANCODE_F, /* KEY_F 33 */
SDL_SCANCODE_G, /* KEY_G 34 */
SDL_SCANCODE_H, /* KEY_H 35 */
SDL_SCANCODE_J, /* KEY_J 36 */
SDL_SCANCODE_K, /* KEY_K 37 */
SDL_SCANCODE_L, /* KEY_L 38 */
SDL_SCANCODE_SEMICOLON, /* KEY_SEMICOLON 39 */
SDL_SCANCODE_APOSTROPHE, /* KEY_APOSTROPHE 40 */
SDL_SCANCODE_GRAVE, /* KEY_GRAVE 41 */
SDL_SCANCODE_LSHIFT, /* KEY_LEFTSHIFT 42 */
SDL_SCANCODE_BACKSLASH, /* KEY_BACKSLASH 43 */
SDL_SCANCODE_Z, /* KEY_Z 44 */
SDL_SCANCODE_X, /* KEY_X 45 */
SDL_SCANCODE_C, /* KEY_C 46 */
SDL_SCANCODE_V, /* KEY_V 47 */
SDL_SCANCODE_B, /* KEY_B 48 */
SDL_SCANCODE_N, /* KEY_N 49 */
SDL_SCANCODE_M, /* KEY_M 50 */
SDL_SCANCODE_COMMA, /* KEY_COMMA 51 */
SDL_SCANCODE_PERIOD, /* KEY_DOT 52 */
SDL_SCANCODE_SLASH, /* KEY_SLASH 53 */
SDL_SCANCODE_RSHIFT, /* KEY_RIGHTSHIFT 54 */
SDL_SCANCODE_KP_MULTIPLY, /* KEY_KPASTERISK 55 */
SDL_SCANCODE_LALT, /* KEY_LEFTALT 56 */
SDL_SCANCODE_SPACE, /* KEY_SPACE 57 */
SDL_SCANCODE_CAPSLOCK, /* KEY_CAPSLOCK 58 */
SDL_SCANCODE_F1, /* KEY_F1 59 */
SDL_SCANCODE_F2, /* KEY_F2 60 */
SDL_SCANCODE_F3, /* KEY_F3 61 */
SDL_SCANCODE_F4, /* KEY_F4 62 */
SDL_SCANCODE_F5, /* KEY_F5 63 */
SDL_SCANCODE_F6, /* KEY_F6 64 */
SDL_SCANCODE_F7, /* KEY_F7 65 */
SDL_SCANCODE_F8, /* KEY_F8 66 */
SDL_SCANCODE_F9, /* KEY_F9 67 */
SDL_SCANCODE_F10, /* KEY_F10 68 */
SDL_SCANCODE_NUMLOCKCLEAR, /* KEY_NUMLOCK 69 */
SDL_SCANCODE_SCROLLLOCK, /* KEY_SCROLLLOCK 70 */
SDL_SCANCODE_KP_7, /* KEY_KP7 71 */
SDL_SCANCODE_KP_8, /* KEY_KP8 72 */
SDL_SCANCODE_KP_9, /* KEY_KP9 73 */
SDL_SCANCODE_KP_MINUS, /* KEY_KPMINUS 74 */
SDL_SCANCODE_KP_4, /* KEY_KP4 75 */
SDL_SCANCODE_KP_5, /* KEY_KP5 76 */
SDL_SCANCODE_KP_6, /* KEY_KP6 77 */
SDL_SCANCODE_KP_PLUS, /* KEY_KPPLUS 78 */
SDL_SCANCODE_KP_1, /* KEY_KP1 79 */
SDL_SCANCODE_KP_2, /* KEY_KP2 80 */
SDL_SCANCODE_KP_3, /* KEY_KP3 81 */
SDL_SCANCODE_KP_0, /* KEY_KP0 82 */
SDL_SCANCODE_KP_PERIOD, /* KEY_KPDOT 83 */
SDL_SCANCODE_UNKNOWN, /* 84 */
SDL_SCANCODE_LANG5, /* KEY_ZENKAKUHANKAKU 85 */
SDL_SCANCODE_UNKNOWN, /* KEY_102ND 86 */
SDL_SCANCODE_F11, /* KEY_F11 87 */
SDL_SCANCODE_F12, /* KEY_F12 88 */
SDL_SCANCODE_UNKNOWN, /* KEY_RO 89 */
SDL_SCANCODE_LANG3, /* KEY_KATAKANA 90 */
SDL_SCANCODE_LANG4, /* KEY_HIRAGANA 91 */
SDL_SCANCODE_UNKNOWN, /* KEY_HENKAN 92 */
SDL_SCANCODE_LANG3, /* KEY_KATAKANAHIRAGANA 93 */
SDL_SCANCODE_UNKNOWN, /* KEY_MUHENKAN 94 */
SDL_SCANCODE_KP_COMMA, /* KEY_KPJPCOMMA 95 */
SDL_SCANCODE_KP_ENTER, /* KEY_KPENTER 96 */
SDL_SCANCODE_RCTRL, /* KEY_RIGHTCTRL 97 */
SDL_SCANCODE_KP_DIVIDE, /* KEY_KPSLASH 98 */
SDL_SCANCODE_SYSREQ, /* KEY_SYSRQ 99 */
SDL_SCANCODE_RALT, /* KEY_RIGHTALT 100 */
SDL_SCANCODE_UNKNOWN, /* KEY_LINEFEED 101 */
SDL_SCANCODE_HOME, /* KEY_HOME 102 */
SDL_SCANCODE_UP, /* KEY_UP 103 */
SDL_SCANCODE_PAGEUP, /* KEY_PAGEUP 104 */
SDL_SCANCODE_LEFT, /* KEY_LEFT 105 */
SDL_SCANCODE_RIGHT, /* KEY_RIGHT 106 */
SDL_SCANCODE_END, /* KEY_END 107 */
SDL_SCANCODE_DOWN, /* KEY_DOWN 108 */
SDL_SCANCODE_PAGEDOWN, /* KEY_PAGEDOWN 109 */
SDL_SCANCODE_INSERT, /* KEY_INSERT 110 */
SDL_SCANCODE_DELETE, /* KEY_DELETE 111 */
SDL_SCANCODE_UNKNOWN, /* KEY_MACRO 112 */
SDL_SCANCODE_MUTE, /* KEY_MUTE 113 */
SDL_SCANCODE_VOLUMEDOWN, /* KEY_VOLUMEDOWN 114 */
SDL_SCANCODE_VOLUMEUP, /* KEY_VOLUMEUP 115 */
SDL_SCANCODE_POWER, /* KEY_POWER 116 SC System Power Down */
SDL_SCANCODE_KP_EQUALS, /* KEY_KPEQUAL 117 */
SDL_SCANCODE_KP_MINUS, /* KEY_KPPLUSMINUS 118 */
SDL_SCANCODE_PAUSE, /* KEY_PAUSE 119 */
SDL_SCANCODE_UNKNOWN, /* KEY_SCALE 120 AL Compiz Scale (Expose) */
SDL_SCANCODE_KP_COMMA, /* KEY_KPCOMMA 121 */
SDL_SCANCODE_LANG1, /* KEY_HANGEUL,KEY_HANGUEL 122 */
SDL_SCANCODE_LANG2, /* KEY_HANJA 123 */
SDL_SCANCODE_INTERNATIONAL3,/* KEY_YEN 124 */
SDL_SCANCODE_LGUI, /* KEY_LEFTMETA 125 */
SDL_SCANCODE_RGUI, /* KEY_RIGHTMETA 126 */
SDL_SCANCODE_APPLICATION, /* KEY_COMPOSE 127 */
SDL_SCANCODE_STOP, /* KEY_STOP 128 AC Stop */
SDL_SCANCODE_AGAIN, /* KEY_AGAIN 129 */
SDL_SCANCODE_UNKNOWN, /* KEY_PROPS 130 AC Properties */
SDL_SCANCODE_UNDO, /* KEY_UNDO 131 AC Undo */
SDL_SCANCODE_UNKNOWN, /* KEY_FRONT 132 */
SDL_SCANCODE_COPY, /* KEY_COPY 133 AC Copy */
SDL_SCANCODE_UNKNOWN, /* KEY_OPEN 134 AC Open */
SDL_SCANCODE_PASTE, /* KEY_PASTE 135 AC Paste */
SDL_SCANCODE_FIND, /* KEY_FIND 136 AC Search */
SDL_SCANCODE_CUT, /* KEY_CUT 137 AC Cut */
SDL_SCANCODE_HELP, /* KEY_HELP 138 AL Integrated Help Center */
SDL_SCANCODE_MENU, /* KEY_MENU 139 Menu (show menu) */
SDL_SCANCODE_CALCULATOR, /* KEY_CALC 140 AL Calculator */
SDL_SCANCODE_UNKNOWN, /* KEY_SETUP 141 */
SDL_SCANCODE_SLEEP, /* KEY_SLEEP 142 SC System Sleep */
SDL_SCANCODE_UNKNOWN, /* KEY_WAKEUP 143 System Wake Up */
SDL_SCANCODE_UNKNOWN, /* KEY_FILE 144 AL Local Machine Browser */
SDL_SCANCODE_UNKNOWN, /* KEY_SENDFILE 145 */
SDL_SCANCODE_UNKNOWN, /* KEY_DELETEFILE 146 */
SDL_SCANCODE_UNKNOWN, /* KEY_XFER 147 */
SDL_SCANCODE_APP1, /* KEY_PROG1 148 */
SDL_SCANCODE_APP1, /* KEY_PROG2 149 */
SDL_SCANCODE_WWW, /* KEY_WWW 150 AL Internet Browser */
SDL_SCANCODE_UNKNOWN, /* KEY_MSDOS 151 */
SDL_SCANCODE_UNKNOWN, /* KEY_COFFEE,KEY_SCREENLOCK 152 AL Terminal Lock/Screensaver */
SDL_SCANCODE_UNKNOWN, /* KEY_DIRECTION 153 */
SDL_SCANCODE_UNKNOWN, /* KEY_CYCLEWINDOWS 154 */
SDL_SCANCODE_MAIL, /* KEY_MAIL 155 */
SDL_SCANCODE_AC_BOOKMARKS, /* KEY_BOOKMARKS 156 AC Bookmarks */
SDL_SCANCODE_COMPUTER, /* KEY_COMPUTER 157 */
SDL_SCANCODE_AC_BACK, /* KEY_BACK 158 AC Back */
SDL_SCANCODE_AC_FORWARD, /* KEY_FORWARD 159 AC Forward */
SDL_SCANCODE_UNKNOWN, /* KEY_CLOSECD 160 */
SDL_SCANCODE_EJECT, /* KEY_EJECTCD 161 */
SDL_SCANCODE_UNKNOWN, /* KEY_EJECTCLOSECD 162 */
SDL_SCANCODE_AUDIONEXT, /* KEY_NEXTSONG 163 */
SDL_SCANCODE_AUDIOPLAY, /* KEY_PLAYPAUSE 164 */
SDL_SCANCODE_AUDIOPREV, /* KEY_PREVIOUSSONG 165 */
SDL_SCANCODE_AUDIOSTOP, /* KEY_STOPCD 166 */
SDL_SCANCODE_UNKNOWN, /* KEY_RECORD 167 */
SDL_SCANCODE_UNKNOWN, /* KEY_REWIND 168 */
SDL_SCANCODE_UNKNOWN, /* KEY_PHONE 169 Media Select Telephone */
SDL_SCANCODE_UNKNOWN, /* KEY_ISO 170 */
SDL_SCANCODE_UNKNOWN, /* KEY_CONFIG 171 AL Consumer Control Configuration */
SDL_SCANCODE_AC_HOME, /* KEY_HOMEPAGE 172 AC Home */
SDL_SCANCODE_AC_REFRESH, /* KEY_REFRESH 173 AC Refresh */
SDL_SCANCODE_UNKNOWN, /* KEY_EXIT 174 AC Exit */
SDL_SCANCODE_UNKNOWN, /* KEY_MOVE 175 */
SDL_SCANCODE_UNKNOWN, /* KEY_EDIT 176 */
SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLUP 177 */
SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLDOWN 178 */
SDL_SCANCODE_KP_LEFTPAREN, /* KEY_KPLEFTPAREN 179 */
SDL_SCANCODE_KP_RIGHTPAREN, /* KEY_KPRIGHTPAREN 180 */
SDL_SCANCODE_UNKNOWN, /* KEY_NEW 181 AC New */
SDL_SCANCODE_AGAIN, /* KEY_REDO 182 AC Redo/Repeat */
SDL_SCANCODE_F13, /* KEY_F13 183 */
SDL_SCANCODE_F14, /* KEY_F14 184 */
SDL_SCANCODE_F15, /* KEY_F15 185 */
SDL_SCANCODE_F16, /* KEY_F16 186 */
SDL_SCANCODE_F17, /* KEY_F17 187 */
SDL_SCANCODE_F18, /* KEY_F18 188 */
SDL_SCANCODE_F19, /* KEY_F19 189 */
SDL_SCANCODE_F20, /* KEY_F20 190 */
SDL_SCANCODE_F21, /* KEY_F21 191 */
SDL_SCANCODE_F22, /* KEY_F22 192 */
SDL_SCANCODE_F23, /* KEY_F23 193 */
SDL_SCANCODE_F24, /* KEY_F24 194 */
SDL_SCANCODE_UNKNOWN, /* 195 */
SDL_SCANCODE_UNKNOWN, /* 196 */
SDL_SCANCODE_UNKNOWN, /* 197 */
SDL_SCANCODE_UNKNOWN, /* 198 */
SDL_SCANCODE_UNKNOWN, /* 199 */
SDL_SCANCODE_UNKNOWN, /* KEY_PLAYCD 200 */
SDL_SCANCODE_UNKNOWN, /* KEY_PAUSECD 201 */
SDL_SCANCODE_UNKNOWN, /* KEY_PROG3 202 */
SDL_SCANCODE_UNKNOWN, /* KEY_PROG4 203 */
SDL_SCANCODE_UNKNOWN, /* KEY_DASHBOARD 204 AL Dashboard */
SDL_SCANCODE_UNKNOWN, /* KEY_SUSPEND 205 */
SDL_SCANCODE_UNKNOWN, /* KEY_CLOSE 206 AC Close */
SDL_SCANCODE_UNKNOWN, /* KEY_PLAY 207 */
SDL_SCANCODE_UNKNOWN, /* KEY_FASTFORWARD 208 */
SDL_SCANCODE_UNKNOWN, /* KEY_BASSBOOST 209 */
SDL_SCANCODE_UNKNOWN, /* KEY_PRINT 210 AC Print */
SDL_SCANCODE_UNKNOWN, /* KEY_HP 211 */
SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA 212 */
SDL_SCANCODE_UNKNOWN, /* KEY_SOUND 213 */
SDL_SCANCODE_UNKNOWN, /* KEY_QUESTION 214 */
SDL_SCANCODE_UNKNOWN, /* KEY_EMAIL 215 */
SDL_SCANCODE_UNKNOWN, /* KEY_CHAT 216 */
SDL_SCANCODE_UNKNOWN, /* KEY_SEARCH 217 */
SDL_SCANCODE_UNKNOWN, /* KEY_CONNECT 218 */
SDL_SCANCODE_UNKNOWN, /* KEY_FINANCE 219 AL Checkbook/Finance */
SDL_SCANCODE_UNKNOWN, /* KEY_SPORT 220 */
SDL_SCANCODE_UNKNOWN, /* KEY_SHOP 221 */
SDL_SCANCODE_UNKNOWN, /* KEY_ALTERASE 222 */
SDL_SCANCODE_UNKNOWN, /* KEY_CANCEL 223 AC Cancel */
SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESSDOWN 224 */
SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESSUP 225 */
SDL_SCANCODE_UNKNOWN, /* KEY_MEDIA 226 */
SDL_SCANCODE_UNKNOWN, /* KEY_SWITCHVIDEOMODE 227 Cycle between available video outputs (Monitor/LCD/TV-out/etc) */
SDL_SCANCODE_UNKNOWN, /* KEY_KBDILLUMTOGGLE 228 */
SDL_SCANCODE_UNKNOWN, /* KEY_KBDILLUMDOWN 229 */
SDL_SCANCODE_UNKNOWN, /* KEY_KBDILLUMUP 230 */
SDL_SCANCODE_UNKNOWN, /* KEY_SEND 231 AC Send */
SDL_SCANCODE_UNKNOWN, /* KEY_REPLY 232 AC Reply */
SDL_SCANCODE_UNKNOWN, /* KEY_FORWARDMAIL 233 AC Forward Msg */
SDL_SCANCODE_UNKNOWN, /* KEY_SAVE 234 AC Save */
SDL_SCANCODE_UNKNOWN, /* KEY_DOCUMENTS 235 */
SDL_SCANCODE_UNKNOWN, /* KEY_BATTERY 236 */
SDL_SCANCODE_UNKNOWN, /* KEY_BLUETOOTH 237 */
SDL_SCANCODE_UNKNOWN, /* KEY_WLAN 238 */
SDL_SCANCODE_UNKNOWN, /* KEY_UWB 239 */
SDL_SCANCODE_UNKNOWN, /* KEY_UNKNOWN 240 */
SDL_SCANCODE_UNKNOWN, /* KEY_VIDEO_NEXT 241 drive next video source */
SDL_SCANCODE_UNKNOWN, /* KEY_VIDEO_PREV 242 drive previous video source */
SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESS_CYCLE 243 brightness up, after max is min */
SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESS_ZERO 244 brightness off, use ambient */
SDL_SCANCODE_UNKNOWN, /* KEY_DISPLAY_OFF 245 display device to off state */
SDL_SCANCODE_UNKNOWN, /* KEY_WIMAX 246 */
SDL_SCANCODE_UNKNOWN, /* KEY_RFKILL 247 Key that controls all radios */
SDL_SCANCODE_UNKNOWN /* KEY_MICMUTE 248 Mute / unmute the microphone */
}};
} // namespace ubuntu
} // namespace anbox

View file

@ -0,0 +1,38 @@
/*
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef ANBOX_UBUNTU_KEYCODE_CONVERTER_H_
#define ANBOX_UBUNTU_KEYCODE_CONVERTER_H_
#include <SDL_scancode.h>
#include <cstdint>
#include <array>
namespace anbox {
namespace ubuntu {
class KeycodeConverter {
public:
static std::uint16_t convert(const SDL_Scancode &scan_code);
private:
static const std::array<SDL_Scancode, 249> code_map;
};
} // namespace ubuntu
} // namespace anbox
#endif

View file

@ -70,8 +70,31 @@ int Window::update_position(int x, int y) {
SDL_SetWindowPosition(window_, x, y);
}
void Window::process_event(const SDL_Event &event) {
switch (event.window.type) {
case SDL_WINDOWEVENT_FOCUS_GAINED:
break;
case SDL_WINDOWEVENT_FOCUS_LOST:
break;
case SDL_WINDOWEVENT_RESIZED:
break;
case SDL_WINDOWEVENT_SIZE_CHANGED:
break;
case SDL_WINDOWEVENT_MOVED:
break;
case SDL_WINDOWEVENT_SHOWN:
break;
case SDL_WINDOWEVENT_HIDDEN:
break;
}
}
EGLNativeWindowType Window::native_window() const {
return native_window_;
}
std::uint32_t Window::id() const {
return SDL_GetWindowID(window_);
}
} // namespace bridge
} // namespace anbox

View file

@ -35,7 +35,10 @@ public:
void resize(int width, int height);
int update_position(int x, int y);
void process_event(const SDL_Event &event);
EGLNativeWindowType native_window() const;
std::uint32_t id() const;
private:
EGLNativeDisplayType native_display_;

View file

@ -17,6 +17,7 @@
#include "anbox/ubuntu/window_creator.h"
#include "anbox/ubuntu/window.h"
#include "anbox/ubuntu/keycode_converter.h"
#include "anbox/input/manager.h"
#include "anbox/input/device.h"
#include "anbox/logger.h"
@ -46,6 +47,28 @@ WindowCreator::WindowCreator(const std::shared_ptr<input::Manager> &input_manage
display_info_.horizontal_resolution = display_mode.w;
display_info_.vertical_resolution = display_mode.h;
}
pointer_ = input_manager->create_device();
pointer_->set_name("anbox-pointer");
pointer_->set_driver_version(1);
pointer_->set_input_id({ BUS_VIRTUAL, 2, 2, 2 });
pointer_->set_physical_location("none");
pointer_->set_key_bit(BTN_MOUSE);
// NOTE: We don't use REL_X/REL_Y in reality but have to specify them here
// to allow InputFlinger to detect we're a cursor device.
pointer_->set_rel_bit(REL_X);
pointer_->set_rel_bit(REL_Y);
pointer_->set_rel_bit(REL_HWHEEL);
pointer_->set_rel_bit(REL_WHEEL);
pointer_->set_prop_bit(INPUT_PROP_POINTER);
keyboard_ = input_manager->create_device();
keyboard_->set_name("anbox-keyboard");
keyboard_->set_driver_version(1);
keyboard_->set_input_id({ BUS_VIRTUAL, 3, 3, 3 });
keyboard_->set_physical_location("none");
keyboard_->set_key_bit(BTN_MISC);
keyboard_->set_key_bit(KEY_OK);
}
WindowCreator::~WindowCreator() {
@ -53,9 +76,6 @@ WindowCreator::~WindowCreator() {
event_thread_.join();
}
void WindowCreator::process_window_event(const SDL_Event &event) {
}
void WindowCreator::process_events() {
event_thread_running_ = true;
@ -69,13 +89,88 @@ void WindowCreator::process_events() {
::kill(getpid(), SIGTERM);
break;
case SDL_WINDOWEVENT:
process_window_event(event);
for (auto &iter : windows_) {
if (iter.second->id() == event.window.windowID) {
iter.second->process_event(event);
break;
}
}
break;
case SDL_MOUSEMOTION:
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
case SDL_MOUSEWHEEL:
case SDL_KEYDOWN:
case SDL_KEYUP:
process_input_event(event);
break;
}
}
}
}
void WindowCreator::process_input_event(const SDL_Event &event) {
std::vector<input::Event> mouse_events;
std::vector<input::Event> keyboard_events;
std::int32_t x = 0;
std::int32_t y = 0;
SDL_Window *window = nullptr;
switch (event.type) {
case SDL_MOUSEBUTTONDOWN:
mouse_events.push_back({ EV_KEY, BTN_LEFT, 1 });
mouse_events.push_back({ EV_SYN, SYN_REPORT, 0 });
break;
case SDL_MOUSEBUTTONUP:
mouse_events.push_back({ EV_KEY, BTN_LEFT, 0 });
mouse_events.push_back({ EV_SYN, SYN_REPORT, 0 });
break;
case SDL_MOUSEMOTION:
// As we get only absolute coordindates relative to our window we have to
// calculate the correct position based on the current focused window
window = SDL_GetWindowFromID(event.window.windowID);
if (!window)
break;
SDL_GetWindowPosition(window, &x, &y);
x += event.motion.x;
y += event.motion.y;
// NOTE: Sending relative move events doesn't really work and we have changes
// in libinputflinger to take ABS_X/ABS_Y instead for absolute position events.
mouse_events.push_back({ EV_ABS, ABS_X, x });
mouse_events.push_back({ EV_ABS, ABS_Y, y });
mouse_events.push_back({ EV_SYN, SYN_REPORT, 0 });
break;
case SDL_MOUSEWHEEL:
mouse_events.push_back({ EV_REL, REL_WHEEL, static_cast<std::int32_t>(event.wheel.y) });
break;
case SDL_KEYDOWN: {
const auto code = KeycodeConverter::convert(event.key.keysym.scancode);
if (code == KEY_RESERVED)
break;
keyboard_events.push_back({ EV_KEY, code, 1 });
break;
}
case SDL_KEYUP: {
const auto code = KeycodeConverter::convert(event.key.keysym.scancode);
if (code == KEY_RESERVED)
break;
keyboard_events.push_back({ EV_KEY, code, 0 });
break;
}
default:
break;
}
if (mouse_events.size() > 0)
pointer_->send_events(mouse_events);
if (keyboard_events.size() > 0)
keyboard_->send_events(keyboard_events);
}
EGLNativeWindowType WindowCreator::create_window(int x, int y, int width, int height)
try {
auto window = std::make_shared<Window>(x, y, width, height);

View file

@ -29,6 +29,7 @@
namespace anbox {
namespace input {
class Device;
class Manager;
} // namespace input
namespace ubuntu {
class MirDisplayConnection;
@ -47,7 +48,7 @@ public:
private:
void process_events();
void process_window_event(const SDL_Event &event);
void process_input_event(const SDL_Event &event);
std::shared_ptr<input::Manager> input_manager_;
std::map<EGLNativeWindowType,std::shared_ptr<Window>> windows_;
@ -55,8 +56,10 @@ private:
std::thread event_thread_;
bool event_thread_running_;
graphics::WindowCreator::DisplayInfo display_info_;
std::shared_ptr<input::Device> pointer_;
std::shared_ptr<input::Device> keyboard_;
};
} // namespace bridge
} // namespace ubuntu
} // namespace anbox
#endif