From 53227f400cfff6d9d295903eaf6de8d51bce6868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20ASLIT=C3=9CRK?= Date: Thu, 11 Jun 2020 21:31:53 +0300 Subject: [PATCH] LibGUI: Replace text attribute on KeyEvent with code_point attribute --- Libraries/LibGUI/Event.h | 15 ++++++++++++--- Libraries/LibGUI/TextEditor.cpp | 7 +++++-- Libraries/LibGUI/WindowServerConnection.cpp | 21 ++++++++------------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/Libraries/LibGUI/Event.h b/Libraries/LibGUI/Event.h index a37250ae84..d587b6fc35 100644 --- a/Libraries/LibGUI/Event.h +++ b/Libraries/LibGUI/Event.h @@ -26,6 +26,7 @@ #pragma once +#include #include #include #include @@ -267,10 +268,11 @@ enum MouseButton : u8 { class KeyEvent final : public Event { public: - KeyEvent(Type type, KeyCode key, u8 modifiers, u32 scancode) + KeyEvent(Type type, KeyCode key, u8 modifiers, u32 code_point, u32 scancode) : Event(type) , m_key(key) , m_modifiers(modifiers) + , m_code_point(code_point) , m_scancode(scancode) { } @@ -281,7 +283,13 @@ public: bool shift() const { return m_modifiers & Mod_Shift; } bool logo() const { return m_modifiers & Mod_Logo; } u8 modifiers() const { return m_modifiers; } - String text() const { return m_text; } + u32 code_point() const { return m_code_point; } + String text() const + { + StringBuilder sb; + sb.append_codepoint(m_code_point); + return sb.to_string(); + } u32 scancode() const { return m_scancode; } String to_string() const; @@ -290,8 +298,9 @@ private: friend class WindowServerConnection; KeyCode m_key { KeyCode::Key_Invalid }; u8 m_modifiers { 0 }; + u32 m_code_point { 0 }; u32 m_scancode { 0 }; - String m_text; + String m_text2; }; class MouseEvent final : public Event { diff --git a/Libraries/LibGUI/TextEditor.cpp b/Libraries/LibGUI/TextEditor.cpp index 1257a942d3..b2a8930ce1 100644 --- a/Libraries/LibGUI/TextEditor.cpp +++ b/Libraries/LibGUI/TextEditor.cpp @@ -889,8 +889,11 @@ void TextEditor::keydown_event(KeyEvent& event) return; } - if (!is_readonly() && !event.ctrl() && !event.alt() && !event.text().is_empty()) { - insert_at_cursor_or_replace_selection(event.text()); + if (!is_readonly() && !event.ctrl() && !event.alt() && event.code_point() != 0) { + StringBuilder sb; + sb.append_codepoint(event.code_point()); + + insert_at_cursor_or_replace_selection(sb.to_string()); return; } diff --git a/Libraries/LibGUI/WindowServerConnection.cpp b/Libraries/LibGUI/WindowServerConnection.cpp index 7ebbe2a43a..1fd844f2ce 100644 --- a/Libraries/LibGUI/WindowServerConnection.cpp +++ b/Libraries/LibGUI/WindowServerConnection.cpp @@ -25,6 +25,7 @@ */ #include +#include #include #include #include @@ -129,12 +130,7 @@ void WindowServerConnection::handle(const Messages::WindowClient::KeyDown& messa if (!window) return; - auto key_event = make(Event::KeyDown, (KeyCode) message.key(), message.modifiers(), message.scancode()); - if (message.character() != '\0') { - char ch = message.character(); - key_event->m_text = String(&ch, 1); - } - + auto key_event = make(Event::KeyDown, (KeyCode)message.key(), message.modifiers(), message.code_point(), message.scancode()); Action* action = nullptr; #ifdef KEYBOARD_SHORTCUTS_DEBUG @@ -176,7 +172,11 @@ void WindowServerConnection::handle(const Messages::WindowClient::KeyDown& messa return; key_event->m_key = Key_Invalid; key_event->m_modifiers = 0; - key_event->m_text = emoji_input_dialog->selected_emoji_text(); + + AK::Utf8View m_utf8_view(emoji_input_dialog->selected_emoji_text().characters()); + u32 code_point = *m_utf8_view.begin(); + + key_event->m_code_point = code_point; } Core::EventLoop::current().post_event(*window, move(key_event)); @@ -188,12 +188,7 @@ void WindowServerConnection::handle(const Messages::WindowClient::KeyUp& message if (!window) return; - auto key_event = make(Event::KeyUp, (KeyCode) message.key(), message.modifiers(), message.scancode()); - if (message.character() != '\0') { - char ch = message.character(); - key_event->m_text = String(&ch, 1); - } - + auto key_event = make(Event::KeyUp, (KeyCode)message.key(), message.modifiers(), message.code_point(), message.scancode()); Core::EventLoop::current().post_event(*window, move(key_event)); }