diff options
author | Vas Crabb <vas@vastheman.com> | 2021-11-08 23:44:08 +1100 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2021-11-08 23:44:08 +1100 |
commit | 1cc8bcc68e2ac2c418abdbe55ec477405ec0ef97 (patch) | |
tree | 6cae19a66d46b87e93e4d4de74984d0abcf759ae /src/osd | |
parent | 7cc983601728fa852386f04cb7d85d93421d3dbb (diff) |
-frontend: Don't inappropriately truncate text in menu text boxes.
-osd/windows: Handle WM_UNICHAR.
Diffstat (limited to 'src/osd')
-rw-r--r-- | src/osd/windows/window.cpp | 32 | ||||
-rw-r--r-- | src/osd/windows/window.h | 9 |
2 files changed, 35 insertions, 6 deletions
diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp index e6a15729350..c5166d67a11 100644 --- a/src/osd/windows/window.cpp +++ b/src/osd/windows/window.cpp @@ -307,6 +307,7 @@ win_window_info::win_window_info( , m_lastclicktime(std::chrono::steady_clock::time_point::min()) , m_lastclickx(0) , m_lastclicky(0) + , m_last_surrogate(0) , m_attached_mode(false) { m_non_fullscreen_bounds.left = 0; @@ -1158,7 +1159,34 @@ LRESULT CALLBACK win_window_info::video_window_proc(HWND wnd, UINT message, WPAR break; case WM_CHAR: - window->machine().ui_input().push_char_event(window->target(), (char32_t) wparam); + { + char16_t const ch = char16_t(wparam); + if ((0xd800 <= ch) && (0xdbff >= ch)) + { + window->m_last_surrogate = ch; + } + else if ((0xdc00 <= ch) && (0xdfff >= ch)) + { + if (window->m_last_surrogate) + { + char32_t const uch = 0x10000 + ((ch & 0x03ff) | ((window->m_last_surrogate & 0x03ff) << 10)); + window->machine().ui_input().push_char_event(window->target(), uch); + } + window->m_last_surrogate = 0; + } + else + { + window->machine().ui_input().push_char_event(window->target(), char32_t(ch)); + window->m_last_surrogate = 0; + } + } + break; + + case WM_UNICHAR: + if (UNICODE_NOCHAR == wparam) + return TRUE; + else + window->machine().ui_input().push_char_event(window->target(), char32_t(wparam)); break; case WM_MOUSEWHEEL: @@ -1166,8 +1194,8 @@ LRESULT CALLBACK win_window_info::video_window_proc(HWND wnd, UINT message, WPAR UINT ucNumLines = 3; // default SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &ucNumLines, 0); window->machine().ui_input().push_mouse_wheel_event(window->target(), GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam), GET_WHEEL_DELTA_WPARAM(wparam), ucNumLines); - break; } + break; // pause the system when we start a menu or resize case WM_ENTERSIZEMOVE: diff --git a/src/osd/windows/window.h b/src/osd/windows/window.h index 8db6fc394b2..6586420df66 100644 --- a/src/osd/windows/window.h +++ b/src/osd/windows/window.h @@ -98,8 +98,8 @@ public: int m_ismaximized; // monitor info - int m_fullscreen_safe; - float m_aspect; + int m_fullscreen_safe; + float m_aspect; // rendering info std::mutex m_render_lock; @@ -110,8 +110,9 @@ public: // input info std::chrono::steady_clock::time_point m_lastclicktime; - int m_lastclickx; - int m_lastclicky; + int m_lastclickx; + int m_lastclicky; + char16_t m_last_surrogate; private: void draw_video_contents(HDC dc, bool update); |