diff --git a/repos/gems/recipes/raw/drivers_managed-pc/numlock_remap.config b/repos/gems/recipes/raw/drivers_managed-pc/numlock_remap.config
index d8d6e904f..673483c43 100644
--- a/repos/gems/recipes/raw/drivers_managed-pc/numlock_remap.config
+++ b/repos/gems/recipes/raw/drivers_managed-pc/numlock_remap.config
@@ -12,7 +12,7 @@
-
+
diff --git a/repos/libports/include/qt5/qpa_nitpicker/qnitpickerplatformwindow.h b/repos/libports/include/qt5/qpa_nitpicker/qnitpickerplatformwindow.h
index caa1caf39..858950960 100644
--- a/repos/libports/include/qt5/qpa_nitpicker/qnitpickerplatformwindow.h
+++ b/repos/libports/include/qt5/qpa_nitpicker/qnitpickerplatformwindow.h
@@ -1,11 +1,12 @@
/*
* \brief QNitpickerPlatformWindow
* \author Christian Prochaska
+ * \author Christian Helmuth
* \date 2013-05-08
*/
/*
- * Copyright (C) 2013-2017 Genode Labs GmbH
+ * Copyright (C) 2013-2019 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
@@ -25,7 +26,6 @@
/* Qt includes */
#include
#include
-#include
#include
/* Qoost includes */
@@ -66,6 +66,23 @@ class QNitpickerPlatformWindow : public QObject, public QPlatformWindow
_mouse_position.y() - geometry().y());
}
+
+ typedef Genode::Codepoint Codepoint;
+
+ struct Mapped_key
+ {
+ enum Event { PRESSED, RELEASED, REPEAT };
+
+ Qt::Key key { Qt::Key_unknown };
+ Codepoint codepoint { Codepoint::INVALID };
+ };
+
+ QHash _pressed;
+
+ Mapped_key _map_key(Input::Keycode, Codepoint, Mapped_key::Event);
+ void _key_event(Input::Keycode, Codepoint, Mapped_key::Event);
+ void _mouse_button_event(Input::Keycode, bool press);
+
Genode::Signal_handler _input_signal_handler;
Genode::Signal_handler _mode_changed_signal_handler;
diff --git a/repos/libports/run/qt5_drivers.inc b/repos/libports/run/qt5_drivers.inc
index 1cbe1a58e..25d8ac048 100644
--- a/repos/libports/run/qt5_drivers.inc
+++ b/repos/libports/run/qt5_drivers.inc
@@ -228,6 +228,7 @@ proc drivers_start_nodes { feature_arg } {
+
@@ -274,7 +275,6 @@ proc drivers_start_nodes { feature_arg } {
-
@@ -282,6 +282,9 @@ proc drivers_start_nodes { feature_arg } {
+
+
+
}
append start_nodes "
"
diff --git a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp
index 70254a631..f13c43f7a 100644
--- a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp
+++ b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp
@@ -1,11 +1,12 @@
/*
* \brief QNitpickerPlatformWindow
* \author Christian Prochaska
+ * \author Christian Helmuth
* \date 2013-05-08
*/
/*
- * Copyright (C) 2013-2017 Genode Labs GmbH
+ * Copyright (C) 2013-2019 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
@@ -103,210 +104,269 @@ void QNitpickerPlatformWindow::_process_touch_events(QList const &
}
-static Qt::Key translate_keycode(Input::Keycode key)
+static Qt::Key key_from_unicode(unsigned unicode)
{
- switch (key) {
- case Input::KEY_ENTER: return Qt::Key_Return;
- case Input::KEY_KPENTER: return Qt::Key_Enter;
- case Input::KEY_ESC: return Qt::Key_Escape;
- case Input::KEY_TAB: return Qt::Key_Tab;
- case Input::KEY_BACKSPACE: return Qt::Key_Backspace;
- case Input::KEY_INSERT: return Qt::Key_Insert;
- case Input::KEY_DELETE: return Qt::Key_Delete;
- case Input::KEY_PRINT: return Qt::Key_Print;
- case Input::KEY_CLEAR: return Qt::Key_Clear;
- case Input::KEY_HOME: return Qt::Key_Home;
- case Input::KEY_END: return Qt::Key_End;
- case Input::KEY_LEFT: return Qt::Key_Left;
- case Input::KEY_UP: return Qt::Key_Up;
- case Input::KEY_RIGHT: return Qt::Key_Right;
- case Input::KEY_DOWN: return Qt::Key_Down;
- case Input::KEY_PAGEUP: return Qt::Key_PageUp;
- case Input::KEY_PAGEDOWN: return Qt::Key_PageDown;
- case Input::KEY_LEFTSHIFT: return Qt::Key_Shift;
- case Input::KEY_LEFTCTRL: return Qt::Key_Control;
- case Input::KEY_LEFTMETA: return Qt::Key_Meta;
- case Input::KEY_LEFTALT: return Qt::Key_Alt;
- case Input::KEY_RIGHTALT: return Qt::Key_AltGr;
- case Input::KEY_CAPSLOCK: return Qt::Key_CapsLock;
- case Input::KEY_F1: return Qt::Key_F1;
- case Input::KEY_F2: return Qt::Key_F2;
- case Input::KEY_F3: return Qt::Key_F3;
- case Input::KEY_F4: return Qt::Key_F4;
- case Input::KEY_F5: return Qt::Key_F5;
- case Input::KEY_F6: return Qt::Key_F6;
- case Input::KEY_F7: return Qt::Key_F7;
- case Input::KEY_F8: return Qt::Key_F8;
- case Input::KEY_F9: return Qt::Key_F9;
- case Input::KEY_F10: return Qt::Key_F10;
- case Input::KEY_F11: return Qt::Key_F11;
- case Input::KEY_F12: return Qt::Key_F12;
- case Input::KEY_SPACE: return Qt::Key_Space;
- case Input::KEY_0: return Qt::Key_0;
- case Input::KEY_1: return Qt::Key_1;
- case Input::KEY_2: return Qt::Key_2;
- case Input::KEY_3: return Qt::Key_3;
- case Input::KEY_4: return Qt::Key_4;
- case Input::KEY_5: return Qt::Key_5;
- case Input::KEY_6: return Qt::Key_6;
- case Input::KEY_7: return Qt::Key_7;
- case Input::KEY_8: return Qt::Key_8;
- case Input::KEY_9: return Qt::Key_9;
- case Input::KEY_A: return Qt::Key_A;
- case Input::KEY_B: return Qt::Key_B;
- case Input::KEY_C: return Qt::Key_C;
- case Input::KEY_D: return Qt::Key_D;
- case Input::KEY_E: return Qt::Key_E;
- case Input::KEY_F: return Qt::Key_F;
- case Input::KEY_G: return Qt::Key_G;
- case Input::KEY_H: return Qt::Key_H;
- case Input::KEY_I: return Qt::Key_I;
- case Input::KEY_J: return Qt::Key_J;
- case Input::KEY_K: return Qt::Key_K;
- case Input::KEY_L: return Qt::Key_L;
- case Input::KEY_M: return Qt::Key_M;
- case Input::KEY_N: return Qt::Key_N;
- case Input::KEY_O: return Qt::Key_O;
- case Input::KEY_P: return Qt::Key_P;
- case Input::KEY_Q: return Qt::Key_Q;
- case Input::KEY_R: return Qt::Key_R;
- case Input::KEY_S: return Qt::Key_S;
- case Input::KEY_T: return Qt::Key_T;
- case Input::KEY_U: return Qt::Key_U;
- case Input::KEY_V: return Qt::Key_V;
- case Input::KEY_W: return Qt::Key_W;
- case Input::KEY_X: return Qt::Key_X;
- case Input::KEY_Y: return Qt::Key_Y;
- case Input::KEY_Z: return Qt::Key_Z;
- case Input::KEY_BACK: return Qt::Key_Back;
- case Input::KEY_FORWARD: return Qt::Key_Forward;
+ /* special keys: function-key unicodes */
+ switch (unicode) {
+ case 0x0008: return Qt::Key_Backspace;
+ case 0x0009: return Qt::Key_Tab;
+ case 0x000a: return Qt::Key_Return;
+ case 0x001b: return Qt::Key_Escape;
+ case 0xf700: return Qt::Key_Up;
+ case 0xf701: return Qt::Key_Down;
+ case 0xf702: return Qt::Key_Left;
+ case 0xf703: return Qt::Key_Right;
+ case 0xf704: return Qt::Key_F1;
+ case 0xf705: return Qt::Key_F2;
+ case 0xf706: return Qt::Key_F3;
+ case 0xf707: return Qt::Key_F4;
+ case 0xf708: return Qt::Key_F5;
+ case 0xf709: return Qt::Key_F6;
+ case 0xf70a: return Qt::Key_F7;
+ case 0xf70b: return Qt::Key_F8;
+ case 0xf70c: return Qt::Key_F9;
+ case 0xf70d: return Qt::Key_F10;
+ case 0xf70e: return Qt::Key_F11;
+ case 0xf70f: return Qt::Key_F12;
+ case 0xf727: return Qt::Key_Insert;
+ case 0xf728: return Qt::Key_Delete;
+ case 0xf729: return Qt::Key_Home;
+ case 0xf72b: return Qt::Key_End;
+ case 0xf72c: return Qt::Key_PageUp;
+ case 0xf72d: return Qt::Key_PageDown;
default: break;
};
+
+ /*
+ * Qt key enums are equal to the corresponding Unicode codepoints of the
+ * upper-case character.
+ */
+
+ /* printable keys */
+ if (unicode >= (unsigned)Qt::Key_Space && unicode <= (unsigned)Qt::Key_ydiaeresis)
+ return Qt::Key(QChar(unicode).toUpper().unicode());
+
return Qt::Key_unknown;
}
+QNitpickerPlatformWindow::Mapped_key QNitpickerPlatformWindow::_map_key(Input::Keycode key,
+ Codepoint codepoint,
+ Mapped_key::Event e)
+{
+ /* non-printable key mappings */
+ switch (key) {
+ case Input::KEY_ENTER: return Mapped_key { Qt::Key_Return };
+ case Input::KEY_KPENTER: return Mapped_key { Qt::Key_Return }; /* resolves aliasing on repeat */
+ case Input::KEY_ESC: return Mapped_key { Qt::Key_Escape };
+ case Input::KEY_TAB: return Mapped_key { Qt::Key_Tab };
+ case Input::KEY_BACKSPACE: return Mapped_key { Qt::Key_Backspace };
+ case Input::KEY_INSERT: return Mapped_key { Qt::Key_Insert };
+ case Input::KEY_DELETE: return Mapped_key { Qt::Key_Delete };
+ case Input::KEY_PRINT: return Mapped_key { Qt::Key_Print };
+ case Input::KEY_CLEAR: return Mapped_key { Qt::Key_Clear };
+ case Input::KEY_HOME: return Mapped_key { Qt::Key_Home };
+ case Input::KEY_END: return Mapped_key { Qt::Key_End };
+ case Input::KEY_LEFT: return Mapped_key { Qt::Key_Left };
+ case Input::KEY_UP: return Mapped_key { Qt::Key_Up };
+ case Input::KEY_RIGHT: return Mapped_key { Qt::Key_Right };
+ case Input::KEY_DOWN: return Mapped_key { Qt::Key_Down };
+ case Input::KEY_PAGEUP: return Mapped_key { Qt::Key_PageUp };
+ case Input::KEY_PAGEDOWN: return Mapped_key { Qt::Key_PageDown };
+ case Input::KEY_LEFTSHIFT: return Mapped_key { Qt::Key_Shift };
+ case Input::KEY_RIGHTSHIFT: return Mapped_key { Qt::Key_Shift };
+ case Input::KEY_LEFTCTRL: return Mapped_key { Qt::Key_Control };
+ case Input::KEY_RIGHTCTRL: return Mapped_key { Qt::Key_Control };
+ case Input::KEY_LEFTMETA: return Mapped_key { Qt::Key_Meta };
+ case Input::KEY_RIGHTMETA: return Mapped_key { Qt::Key_Meta };
+ case Input::KEY_LEFTALT: return Mapped_key { Qt::Key_Alt };
+ case Input::KEY_RIGHTALT: return Mapped_key { Qt::Key_AltGr };
+ case Input::KEY_COMPOSE: return Mapped_key { Qt::Key_Menu };
+ case Input::KEY_CAPSLOCK: return Mapped_key { Qt::Key_CapsLock };
+ case Input::KEY_SYSRQ: return Mapped_key { Qt::Key_SysReq };
+ case Input::KEY_SCROLLLOCK: return Mapped_key { Qt::Key_ScrollLock };
+ case Input::KEY_PAUSE: return Mapped_key { Qt::Key_Pause };
+ case Input::KEY_F1: return Mapped_key { Qt::Key_F1 };
+ case Input::KEY_F2: return Mapped_key { Qt::Key_F2 };
+ case Input::KEY_F3: return Mapped_key { Qt::Key_F3 };
+ case Input::KEY_F4: return Mapped_key { Qt::Key_F4 };
+ case Input::KEY_F5: return Mapped_key { Qt::Key_F5 };
+ case Input::KEY_F6: return Mapped_key { Qt::Key_F6 };
+ case Input::KEY_F7: return Mapped_key { Qt::Key_F7 };
+ case Input::KEY_F8: return Mapped_key { Qt::Key_F8 };
+ case Input::KEY_F9: return Mapped_key { Qt::Key_F9 };
+ case Input::KEY_F10: return Mapped_key { Qt::Key_F10 };
+ case Input::KEY_F11: return Mapped_key { Qt::Key_F11 };
+ case Input::KEY_F12: return Mapped_key { Qt::Key_F12 };
+ case Input::KEY_F13: return Mapped_key { Qt::Key_F13 };
+ case Input::KEY_F14: return Mapped_key { Qt::Key_F14 };
+ case Input::KEY_F15: return Mapped_key { Qt::Key_F15 };
+ case Input::KEY_F16: return Mapped_key { Qt::Key_F16 };
+ case Input::KEY_F17: return Mapped_key { Qt::Key_F17 };
+ case Input::KEY_F18: return Mapped_key { Qt::Key_F18 };
+ case Input::KEY_F19: return Mapped_key { Qt::Key_F19 };
+ case Input::KEY_F20: return Mapped_key { Qt::Key_F20 };
+ case Input::KEY_F21: return Mapped_key { Qt::Key_F21 };
+ case Input::KEY_F22: return Mapped_key { Qt::Key_F22 };
+ case Input::KEY_F23: return Mapped_key { Qt::Key_F23 };
+ case Input::KEY_F24: return Mapped_key { Qt::Key_F24 };
+ case Input::KEY_BACK: return Mapped_key { Qt::Key_Back };
+ case Input::KEY_FORWARD: return Mapped_key { Qt::Key_Forward };
+ case Input::KEY_VOLUMEDOWN: return Mapped_key { Qt::Key_VolumeDown };
+ case Input::KEY_MUTE: return Mapped_key { Qt::Key_VolumeMute };
+ case Input::KEY_VOLUMEUP: return Mapped_key { Qt::Key_VolumeUp };
+ case Input::KEY_PREVIOUSSONG: return Mapped_key { Qt::Key_MediaPrevious };
+ case Input::KEY_PLAYPAUSE: return Mapped_key { Qt::Key_MediaTogglePlayPause };
+ case Input::KEY_NEXTSONG: return Mapped_key { Qt::Key_MediaNext };
+
+ default: break;
+ };
+
+ /*
+ * We remember the mapping of pressed keys (but not repeated codepoints) in
+ * '_pressed' to derive the release mapping.
+ */
+
+ switch (e) {
+ case Mapped_key::PRESSED:
+ case Mapped_key::REPEAT:
+ {
+ Qt::Key const qt_key = key_from_unicode(codepoint.value);
+ if (qt_key != Qt::Key_unknown) {
+ /* do not insert repeated codepoints */
+ if (e == Mapped_key::PRESSED)
+ _pressed.insert(key, qt_key);
+
+ return Mapped_key { qt_key, codepoint };
+ }
+ } break;
+
+ case Mapped_key::RELEASED:
+ if (Qt::Key qt_key = _pressed.take(key)) {
+ return Mapped_key { qt_key };
+ }
+ break;
+ }
+
+ /* dead keys and aborted sequences end up here */
+ Genode::warning("key (", Input::key_name(key), ",", (unsigned)key,
+ ",U+", Genode::Hex((unsigned short)codepoint.value,
+ Genode::Hex::OMIT_PREFIX, Genode::Hex::PAD),
+ ") lacks Qt mapping");
+ return Mapped_key { Qt::Key_unknown, codepoint };
+}
+
+
+void QNitpickerPlatformWindow::_key_event(Input::Keycode key, Codepoint codepoint,
+ Mapped_key::Event e)
+{
+ bool const pressed = e != Mapped_key::RELEASED;
+
+ Qt::KeyboardModifier current_modifier = Qt::NoModifier;
+
+ /* FIXME ignores two keys for one modifier were pressed and only one was released */
+ switch (key) {
+ case Input::KEY_LEFTALT: current_modifier = Qt::AltModifier; break;
+ case Input::KEY_LEFTCTRL:
+ case Input::KEY_RIGHTCTRL: current_modifier = Qt::ControlModifier; break;
+ case Input::KEY_LEFTSHIFT:
+ case Input::KEY_RIGHTSHIFT: current_modifier = Qt::ShiftModifier; break;
+ default: break;
+ }
+
+ _keyboard_modifiers.setFlag(current_modifier, pressed);
+
+ QEvent::Type const event_type = pressed ? QEvent::KeyPress : QEvent::KeyRelease;
+ Mapped_key const mapped_key = _map_key(key, codepoint, e);
+ unsigned const unicode = mapped_key.codepoint.valid()
+ ? mapped_key.codepoint.value : 0;
+ bool const autorepeat = e == Mapped_key::REPEAT;
+
+ QWindowSystemInterface::handleExtendedKeyEvent(window(),
+ event_type,
+ mapped_key.key,
+ _keyboard_modifiers,
+ key, 0, int(_keyboard_modifiers),
+ unicode ? QString(unicode) : QString(),
+ autorepeat);
+}
+
+
+void QNitpickerPlatformWindow::_mouse_button_event(Input::Keycode button, bool press)
+{
+ Qt::MouseButton current_mouse_button = Qt::NoButton;
+
+ switch (button) {
+ case Input::BTN_LEFT: current_mouse_button = Qt::LeftButton; break;
+ case Input::BTN_RIGHT: current_mouse_button = Qt::RightButton; break;
+ case Input::BTN_MIDDLE: current_mouse_button = Qt::MidButton; break;
+ case Input::BTN_SIDE: current_mouse_button = Qt::ExtraButton1; break;
+ case Input::BTN_EXTRA: current_mouse_button = Qt::ExtraButton2; break;
+ case Input::BTN_FORWARD: current_mouse_button = Qt::ExtraButton3; break;
+ case Input::BTN_BACK: current_mouse_button = Qt::ExtraButton4; break;
+ case Input::BTN_TASK: current_mouse_button = Qt::ExtraButton5; break;
+ default: return;
+ }
+
+ _mouse_button_state.setFlag(current_mouse_button, press);
+
+ /* on mouse click, make this window the focused window */
+ if (press) requestActivateWindow();
+
+ QWindowSystemInterface::handleMouseEvent(window(),
+ _local_position(),
+ _mouse_position,
+ _mouse_button_state,
+ current_mouse_button,
+ press ? QEvent::MouseButtonPress
+ : QEvent::MouseButtonRelease,
+ _keyboard_modifiers);
+}
+
+
void QNitpickerPlatformWindow::_handle_input()
{
QList touch_events;
_input_session.for_each_event([&] (Input::Event const &event) {
- QPoint const orig_mouse_position = _mouse_position;
- Qt::MouseButtons const orig_mouse_button_state = _mouse_button_state;
-
event.handle_absolute_motion([&] (int x, int y) {
- _mouse_position = QPoint(x, y); });
+ _mouse_position = QPoint(x, y);
- event.handle_press([&] (Input::Keycode key, Genode::Codepoint codepoint) {
-
- switch (key) {
- case Input::KEY_LEFTALT:
- case Input::KEY_RIGHTALT: _keyboard_modifiers |= Qt::AltModifier; break;
- case Input::KEY_LEFTCTRL:
- case Input::KEY_RIGHTCTRL: _keyboard_modifiers |= Qt::ControlModifier; break;
- case Input::KEY_LEFTSHIFT:
- case Input::KEY_RIGHTSHIFT: _keyboard_modifiers |= Qt::ShiftModifier; break;
- case Input::BTN_LEFT: _mouse_button_state |= Qt::LeftButton; break;
- case Input::BTN_RIGHT: _mouse_button_state |= Qt::RightButton; break;
- case Input::BTN_MIDDLE: _mouse_button_state |= Qt::MidButton; break;
- case Input::BTN_SIDE: _mouse_button_state |= Qt::XButton1; break;
- case Input::BTN_EXTRA: _mouse_button_state |= Qt::XButton2; break;
- default: break;
- }
-
- /* on mouse click, make this window the focused window */
- if (_mouse_button_state != orig_mouse_button_state)
- requestActivateWindow();
-
- QWindowSystemInterface::handleKeyEvent(0, QEvent::KeyPress,
- translate_keycode(key),
- _keyboard_modifiers,
- QString() + QChar(codepoint.value));
+ QWindowSystemInterface::handleMouseEvent(window(),
+ _local_position(),
+ _mouse_position,
+ _mouse_button_state,
+ Qt::NoButton,
+ QEvent::MouseMove,
+ _keyboard_modifiers);
});
- /* handle repeat of special keys */
- event.handle_repeat([&] (Genode::Codepoint codepoint) {
-
- /* function-key unicodes */
- enum {
- CODEPOINT_UP = 0xf700, CODEPOINT_DOWN = 0xf701,
- CODEPOINT_LEFT = 0xf702, CODEPOINT_RIGHT = 0xf703,
- CODEPOINT_HOME = 0xf729, CODEPOINT_INSERT = 0xf727,
- CODEPOINT_DELETE = 0xf728, CODEPOINT_END = 0xf72b,
- CODEPOINT_PAGEUP = 0xf72c, CODEPOINT_PAGEDOWN = 0xf72d,
- CODEPOINT_BACKSPACE = 8, CODEPOINT_LINEFEED = 10,
- };
-
- Qt::Key repeated_key = Qt::Key_unknown;
- switch (codepoint.value) {
- case CODEPOINT_UP: repeated_key = Qt::Key_Up; break;
- case CODEPOINT_DOWN: repeated_key = Qt::Key_Down; break;
- case CODEPOINT_LEFT: repeated_key = Qt::Key_Left; break;
- case CODEPOINT_RIGHT: repeated_key = Qt::Key_Right; break;
- case CODEPOINT_HOME: repeated_key = Qt::Key_Home; break;
- case CODEPOINT_INSERT: repeated_key = Qt::Key_Insert; break;
- case CODEPOINT_DELETE: repeated_key = Qt::Key_Delete; break;
- case CODEPOINT_END: repeated_key = Qt::Key_End; break;
- case CODEPOINT_PAGEUP: repeated_key = Qt::Key_PageUp; break;
- case CODEPOINT_PAGEDOWN: repeated_key = Qt::Key_PageDown; break;
- case CODEPOINT_BACKSPACE: repeated_key = Qt::Key_Backspace; break;
- case CODEPOINT_LINEFEED: repeated_key = Qt::Key_Return; break;
- default: return /* from lambda */;
- };
-
- /*
- * A key repeat is triggered while a key is already pressed. We
- * respond to it by simulating a tempoary release of the key.
- */
- QWindowSystemInterface::handleKeyEvent(0, QEvent::KeyRelease,
- repeated_key,
- _keyboard_modifiers,
- QString());
- QWindowSystemInterface::handleKeyEvent(0, QEvent::KeyPress,
- repeated_key,
- _keyboard_modifiers,
- QString());
+ event.handle_press([&] (Input::Keycode key, Codepoint codepoint) {
+ if (key > 0 && key < 0x100)
+ _key_event(key, codepoint, Mapped_key::PRESSED);
+ else if (key >= Input::BTN_LEFT && key <= Input::BTN_TASK)
+ _mouse_button_event(key, true);
});
event.handle_release([&] (Input::Keycode key) {
+ if (key > 0 && key < 0x100)
+ _key_event(key, Codepoint { Codepoint::INVALID }, Mapped_key::RELEASED);
+ else if (key >= Input::BTN_LEFT && key <= Input::BTN_TASK)
+ _mouse_button_event(key, false);
+ });
- switch (key) {
- case Input::KEY_LEFTALT:
- case Input::KEY_RIGHTALT: _keyboard_modifiers &= ~Qt::AltModifier; break;
- case Input::KEY_LEFTCTRL:
- case Input::KEY_RIGHTCTRL: _keyboard_modifiers &= ~Qt::ControlModifier; break;
- case Input::KEY_LEFTSHIFT:
- case Input::KEY_RIGHTSHIFT: _keyboard_modifiers &= ~Qt::ShiftModifier; break;
- case Input::BTN_LEFT: _mouse_button_state &= ~Qt::LeftButton; break;
- case Input::BTN_RIGHT: _mouse_button_state &= ~Qt::RightButton; break;
- case Input::BTN_MIDDLE: _mouse_button_state &= ~Qt::MidButton; break;
- case Input::BTN_SIDE: _mouse_button_state &= ~Qt::XButton1; break;
- case Input::BTN_EXTRA: _mouse_button_state &= ~Qt::XButton2; break;
- default: break;
- }
-
- QWindowSystemInterface::handleKeyEvent(0, QEvent::KeyRelease,
- translate_keycode(key),
- _keyboard_modifiers,
- QString());
+ event.handle_repeat([&] (Codepoint codepoint) {
+ _key_event(Input::KEY_UNKNOWN, codepoint, Mapped_key::REPEAT);
});
event.handle_wheel([&] (int x, int y) {
QWindowSystemInterface::handleWheelEvent(window(),
_local_position(),
_local_position(),
- y * 120,
- Qt::Vertical); });
-
- if (_mouse_button_state != orig_mouse_button_state
- || _mouse_position != orig_mouse_position) {
-
- QWindowSystemInterface::handleMouseEvent(window(),
- _local_position(),
- _mouse_position,
- _mouse_button_state);
- }
+ QPoint(),
+ QPoint(0, y * 120),
+ _keyboard_modifiers); });
if (event.touch() || event.touch_release())
touch_events.push_back(event);