1 | /* |
2 | Simple DirectMedia Layer |
3 | Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org> |
4 | |
5 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the authors be held liable for any damages |
7 | arising from the use of this software. |
8 | |
9 | Permission is granted to anyone to use this software for any purpose, |
10 | including commercial applications, and to alter it and redistribute it |
11 | freely, subject to the following restrictions: |
12 | |
13 | 1. The origin of this software must not be misrepresented; you must not |
14 | claim that you wrote the original software. If you use this software |
15 | in a product, an acknowledgment in the product documentation would be |
16 | appreciated but is not required. |
17 | 2. Altered source versions must be plainly marked as such, and must not be |
18 | misrepresented as being the original software. |
19 | 3. This notice may not be removed or altered from any source distribution. |
20 | */ |
21 | |
22 | #include "SDL_ime.h" |
23 | #include "SDL_ibus.h" |
24 | #include "SDL_fcitx.h" |
25 | |
26 | typedef SDL_bool (*_SDL_IME_Init)(); |
27 | typedef void (*_SDL_IME_Quit)(); |
28 | typedef void (*_SDL_IME_SetFocus)(SDL_bool); |
29 | typedef void (*_SDL_IME_Reset)(); |
30 | typedef SDL_bool (*_SDL_IME_ProcessKeyEvent)(Uint32, Uint32); |
31 | typedef void (*_SDL_IME_UpdateTextRect)(SDL_Rect *); |
32 | typedef void (*_SDL_IME_PumpEvents)(); |
33 | |
34 | static _SDL_IME_Init SDL_IME_Init_Real = NULL; |
35 | static _SDL_IME_Quit SDL_IME_Quit_Real = NULL; |
36 | static _SDL_IME_SetFocus SDL_IME_SetFocus_Real = NULL; |
37 | static _SDL_IME_Reset SDL_IME_Reset_Real = NULL; |
38 | static _SDL_IME_ProcessKeyEvent SDL_IME_ProcessKeyEvent_Real = NULL; |
39 | static _SDL_IME_UpdateTextRect SDL_IME_UpdateTextRect_Real = NULL; |
40 | static _SDL_IME_PumpEvents SDL_IME_PumpEvents_Real = NULL; |
41 | |
42 | static void |
43 | InitIME() |
44 | { |
45 | static SDL_bool inited = SDL_FALSE; |
46 | #ifdef HAVE_FCITX |
47 | const char *im_module = SDL_getenv("SDL_IM_MODULE" ); |
48 | const char *xmodifiers = SDL_getenv("XMODIFIERS" ); |
49 | #endif |
50 | |
51 | if (inited == SDL_TRUE) |
52 | return; |
53 | |
54 | inited = SDL_TRUE; |
55 | |
56 | /* See if fcitx IME support is being requested */ |
57 | #ifdef HAVE_FCITX |
58 | if (!SDL_IME_Init_Real && |
59 | ((im_module && SDL_strcmp(im_module, "fcitx" ) == 0) || |
60 | (!im_module && xmodifiers && SDL_strstr(xmodifiers, "@im=fcitx" ) != NULL))) { |
61 | SDL_IME_Init_Real = SDL_Fcitx_Init; |
62 | SDL_IME_Quit_Real = SDL_Fcitx_Quit; |
63 | SDL_IME_SetFocus_Real = SDL_Fcitx_SetFocus; |
64 | SDL_IME_Reset_Real = SDL_Fcitx_Reset; |
65 | SDL_IME_ProcessKeyEvent_Real = SDL_Fcitx_ProcessKeyEvent; |
66 | SDL_IME_UpdateTextRect_Real = SDL_Fcitx_UpdateTextRect; |
67 | SDL_IME_PumpEvents_Real = SDL_Fcitx_PumpEvents; |
68 | } |
69 | #endif /* HAVE_FCITX */ |
70 | |
71 | /* default to IBus */ |
72 | #ifdef HAVE_IBUS_IBUS_H |
73 | if (!SDL_IME_Init_Real) { |
74 | SDL_IME_Init_Real = SDL_IBus_Init; |
75 | SDL_IME_Quit_Real = SDL_IBus_Quit; |
76 | SDL_IME_SetFocus_Real = SDL_IBus_SetFocus; |
77 | SDL_IME_Reset_Real = SDL_IBus_Reset; |
78 | SDL_IME_ProcessKeyEvent_Real = SDL_IBus_ProcessKeyEvent; |
79 | SDL_IME_UpdateTextRect_Real = SDL_IBus_UpdateTextRect; |
80 | SDL_IME_PumpEvents_Real = SDL_IBus_PumpEvents; |
81 | } |
82 | #endif /* HAVE_IBUS_IBUS_H */ |
83 | } |
84 | |
85 | SDL_bool |
86 | SDL_IME_Init(void) |
87 | { |
88 | InitIME(); |
89 | |
90 | if (SDL_IME_Init_Real) { |
91 | if (SDL_IME_Init_Real()) { |
92 | return SDL_TRUE; |
93 | } |
94 | |
95 | /* uhoh, the IME implementation's init failed! Disable IME support. */ |
96 | SDL_IME_Init_Real = NULL; |
97 | SDL_IME_Quit_Real = NULL; |
98 | SDL_IME_SetFocus_Real = NULL; |
99 | SDL_IME_Reset_Real = NULL; |
100 | SDL_IME_ProcessKeyEvent_Real = NULL; |
101 | SDL_IME_UpdateTextRect_Real = NULL; |
102 | SDL_IME_PumpEvents_Real = NULL; |
103 | } |
104 | |
105 | return SDL_FALSE; |
106 | } |
107 | |
108 | void |
109 | SDL_IME_Quit(void) |
110 | { |
111 | if (SDL_IME_Quit_Real) |
112 | SDL_IME_Quit_Real(); |
113 | } |
114 | |
115 | void |
116 | SDL_IME_SetFocus(SDL_bool focused) |
117 | { |
118 | if (SDL_IME_SetFocus_Real) |
119 | SDL_IME_SetFocus_Real(focused); |
120 | } |
121 | |
122 | void |
123 | SDL_IME_Reset(void) |
124 | { |
125 | if (SDL_IME_Reset_Real) |
126 | SDL_IME_Reset_Real(); |
127 | } |
128 | |
129 | SDL_bool |
130 | SDL_IME_ProcessKeyEvent(Uint32 keysym, Uint32 keycode) |
131 | { |
132 | if (SDL_IME_ProcessKeyEvent_Real) |
133 | return SDL_IME_ProcessKeyEvent_Real(keysym, keycode); |
134 | |
135 | return SDL_FALSE; |
136 | } |
137 | |
138 | void |
139 | SDL_IME_UpdateTextRect(SDL_Rect *rect) |
140 | { |
141 | if (SDL_IME_UpdateTextRect_Real) |
142 | SDL_IME_UpdateTextRect_Real(rect); |
143 | } |
144 | |
145 | void |
146 | SDL_IME_PumpEvents() |
147 | { |
148 | if (SDL_IME_PumpEvents_Real) |
149 | SDL_IME_PumpEvents_Real(); |
150 | } |
151 | |
152 | /* vi: set ts=4 sw=4 expandtab: */ |
153 | |