mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-10-26 12:27:44 +00:00 
			
		
		
		
	Added: Support for showing the IME Candidate Window on Windows
This commit is contained in:
		| @@ -557,6 +557,15 @@ extern "C" { | |||||||
|  */ |  */ | ||||||
| #define SDL_HINT_IME_INTERNAL_EDITING "SDL_IME_INTERNAL_EDITING" | #define SDL_HINT_IME_INTERNAL_EDITING "SDL_IME_INTERNAL_EDITING" | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * \brief A variable to control whether certain IMEs should show native UI components (such as the Candidate List) instead of suppressing them. | ||||||
|  |  * | ||||||
|  |  * The variable can be set to the following values: | ||||||
|  |  *   "0"       - Native UI components are not display. (default) | ||||||
|  |  *   "1"       - Native UI components are displayed. | ||||||
|  |  */ | ||||||
|  | #define SDL_HINT_IME_SHOW_UI "SDL_IME_SHOW_UI" | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * \brief  A variable controlling whether the home indicator bar on iPhone X |  * \brief  A variable controlling whether the home indicator bar on iPhone X | ||||||
|  *         should be hidden. |  *         should be hidden. | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ | |||||||
| #if SDL_VIDEO_DRIVER_WINDOWS | #if SDL_VIDEO_DRIVER_WINDOWS | ||||||
|  |  | ||||||
| #include "SDL_windowsvideo.h" | #include "SDL_windowsvideo.h" | ||||||
|  | #include "SDL_hints.h" | ||||||
|  |  | ||||||
| #include "../../events/SDL_keyboard_c.h" | #include "../../events/SDL_keyboard_c.h" | ||||||
| #include "../../events/scancodes_windows.h" | #include "../../events/scancodes_windows.h" | ||||||
| @@ -245,15 +246,23 @@ WIN_SetTextInputRect(_THIS, SDL_Rect *rect) | |||||||
|     himc = ImmGetContext(videodata->ime_hwnd_current); |     himc = ImmGetContext(videodata->ime_hwnd_current); | ||||||
|     if (himc) |     if (himc) | ||||||
|     { |     { | ||||||
|         COMPOSITIONFORM cf; |         CANDIDATEFORM cf; | ||||||
|  |         cf.dwIndex = 0; | ||||||
|  |         cf.dwStyle = CFS_POINT; | ||||||
|         cf.ptCurrentPos.x = videodata->ime_rect.x; |         cf.ptCurrentPos.x = videodata->ime_rect.x; | ||||||
|         cf.ptCurrentPos.y = videodata->ime_rect.y; |         cf.ptCurrentPos.y = videodata->ime_rect.y; | ||||||
|         cf.dwStyle = CFS_FORCE_POSITION; |          | ||||||
|         ImmSetCompositionWindow(himc, &cf); |         ImmSetCandidateWindow(himc, &cf); | ||||||
|         ImmReleaseContext(videodata->ime_hwnd_current, himc); |         ImmReleaseContext(videodata->ime_hwnd_current, himc); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static SDL_bool | ||||||
|  | WIN_ShouldShowNativeUI() | ||||||
|  | { | ||||||
|  |     return SDL_GetHintBoolean(SDL_HINT_IME_SHOW_UI, SDL_FALSE); | ||||||
|  | } | ||||||
|  |  | ||||||
| #ifdef SDL_DISABLE_WINDOWS_IME | #ifdef SDL_DISABLE_WINDOWS_IME | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -371,7 +380,10 @@ IME_Init(SDL_VideoData *videodata, HWND hwnd) | |||||||
|     videodata->ime_available = SDL_TRUE; |     videodata->ime_available = SDL_TRUE; | ||||||
|     IME_UpdateInputLocale(videodata); |     IME_UpdateInputLocale(videodata); | ||||||
|     IME_SetupAPI(videodata); |     IME_SetupAPI(videodata); | ||||||
|     videodata->ime_uiless = UILess_SetupSinks(videodata); |     if (WIN_ShouldShowNativeUI()) | ||||||
|  |         videodata->ime_uiless = SDL_FALSE; | ||||||
|  |     else | ||||||
|  |         videodata->ime_uiless = UILess_SetupSinks(videodata); | ||||||
|     IME_UpdateInputLocale(videodata); |     IME_UpdateInputLocale(videodata); | ||||||
|     IME_Disable(videodata, hwnd); |     IME_Disable(videodata, hwnd); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Zach Reedy
					Zach Reedy