Mercurial > sdl-ios-xcode
annotate include/begin_code.h @ 4384:6800e2560310 SDL-1.2
Fixed bugs #882 and 865, re-opening bug #634
Ronald Lamprecht to SDL
Hi,
Sam Lantinga wrote:
The problem with that fix is that it breaks IME events again. Maybe
we can handle keyboard events differently to prevent this issue?
Spending an hour reading MSDN, analysing SDL and another hour testing the reality on XP I am really wondering how patch r4990 could have ever worked in any situation. It's main effect is to break the unicode translation and causing spurious activation events!
Why does TranslateMessage(&msg) nothing useful? Simply because it does not affect "msg" at all! All keyboard events are dispatched without the slightest change (see MSDN). TranslateMessage() just appends additional WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHAR event messages to the queue. But I could not find any SDL event handling routine that catches these events and transforms them to proper SDL keyevents while eliminating the corresponding WM_KEYDOWN, etc. events. Thus any IME input like the '@' generated by "Alt + 6(Numpad) + 4(Numpad)" is simply lost.
But the situation is even worse! Up to r4990 the TranslateKey()/ToUnicode() calls did evaluate dead keys and did deliver proper key events for subsequent key strokes like '´' + 'e' resulting in 'é'. ToUnicode() needs proper key state informations to be able to handle these substitutions. But unfortunatly TranslateMessage() needs the same state information and eats it up while generating the WM_CHAR messages :-( Thus the current 1.2.14 breakes the partial IME support of previous releases, too.
The key state race condition between ToUnicode() and TranslateMessage() requires to avoid any ToUnicode() usage for receiving proper WM_CHAR, etc. messages generated by TranslateMessage(). (Yes - the '@' and 'é' appear as WM_CHAR messages when unicode is switched off).
The spurious SDL activation events are *not* caused by additional WM_ACTIVATE Windows messages! Besides DIB_HandleMessage() SDL_PrivateAppActive() is called by another source which I am not yet aware of - any hints?
Thus I do strongly recommend the deletion of the TranslateMessage(&msg) call as a quick fix.
A proper support of unicode and IME requires a clean SDL keyboard input concept first. Which SDL keyboards events should be transmitted to the app when the user presses '´' + 'e' ? Within the current unicode handling the first key stroke is hidden. Even though ToUnicode() delivers the proper key SDL does ignore it in TranslateKey(). Just the composed key event is transmitted to the app. That is what you expect for text input, but the app can no longer use keys like '^' as a key button because it will never receive a key event for it!
With a given concept it seems to be necessary to regenerate SDL key events out of the WM_CHAR, etc. events and to drop all related direct WM_KEYDOWN, etc. events while the remaining basic WM_KEYDOWN, etc. events would still have to result in SDL key events.
Anyway the source of the spurious WM_ACTIVATE should be located to avoid future trouble.
Greets,
Ronald
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 17 Nov 2009 04:59:13 +0000 |
parents | 4c4113c2162c |
children | 0d4756e57224 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
4159 | 3 Copyright (C) 1997-2009 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 of the License, or (at your option) any later version. | |
9 | |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
251
b8688cfdc232
Updated the headers with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
195
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
22 | |
4217 | 23 /** |
24 * @file begin_code.h | |
25 * This file sets things up for C dynamic library function definitions, | |
26 * static inlined functions, and structures aligned at 4-byte alignment. | |
27 * If you don't like ugly C preprocessor code, don't look at this file. :) | |
28 */ | |
0 | 29 |
4217 | 30 /** |
31 * @file begin_code.h | |
32 * This shouldn't be nested -- included it around code only. | |
33 */ | |
0 | 34 #ifdef _begin_code_h |
35 #error Nested inclusion of begin_code.h | |
36 #endif | |
37 #define _begin_code_h | |
38 | |
4217 | 39 /** |
40 * @def DECLSPEC | |
41 * Some compilers use a special export keyword | |
42 */ | |
0 | 43 #ifndef DECLSPEC |
4164
7a4c511c980a
Date: Fri, 6 Mar 2009 12:41:17 -0800
Sam Lantinga <slouken@libsdl.org>
parents:
4159
diff
changeset
|
44 # if defined(__BEOS__) || defined(__HAIKU__) |
0 | 45 # if defined(__GNUC__) |
46 # define DECLSPEC __declspec(dllexport) | |
47 # else | |
48 # define DECLSPEC __declspec(export) | |
49 # endif | |
1574
0fd72308659e
Default to use the visibility attribute, on gcc (is this okay?)
Sam Lantinga <slouken@libsdl.org>
parents:
1573
diff
changeset
|
50 # elif defined(__WIN32__) |
274
051b991765ba
David Snopek added Borland compiler support
Sam Lantinga <slouken@libsdl.org>
parents:
251
diff
changeset
|
51 # ifdef __BORLANDC__ |
051b991765ba
David Snopek added Borland compiler support
Sam Lantinga <slouken@libsdl.org>
parents:
251
diff
changeset
|
52 # ifdef BUILD_SDL |
636
d9c2ab142f2f
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
346
diff
changeset
|
53 # define DECLSPEC |
274
051b991765ba
David Snopek added Borland compiler support
Sam Lantinga <slouken@libsdl.org>
parents:
251
diff
changeset
|
54 # else |
1574
0fd72308659e
Default to use the visibility attribute, on gcc (is this okay?)
Sam Lantinga <slouken@libsdl.org>
parents:
1573
diff
changeset
|
55 # define DECLSPEC __declspec(dllimport) |
274
051b991765ba
David Snopek added Borland compiler support
Sam Lantinga <slouken@libsdl.org>
parents:
251
diff
changeset
|
56 # endif |
051b991765ba
David Snopek added Borland compiler support
Sam Lantinga <slouken@libsdl.org>
parents:
251
diff
changeset
|
57 # else |
051b991765ba
David Snopek added Borland compiler support
Sam Lantinga <slouken@libsdl.org>
parents:
251
diff
changeset
|
58 # define DECLSPEC __declspec(dllexport) |
051b991765ba
David Snopek added Borland compiler support
Sam Lantinga <slouken@libsdl.org>
parents:
251
diff
changeset
|
59 # endif |
1574
0fd72308659e
Default to use the visibility attribute, on gcc (is this okay?)
Sam Lantinga <slouken@libsdl.org>
parents:
1573
diff
changeset
|
60 # elif defined(__OS2__) |
1190 | 61 # ifdef __WATCOMC__ |
62 # ifdef BUILD_SDL | |
1574
0fd72308659e
Default to use the visibility attribute, on gcc (is this okay?)
Sam Lantinga <slouken@libsdl.org>
parents:
1573
diff
changeset
|
63 # define DECLSPEC __declspec(dllexport) |
1190 | 64 # else |
1574
0fd72308659e
Default to use the visibility attribute, on gcc (is this okay?)
Sam Lantinga <slouken@libsdl.org>
parents:
1573
diff
changeset
|
65 # define DECLSPEC |
0fd72308659e
Default to use the visibility attribute, on gcc (is this okay?)
Sam Lantinga <slouken@libsdl.org>
parents:
1573
diff
changeset
|
66 # endif |
4193
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
67 # elif defined (__GNUC__) && __GNUC__ < 4 |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
68 # /* Added support for GCC-EMX <v4.x */ |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
69 # /* this is needed for XFree86/OS2 developement */ |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
70 # /* F. Ambacher(anakor@snafu.de) 05.2008 */ |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
71 # ifdef BUILD_SDL |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
72 # define DECLSPEC __declspec(dllexport) |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
73 # else |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
74 # define DECLSPEC |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
75 # endif |
1190 | 76 # else |
77 # define DECLSPEC | |
78 # endif | |
79 # else | |
1595
4aa7df2476e7
Only use the visibility attribute in gcc 4.0 or newer
Sam Lantinga <slouken@libsdl.org>
parents:
1574
diff
changeset
|
80 # if defined(__GNUC__) && __GNUC__ >= 4 |
1574
0fd72308659e
Default to use the visibility attribute, on gcc (is this okay?)
Sam Lantinga <slouken@libsdl.org>
parents:
1573
diff
changeset
|
81 # define DECLSPEC __attribute__ ((visibility("default"))) |
0fd72308659e
Default to use the visibility attribute, on gcc (is this okay?)
Sam Lantinga <slouken@libsdl.org>
parents:
1573
diff
changeset
|
82 # else |
0fd72308659e
Default to use the visibility attribute, on gcc (is this okay?)
Sam Lantinga <slouken@libsdl.org>
parents:
1573
diff
changeset
|
83 # define DECLSPEC |
0fd72308659e
Default to use the visibility attribute, on gcc (is this okay?)
Sam Lantinga <slouken@libsdl.org>
parents:
1573
diff
changeset
|
84 # endif |
0 | 85 # endif |
86 #endif | |
87 | |
4217 | 88 /** |
89 * @def SDLCALL | |
90 * By default SDL uses the C calling convention | |
91 */ | |
337
9154ec9ca3d2
Explicitly specify the SDL API calling convention (C by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
92 #ifndef SDLCALL |
4193
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
93 # if defined(__WIN32__) && !defined(__GNUC__) |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
94 # define SDLCALL __cdecl |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
95 # elif defined(__OS2__) |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
96 # if defined (__GNUC__) && __GNUC__ < 4 |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
97 # /* Added support for GCC-EMX <v4.x */ |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
98 # /* this is needed for XFree86/OS2 developement */ |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
99 # /* F. Ambacher(anakor@snafu.de) 05.2008 */ |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
100 # define SDLCALL _cdecl |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
101 # else |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
102 # /* On other compilers on OS/2, we use the _System calling convention */ |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
103 # /* to be compatible with every compiler */ |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
104 # define SDLCALL _System |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
105 # endif |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
106 # else |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
107 # define SDLCALL |
430e6690c4cd
GCC 3.03 support on OS/2.
Ryan C. Gordon <icculus@icculus.org>
parents:
4164
diff
changeset
|
108 # endif |
337
9154ec9ca3d2
Explicitly specify the SDL API calling convention (C by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
109 #endif /* SDLCALL */ |
9154ec9ca3d2
Explicitly specify the SDL API calling convention (C by default)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
110 |
173
83018110dce8
Added initial support for EPOC/Symbian OS (thanks Hannu!)
Sam Lantinga <slouken@libsdl.org>
parents:
85
diff
changeset
|
111 #ifdef __SYMBIAN32__ |
3975 | 112 #ifndef EKA2 |
173
83018110dce8
Added initial support for EPOC/Symbian OS (thanks Hannu!)
Sam Lantinga <slouken@libsdl.org>
parents:
85
diff
changeset
|
113 #undef DECLSPEC |
83018110dce8
Added initial support for EPOC/Symbian OS (thanks Hannu!)
Sam Lantinga <slouken@libsdl.org>
parents:
85
diff
changeset
|
114 #define DECLSPEC |
3975 | 115 #elif !defined(__WINS__) |
116 #undef DECLSPEC | |
117 #define DECLSPEC __declspec(dllexport) | |
4091
98b219f9ff17
Removed some C++ style comments from the public headers.
Ryan C. Gordon <icculus@icculus.org>
parents:
3975
diff
changeset
|
118 #endif /* !EKA2 */ |
98b219f9ff17
Removed some C++ style comments from the public headers.
Ryan C. Gordon <icculus@icculus.org>
parents:
3975
diff
changeset
|
119 #endif /* __SYMBIAN32__ */ |
173
83018110dce8
Added initial support for EPOC/Symbian OS (thanks Hannu!)
Sam Lantinga <slouken@libsdl.org>
parents:
85
diff
changeset
|
120 |
4217 | 121 /** |
122 * @file begin_code.h | |
123 * Force structure packing at 4 byte alignment. | |
124 * This is necessary if the header is included in code which has structure | |
125 * packing set to an alternate value, say for loading structures from disk. | |
126 * The packing is reset to the previous value in close_code.h | |
0 | 127 */ |
288
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
128 #if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__) |
0 | 129 #ifdef _MSC_VER |
130 #pragma warning(disable: 4103) | |
131 #endif | |
132 #ifdef __BORLANDC__ | |
133 #pragma nopackwarning | |
134 #endif | |
195
3669d47b07d3
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
189
diff
changeset
|
135 #pragma pack(push,4) |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1190
diff
changeset
|
136 #elif (defined(__MWERKS__) && defined(__MACOS__)) |
189
175917167aac
Date: Thu, 13 Sep 2001 14:14:42 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
187
diff
changeset
|
137 #pragma options align=mac68k4byte |
175917167aac
Date: Thu, 13 Sep 2001 14:14:42 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
187
diff
changeset
|
138 #pragma enumsalwaysint on |
0 | 139 #endif /* Compiler needs structure packing set */ |
140 | |
4217 | 141 /** |
142 * @def SDL_INLINE_OKAY | |
143 * Set up compiler-specific options for inlining functions | |
144 */ | |
0 | 145 #ifndef SDL_INLINE_OKAY |
146 #ifdef __GNUC__ | |
147 #define SDL_INLINE_OKAY | |
148 #else | |
149 /* Add any special compiler-specific cases here */ | |
288
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
150 #if defined(_MSC_VER) || defined(__BORLANDC__) || \ |
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
151 defined(__DMC__) || defined(__SC__) || \ |
1019
e3b3130f3af8
Date: Fri, 31 Dec 2004 04:14:09 +0900
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
152 defined(__WATCOMC__) || defined(__LCC__) || \ |
3975 | 153 defined(__DECC) || defined(__EABI__) |
288
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
154 #ifndef __inline__ |
85
60c7960354e0
Added support for Visual C++ inline keyword
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
155 #define __inline__ __inline |
288
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
156 #endif |
85
60c7960354e0
Added support for Visual C++ inline keyword
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
157 #define SDL_INLINE_OKAY |
60c7960354e0
Added support for Visual C++ inline keyword
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
158 #else |
60c7960354e0
Added support for Visual C++ inline keyword
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
159 #if !defined(__MRC__) && !defined(_SGI_SOURCE) |
3965
19d708301fab
Make sure __inline__ isn't defined before #defining it, since some compilers
Ryan C. Gordon <icculus@icculus.org>
parents:
1621
diff
changeset
|
160 #ifndef __inline__ |
0 | 161 #define __inline__ inline |
3965
19d708301fab
Make sure __inline__ isn't defined before #defining it, since some compilers
Ryan C. Gordon <icculus@icculus.org>
parents:
1621
diff
changeset
|
162 #endif |
0 | 163 #define SDL_INLINE_OKAY |
164 #endif /* Not a funky compiler */ | |
85
60c7960354e0
Added support for Visual C++ inline keyword
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
165 #endif /* Visual C++ */ |
0 | 166 #endif /* GNU C */ |
167 #endif /* SDL_INLINE_OKAY */ | |
168 | |
4217 | 169 /** |
170 * @def __inline__ | |
171 * If inlining isn't supported, remove "__inline__", turning static | |
172 * inlined functions into static functions (resulting in code bloat | |
173 * in all files which include the offending header files) | |
174 */ | |
0 | 175 #ifndef SDL_INLINE_OKAY |
176 #define __inline__ | |
177 #endif | |
178 | |
4217 | 179 /** |
180 * @def NULL | |
181 * Apparently this is needed by several Windows compilers | |
182 */ | |
346
a18ea34d9efe
Fixed precompiled headers on MacOS X
Sam Lantinga <slouken@libsdl.org>
parents:
337
diff
changeset
|
183 #if !defined(__MACH__) |
288
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
184 #ifndef NULL |
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
185 #ifdef __cplusplus |
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
186 #define NULL 0 |
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
187 #else |
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
188 #define NULL ((void *)0) |
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
189 #endif |
2f5a6062db86
Updated for Watcom C++ and LCC compilers
Sam Lantinga <slouken@libsdl.org>
parents:
274
diff
changeset
|
190 #endif /* NULL */ |
1621 | 191 #endif /* ! Mac OS X - breaks precompiled headers */ |