From 37f1873f2ed9636bc0e6973b4b9ebd5def247bf2 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Mon, 7 Jun 2021 14:35:33 +0200 Subject: [PATCH] vbox5: drop KEY_CAPSLOCK events on capslock="rom" Guests are easily confused by spurious KEY_CAPSLOCK input events in caps="rom" mode. These spurious events may reach the VMM if KEY_CAPSLOCK is not pressed as first key in a combination and, therefore, is not filtered as global key. Now, we filter KEY_CAPSLOCK in ROM mode in the VMM explicitly, but let it pass in non-ROM mode. Fixes #4087 --- repos/ports/src/virtualbox5/frontend/console.cc | 7 +++++++ repos/ports/src/virtualbox5/frontend/console.h | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/repos/ports/src/virtualbox5/frontend/console.cc b/repos/ports/src/virtualbox5/frontend/console.cc index e67f4e6d2f..ebefee00f3 100644 --- a/repos/ports/src/virtualbox5/frontend/console.cc +++ b/repos/ports/src/virtualbox5/frontend/console.cc @@ -150,8 +150,14 @@ void GenodeConsole::_handle_input() if (!_vbox_keyboard || !_vbox_mouse) return; + bool const caps_lock_from_rom { _caps_lock.constructed() }; + auto keyboard_submit = [&] (Input::Keycode key, bool release) { + /* don't confuse guests and drop CapsLock events in ROM mode */ + if (caps_lock_from_rom && key == Input::KEY_CAPSLOCK) + return; + Scan_code scan_code(key); unsigned char const release_bit = release ? 0x80 : 0; @@ -552,6 +558,7 @@ void GenodeConsole::_handle_sticky_keys() /* remember last seen host caps lock state */ host_caps_lock = caps_lock; + /* CapsLock was toggled in ROM - inject press-release events */ if (trigger_caps_lock) { _vbox_keyboard->PutScancode(Input::KEY_CAPSLOCK); _vbox_keyboard->PutScancode(Input::KEY_CAPSLOCK | 0x80); diff --git a/repos/ports/src/virtualbox5/frontend/console.h b/repos/ports/src/virtualbox5/frontend/console.h index 2bceea9d11..6963d7b7ce 100644 --- a/repos/ports/src/virtualbox5/frontend/console.h +++ b/repos/ports/src/virtualbox5/frontend/console.h @@ -160,7 +160,7 @@ class GenodeConsole : public Console { _input_sticky_keys_dispatcher(genode_env().ep(), *this, &GenodeConsole::handle_sticky_keys) { for (unsigned i = 0; i <= Input::KEY_MAX; i++) - _key_status[i] = 0; + _key_status[i] = false; _input.sigh(_input_signal_dispatcher);