From 212a491f7c1db477b29b89630d87575d64097c99 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 28 Jun 2024 19:22:16 -0700 Subject: [PATCH] Renamed SDL_HINT_IME_NATIVE_UI to SDL_HINT_IME_IMPLEMENTED_UI This inverts the logic to make more sense from an application perspective. --- docs/README-migration.md | 4 +-- include/SDL3/SDL_hints.h | 22 +++++----------- src/core/linux/SDL_fcitx.c | 18 +++++-------- src/core/linux/SDL_ibus.c | 18 +++++-------- src/video/windows/SDL_windowskeyboard.c | 35 +++++++++++-------------- src/video/windows/SDL_windowsvideo.h | 4 +-- test/testime.c | 28 +++++++++----------- 7 files changed, 52 insertions(+), 77 deletions(-) diff --git a/docs/README-migration.md b/docs/README-migration.md index 15bb9650a2..39f3d44a14 100644 --- a/docs/README-migration.md +++ b/docs/README-migration.md @@ -757,8 +757,8 @@ The following hints have been removed: * SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS - gamepad buttons are always positional * SDL_HINT_GRAB_KEYBOARD - use SDL_SetWindowKeyboardGrab() instead * SDL_HINT_IDLE_TIMER_DISABLED - use SDL_DisableScreenSaver() instead -* SDL_HINT_IME_INTERNAL_EDITING - replaced with SDL_HINT_IME_NATIVE_UI -* SDL_HINT_IME_SHOW_UI - replaced with SDL_HINT_IME_NATIVE_UI +* SDL_HINT_IME_INTERNAL_EDITING - replaced with SDL_HINT_IME_IMPLEMENTED_UI +* SDL_HINT_IME_SHOW_UI - replaced with SDL_HINT_IME_IMPLEMENTED_UI * SDL_HINT_IME_SUPPORT_EXTENDED_TEXT - the normal text editing event has extended text * SDL_HINT_MOUSE_RELATIVE_SCALING - mouse coordinates are no longer automatically scaled by the SDL renderer * SDL_HINT_PS2_DYNAMIC_VSYNC - use SDL_SetRenderVSync(renderer, -1) instead diff --git a/include/SDL3/SDL_hints.h b/include/SDL3/SDL_hints.h index 08c8b37a1c..2f0ec2a8e9 100644 --- a/include/SDL3/SDL_hints.h +++ b/include/SDL3/SDL_hints.h @@ -943,32 +943,22 @@ extern "C" { #define SDL_HINT_HIDAPI_IGNORE_DEVICES "SDL_HIDAPI_IGNORE_DEVICES" /** - * A variable describing what IME elements the OS should render natively over - * the game. + * A variable describing what IME UI elements the application can display. * - * By default IME UI is handled using native components by the OS, however - * this interferes with fullscreen games in some cases. + * By default IME UI is handled using native components by the OS where possible, however this can interfere with or not be visible when exclusive fullscreen mode is used. * * The variable can be set to a comma separated list containing the following * items: * - * - "none" or "0": Native UI elements will not be displayed. - * - "composition": Native UI elements will be used for the IME composition - * string. - * - "candidates": Native UI elements will be used for the IME candidate list. - * - "all" or "1": Native UI elements will be used for all IME UI. (default) - * - * If native UI is used for the composition string, then - * SDL_EVENT_TEXT_EDITING will not be sent. - * - * If native UI is used for the candidates list, then - * SDL_EVENT_TEXT_EDITING_CANDIDATES will not be sent. + * - "none" or "0": The application can't render any IME elements, and native UI should be used. (default) + * - "composition": The application handles SDL_EVENT_TEXT_EDITING events and can render the composition text. + * - "candidates": The application handles SDL_EVENT_TEXT_EDITING_CANDIDATES and can render the candidate list. * * This hint should be set before SDL is initialized. * * \since This hint is available since SDL 3.0.0. */ -#define SDL_HINT_IME_NATIVE_UI "SDL_IME_NATIVE_UI" +#define SDL_HINT_IME_IMPLEMENTED_UI "SDL_IME_IMPLEMENTED_UI" /** * A variable controlling whether the home indicator bar on iPhone X should be diff --git a/src/core/linux/SDL_fcitx.c b/src/core/linux/SDL_fcitx.c index 44b1bb54df..5c5db2890d 100644 --- a/src/core/linux/SDL_fcitx.c +++ b/src/core/linux/SDL_fcitx.c @@ -237,16 +237,12 @@ static void SDLCALL Fcitx_SetCapabilities(void *data, return; } - if (!hint || !*hint || *hint == '1' || SDL_strstr(hint, "all")) { - // Let the OS handle IME UI - } else { - if (!SDL_strstr(hint, "composition")) { - caps |= (1 << 1); /* Preedit Flag */ - caps |= (1 << 4); /* Formatted Preedit Flag */ - } - if (!SDL_strstr(hint, "candidates")) { - // FIXME, turn off native candidate rendering - } + if (hint && SDL_strstr(hint, "composition")) { + caps |= (1 << 1); /* Preedit Flag */ + caps |= (1 << 4); /* Formatted Preedit Flag */ + } + if (hint && SDL_strstr(hint, "candidates")) { + // FIXME, turn off native candidate rendering } SDL_DBus_CallVoidMethod(FCITX_DBUS_SERVICE, client->ic_path, FCITX_IC_DBUS_INTERFACE, "SetCapability", DBUS_TYPE_UINT64, &caps, DBUS_TYPE_INVALID); @@ -307,7 +303,7 @@ static SDL_bool FcitxClientCreateIC(FcitxClient *client) NULL); dbus->connection_flush(dbus->session_conn); - SDL_AddHintCallback(SDL_HINT_IME_NATIVE_UI, Fcitx_SetCapabilities, client); + SDL_AddHintCallback(SDL_HINT_IME_IMPLEMENTED_UI, Fcitx_SetCapabilities, client); return SDL_TRUE; } diff --git a/src/core/linux/SDL_ibus.c b/src/core/linux/SDL_ibus.c index c34ebc96c6..3053954308 100644 --- a/src/core/linux/SDL_ibus.c +++ b/src/core/linux/SDL_ibus.c @@ -411,15 +411,11 @@ static void SDLCALL IBus_SetCapabilities(void *data, const char *name, const cha if (IBus_CheckConnection(dbus)) { Uint32 caps = IBUS_CAP_FOCUS; - if (!hint || !*hint || *hint == '1' || SDL_strstr(hint, "all")) { - // Let the OS handle IME UI - } else { - if (!SDL_strstr(hint, "composition")) { - caps |= IBUS_CAP_PREEDIT_TEXT; - } - if (!SDL_strstr(hint, "candidates")) { - // FIXME, turn off native candidate rendering - } + if (hint && SDL_strstr(hint, "composition")) { + caps |= IBUS_CAP_PREEDIT_TEXT; + } + if (hint && SDL_strstr(hint, "candidates")) { + // FIXME, turn off native candidate rendering } SDL_DBus_CallVoidMethodOnConnection(ibus_conn, ibus_service, input_ctx_path, ibus_input_interface, "SetCapabilities", @@ -482,7 +478,7 @@ static SDL_bool IBus_SetupConnection(SDL_DBusContext *dbus, const char *addr) (void)SDL_snprintf(matchstr, sizeof(matchstr), "type='signal',interface='%s'", ibus_input_interface); SDL_free(input_ctx_path); input_ctx_path = SDL_strdup(path); - SDL_AddHintCallback(SDL_HINT_IME_NATIVE_UI, IBus_SetCapabilities, NULL); + SDL_AddHintCallback(SDL_HINT_IME_IMPLEMENTED_UI, IBus_SetCapabilities, NULL); dbus->bus_add_match(ibus_conn, matchstr, NULL); dbus->connection_try_register_object_path(ibus_conn, input_ctx_path, &ibus_vtable, dbus, NULL); dbus->connection_flush(ibus_conn); @@ -639,7 +635,7 @@ void SDL_IBus_Quit(void) /* !!! FIXME: should we close(inotify_fd) here? */ - SDL_DelHintCallback(SDL_HINT_IME_NATIVE_UI, IBus_SetCapabilities, NULL); + SDL_DelHintCallback(SDL_HINT_IME_IMPLEMENTED_UI, IBus_SetCapabilities, NULL); SDL_memset(&ibus_cursor_rect, 0, sizeof(ibus_cursor_rect)); } diff --git a/src/video/windows/SDL_windowskeyboard.c b/src/video/windows/SDL_windowskeyboard.c index cba4f59f8c..c12a51dccf 100644 --- a/src/video/windows/SDL_windowskeyboard.c +++ b/src/video/windows/SDL_windowskeyboard.c @@ -314,17 +314,12 @@ static int IME_Init(SDL_VideoData *videodata, SDL_Window *window) return 0; } - const char *hint = SDL_GetHint(SDL_HINT_IME_NATIVE_UI); - if (!hint || !*hint || *hint == '1' || SDL_strstr(hint, "all")) { - videodata->ime_native_composition = SDL_TRUE; - videodata->ime_native_candidates = SDL_TRUE; - } else { - if (SDL_strstr(hint, "composition")) { - videodata->ime_native_composition = SDL_TRUE; - } - if (SDL_strstr(hint, "candidates")) { - videodata->ime_native_candidates = SDL_TRUE; - } + const char *hint = SDL_GetHint(SDL_HINT_IME_IMPLEMENTED_UI); + if (hint && SDL_strstr(hint, "composition")) { + videodata->ime_internal_composition = SDL_TRUE; + } + if (hint && SDL_strstr(hint, "candidates")) { + videodata->ime_internal_candidates = SDL_TRUE; } videodata->ime_hwnd_main = hwnd; @@ -545,7 +540,7 @@ static DWORD IME_GetId(SDL_VideoData *videodata, UINT uIndex) SDL_assert(uIndex == 0); dwLang = ((DWORD_PTR)hkl & 0xffff); // FIXME: What does this do? - if (!videodata->ime_native_candidates && dwLang == LANG_CHT) { + if (videodata->ime_internal_candidates && dwLang == LANG_CHT) { dwRet[0] = IMEID_CHT_VER_VISTA; dwRet[1] = 0; return dwRet[0]; @@ -988,14 +983,14 @@ SDL_bool WIN_HandleIMEMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM *lParam SDL_DebugIMELog("WM_IME_SETCONTEXT\n"); LPARAM element_mask; - if (!videodata->ime_native_composition && !videodata->ime_native_candidates) { + if (videodata->ime_internal_composition && videodata->ime_internal_candidates) { element_mask = 0; } else { element_mask = ISC_SHOWUIALL; - if (!videodata->ime_native_composition) { + if (videodata->ime_internal_composition) { element_mask &= ~ISC_SHOWUICOMPOSITIONWINDOW; } - if (!videodata->ime_native_candidates) { + if (videodata->ime_internal_candidates) { element_mask &= ~ISC_SHOWUIALLCANDIDATEWINDOW; } } @@ -1023,13 +1018,13 @@ SDL_bool WIN_HandleIMEMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM *lParam break; case WM_IME_STARTCOMPOSITION: SDL_DebugIMELog("WM_IME_STARTCOMPOSITION\n"); - if (!videodata->ime_native_composition) { + if (videodata->ime_internal_composition) { trap = SDL_TRUE; } break; case WM_IME_COMPOSITION: SDL_DebugIMELog("WM_IME_COMPOSITION %x\n", lParam); - if (!videodata->ime_native_composition) { + if (videodata->ime_internal_composition) { trap = SDL_TRUE; himc = ImmGetContext(hwnd); if (*lParam & GCS_RESULTSTR) { @@ -1049,7 +1044,7 @@ SDL_bool WIN_HandleIMEMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM *lParam break; case WM_IME_ENDCOMPOSITION: SDL_DebugIMELog("WM_IME_ENDCOMPOSITION\n"); - if (!videodata->ime_native_composition) { + if (videodata->ime_internal_composition) { trap = SDL_TRUE; videodata->ime_composition[0] = 0; videodata->ime_readingstring[0] = 0; @@ -1079,14 +1074,14 @@ SDL_bool WIN_HandleIMEMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM *lParam case IMN_OPENCANDIDATE: case IMN_CHANGECANDIDATE: SDL_DebugIMELog("%s\n", wParam == IMN_OPENCANDIDATE ? "IMN_OPENCANDIDATE" : "IMN_CHANGECANDIDATE"); - if (!videodata->ime_native_candidates) { + if (videodata->ime_internal_candidates) { trap = SDL_TRUE; videodata->ime_update_candidates = SDL_TRUE; } break; case IMN_CLOSECANDIDATE: SDL_DebugIMELog("IMN_CLOSECANDIDATE\n"); - if (!videodata->ime_native_candidates) { + if (videodata->ime_internal_candidates) { trap = SDL_TRUE; videodata->ime_update_candidates = SDL_FALSE; IME_CloseCandidateList(videodata); diff --git a/src/video/windows/SDL_windowsvideo.h b/src/video/windows/SDL_windowsvideo.h index 5a07f1a100..44b3050ca4 100644 --- a/src/video/windows/SDL_windowsvideo.h +++ b/src/video/windows/SDL_windowsvideo.h @@ -423,6 +423,8 @@ struct SDL_VideoData SDL_bool ime_initialized; SDL_bool ime_enabled; SDL_bool ime_available; + SDL_bool ime_internal_composition; + SDL_bool ime_internal_candidates; HWND ime_hwnd_main; HWND ime_hwnd_current; SDL_bool ime_needs_clear_composition; @@ -460,8 +462,6 @@ struct SDL_VideoData BOOL (WINAPI *ImmUnlockIMCC)(HIMCC himcc); /* *INDENT-ON* */ /* clang-format on */ - SDL_bool ime_native_composition; - SDL_bool ime_native_candidates; #endif /* !SDL_DISABLE_WINDOWS_IME */ BYTE pre_hook_key_state[256]; diff --git a/test/testime.c b/test/testime.c index 1ed6e0cb9d..1427ba5e57 100644 --- a/test/testime.c +++ b/test/testime.c @@ -867,8 +867,8 @@ static void Redraw(void) int main(int argc, char *argv[]) { - SDL_bool native_composition = SDL_TRUE; - SDL_bool native_candidates = SDL_TRUE; + SDL_bool render_composition = SDL_FALSE; + SDL_bool render_candidates = SDL_FALSE; int i, done; SDL_Event event; char *fontname = NULL; @@ -892,15 +892,15 @@ int main(int argc, char *argv[]) fontname = argv[i + 1]; consumed = 2; } - } else if (SDL_strcmp(argv[i], "--disable-native-composition") == 0) { - native_composition = SDL_FALSE; + } else if (SDL_strcmp(argv[i], "--render-composition") == 0) { + render_composition = SDL_TRUE; consumed = 1; - } else if (SDL_strcmp(argv[i], "--disable-native-candidates") == 0) { - native_candidates = SDL_FALSE; + } else if (SDL_strcmp(argv[i], "--render-candidates") == 0) { + render_candidates = SDL_TRUE; consumed = 1; } if (consumed <= 0) { - static const char *options[] = { "[--font fontfile] [--disable-native-composition] [--disable-native-candidates]", NULL }; + static const char *options[] = { "[--font fontfile] [--render-composition] [--render-candidates]", NULL }; SDLTest_CommonLogUsage(state, argv[0], options); return 1; } @@ -908,14 +908,12 @@ int main(int argc, char *argv[]) i += consumed; } - if (native_composition && native_candidates) { - SDL_SetHint(SDL_HINT_IME_NATIVE_UI, "1"); - } else if (native_composition) { - SDL_SetHint(SDL_HINT_IME_NATIVE_UI, "composition"); - } else if (native_candidates) { - SDL_SetHint(SDL_HINT_IME_NATIVE_UI, "candidates"); - } else { - SDL_SetHint(SDL_HINT_IME_NATIVE_UI, "0"); + if (render_composition && render_candidates) { + SDL_SetHint(SDL_HINT_IME_IMPLEMENTED_UI, "composition,candidates"); + } else if (render_composition) { + SDL_SetHint(SDL_HINT_IME_IMPLEMENTED_UI, "composition"); + } else if (render_candidates) { + SDL_SetHint(SDL_HINT_IME_IMPLEMENTED_UI, "candidates"); } if (!SDLTest_CommonInit(state)) {