From 212a491f7c1db477b29b89630d87575d64097c99 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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 15bb9650a2ec5..39f3d44a1407c 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 08c8b37a1ccec..2f0ec2a8e9df0 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 44b1bb54df6e2..5c5db2890d15b 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 c34ebc96c6f28..305395430880d 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 cba4f59f8c295..c12a51dccf883 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 5a07f1a100b72..44b3050ca48e6 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 1ed6e0cb9d304..1427ba5e57633 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)) {