summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd
diff options
context:
space:
mode:
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
commit1cc8bcc68e2ac2c418abdbe55ec477405ec0ef97 (patch)
tree6cae19a66d46b87e93e4d4de74984d0abcf759ae /src/osd
parent7cc983601728fa852386f04cb7d85d93421d3dbb (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.cpp32
-rw-r--r--src/osd/windows/window.h9
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);