From 8cb8d3833f1b2af4a22a22691695814c11861fd8 Mon Sep 17 00:00:00 2001 From: hnhhzy Date: Wed, 12 Apr 2023 15:03:36 +0800 Subject: [PATCH] support IME support IME --- libs/sdl/sdl.c | 24 +++++++++++++++++++++++- libs/sdl/sdl/Event.hx | 1 + libs/sdl/sdl/Sdl.hx | 13 +++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/libs/sdl/sdl.c b/libs/sdl/sdl.c index 4a4e956c5..bf0842b4b 100644 --- a/libs/sdl/sdl.c +++ b/libs/sdl/sdl.c @@ -91,6 +91,7 @@ typedef struct { int value; int fingerId; int joystick; + const char* inputChar; } event_data; HL_PRIM bool HL_NAME(init_once)() { @@ -117,6 +118,7 @@ HL_PRIM bool HL_NAME(init_once)() { SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); return true; } @@ -146,6 +148,7 @@ HL_PRIM bool HL_NAME(hint_value)( vbyte* name, vbyte* value) { return SDL_SetHint((char*)name, (char*)value) == SDL_TRUE; } +bool textediting = false; HL_PRIM bool HL_NAME(event_loop)( event_data *event ) { while (true) { SDL_Event e; @@ -261,12 +264,16 @@ HL_PRIM bool HL_NAME(event_loop)( event_data *event ) { } break; case SDL_TEXTEDITING: - // skip + // support IME + textediting = true; continue; case SDL_TEXTINPUT: event->type = TextInput; event->keyCode = *(int*)e.text.text; event->keyCode &= e.text.text[0] ? e.text.text[1] ? e.text.text[2] ? e.text.text[3] ? 0xFFFFFFFF : 0xFFFFFF : 0xFFFF : 0xFF : 0; + // back all chars. + event->value = 2; + event->inputChar = hl_to_utf16(e.text.text); break; case SDL_CONTROLLERDEVICEADDED: event->type = GControllerAdded; @@ -836,6 +843,20 @@ HL_PRIM char* HL_NAME(get_clipboard_text)() { return bytes; } +// SDL2.0.22 support, Used to improve ime input. +HL_PRIM bool HL_NAME(is_text_input_shown)() { + if (textediting) + { + textediting = false; + return true; + } +#if defined(_WIN32) || defined(HL_MAC) + return SDL_IsTextInputShown(); +#else + return false; +#endif +} + HL_PRIM varray* HL_NAME(get_displays)() { int n = SDL_GetNumVideoDisplays(); if (n < 0) @@ -916,6 +937,7 @@ DEFINE_PRIM(_VOID, free_cursor, _CURSOR); DEFINE_PRIM(_VOID, set_cursor, _CURSOR); DEFINE_PRIM(_BOOL, set_clipboard_text, _BYTES); DEFINE_PRIM(_BYTES, get_clipboard_text, _NO_ARG); +DEFINE_PRIM(_BOOL, is_text_input_shown, _NO_ARG); DEFINE_PRIM(_ARR, get_displays, _NO_ARG); DEFINE_PRIM(_ARR, get_display_modes, _I32); DEFINE_PRIM(_DYN, get_current_display_mode, _I32 _BOOL); diff --git a/libs/sdl/sdl/Event.hx b/libs/sdl/sdl/Event.hx index 31f86bf55..9dfb880cd 100644 --- a/libs/sdl/sdl/Event.hx +++ b/libs/sdl/sdl/Event.hx @@ -16,6 +16,7 @@ package sdl; public var value : Int; public var fingerId : Int; public var joystick : Int; + public var inputChar : hl.Bytes; public function new() { } } diff --git a/libs/sdl/sdl/Sdl.hx b/libs/sdl/sdl/Sdl.hx index ddce34666..228cc0430 100644 --- a/libs/sdl/sdl/Sdl.hx +++ b/libs/sdl/sdl/Sdl.hx @@ -161,6 +161,14 @@ class Sdl { else return @:privateAccess String.fromUTF8(t); } + + /** + * This is needed for software applications (and games) using SDL to interact with IME an appropriately. Without knowing if the IME is currently actively taking input from the user or displayed it's not possible for an application to handle certain input events from the mouse appropriately. + * @return Bool + */ + public static function isTextInputShown():Bool{ + return _isTextInputShown(); + } @:hlNative("?sdl", "get_screen_width") static function get_screen_width() : Int { @@ -233,6 +241,11 @@ class Sdl { private static function _getClipboardText() : hl.Bytes { return null; } + + @:hlNative("?sdl", "is_text_input_shown") + private static function _isTextInputShown() : Bool { + return false; + } } @:enum