Mercurial > sdl-ios-xcode
annotate sdl.m4 @ 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 | cd98d1dc385c |
children | 3d75acd08339 7bb8f748a14d |
rev | line source |
---|---|
0 | 1 # Configure paths for SDL |
2 # Sam Lantinga 9/21/99 | |
3 # stolen from Manish Singh | |
4 # stolen back from Frank Belew | |
5 # stolen from Manish Singh | |
6 # Shamelessly stolen from Owen Taylor | |
7 | |
8 dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) | |
9 dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS | |
10 dnl | |
794
a5defa3b93e1
Updated for the latest version of automake
Sam Lantinga <slouken@libsdl.org>
parents:
489
diff
changeset
|
11 AC_DEFUN([AM_PATH_SDL], |
0 | 12 [dnl |
13 dnl Get the cflags and libraries from the sdl-config script | |
14 dnl | |
15 AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], | |
16 sdl_prefix="$withval", sdl_prefix="") | |
17 AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], | |
18 sdl_exec_prefix="$withval", sdl_exec_prefix="") | |
19 AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], | |
20 , enable_sdltest=yes) | |
21 | |
22 if test x$sdl_exec_prefix != x ; then | |
4121 | 23 sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix" |
1755
91063c450171
Don't add NONE/bin to the path - inexplicably fixes building on mingw+msys, apparently
Sam Lantinga <slouken@libsdl.org>
parents:
1550
diff
changeset
|
24 if test x${SDL_CONFIG+set} != xset ; then |
91063c450171
Don't add NONE/bin to the path - inexplicably fixes building on mingw+msys, apparently
Sam Lantinga <slouken@libsdl.org>
parents:
1550
diff
changeset
|
25 SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config |
91063c450171
Don't add NONE/bin to the path - inexplicably fixes building on mingw+msys, apparently
Sam Lantinga <slouken@libsdl.org>
parents:
1550
diff
changeset
|
26 fi |
0 | 27 fi |
28 if test x$sdl_prefix != x ; then | |
4121 | 29 sdl_config_args="$sdl_config_args --prefix=$sdl_prefix" |
1755
91063c450171
Don't add NONE/bin to the path - inexplicably fixes building on mingw+msys, apparently
Sam Lantinga <slouken@libsdl.org>
parents:
1550
diff
changeset
|
30 if test x${SDL_CONFIG+set} != xset ; then |
91063c450171
Don't add NONE/bin to the path - inexplicably fixes building on mingw+msys, apparently
Sam Lantinga <slouken@libsdl.org>
parents:
1550
diff
changeset
|
31 SDL_CONFIG=$sdl_prefix/bin/sdl-config |
91063c450171
Don't add NONE/bin to the path - inexplicably fixes building on mingw+msys, apparently
Sam Lantinga <slouken@libsdl.org>
parents:
1550
diff
changeset
|
32 fi |
0 | 33 fi |
34 | |
4135
cd98d1dc385c
Damien Carbery fixed bug #542
Sam Lantinga <slouken@libsdl.org>
parents:
4121
diff
changeset
|
35 as_save_PATH="$PATH" |
1755
91063c450171
Don't add NONE/bin to the path - inexplicably fixes building on mingw+msys, apparently
Sam Lantinga <slouken@libsdl.org>
parents:
1550
diff
changeset
|
36 if test "x$prefix" != xNONE; then |
91063c450171
Don't add NONE/bin to the path - inexplicably fixes building on mingw+msys, apparently
Sam Lantinga <slouken@libsdl.org>
parents:
1550
diff
changeset
|
37 PATH="$prefix/bin:$prefix/usr/bin:$PATH" |
91063c450171
Don't add NONE/bin to the path - inexplicably fixes building on mingw+msys, apparently
Sam Lantinga <slouken@libsdl.org>
parents:
1550
diff
changeset
|
38 fi |
489
d90349051cab
Fixed path problem with sdl.m4 macro file
Sam Lantinga <slouken@libsdl.org>
parents:
452
diff
changeset
|
39 AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) |
4135
cd98d1dc385c
Damien Carbery fixed bug #542
Sam Lantinga <slouken@libsdl.org>
parents:
4121
diff
changeset
|
40 PATH="$as_save_PATH" |
0 | 41 min_sdl_version=ifelse([$1], ,0.11.0,$1) |
42 AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) | |
43 no_sdl="" | |
44 if test "$SDL_CONFIG" = "no" ; then | |
45 no_sdl=yes | |
46 else | |
4121 | 47 SDL_CFLAGS=`$SDL_CONFIG $sdl_config_args --cflags` |
48 SDL_LIBS=`$SDL_CONFIG $sdl_config_args --libs` | |
0 | 49 |
4121 | 50 sdl_major_version=`$SDL_CONFIG $sdl_config_args --version | \ |
0 | 51 sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` |
4121 | 52 sdl_minor_version=`$SDL_CONFIG $sdl_config_args --version | \ |
0 | 53 sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` |
54 sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ | |
55 sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` | |
56 if test "x$enable_sdltest" = "xyes" ; then | |
57 ac_save_CFLAGS="$CFLAGS" | |
1118
65f4b2dd46b7
Date: Wed, 17 Aug 2005 11:23:40 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
794
diff
changeset
|
58 ac_save_CXXFLAGS="$CXXFLAGS" |
0 | 59 ac_save_LIBS="$LIBS" |
60 CFLAGS="$CFLAGS $SDL_CFLAGS" | |
1118
65f4b2dd46b7
Date: Wed, 17 Aug 2005 11:23:40 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
794
diff
changeset
|
61 CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" |
0 | 62 LIBS="$LIBS $SDL_LIBS" |
63 dnl | |
64 dnl Now check if the installed SDL is sufficiently new. (Also sanity | |
65 dnl checks the results of sdl-config to some extent | |
66 dnl | |
67 rm -f conf.sdltest | |
68 AC_TRY_RUN([ | |
69 #include <stdio.h> | |
70 #include <stdlib.h> | |
71 #include <string.h> | |
72 #include "SDL.h" | |
73 | |
74 char* | |
75 my_strdup (char *str) | |
76 { | |
77 char *new_str; | |
78 | |
79 if (str) | |
80 { | |
81 new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); | |
82 strcpy (new_str, str); | |
83 } | |
84 else | |
85 new_str = NULL; | |
86 | |
87 return new_str; | |
88 } | |
89 | |
90 int main (int argc, char *argv[]) | |
91 { | |
92 int major, minor, micro; | |
93 char *tmp_version; | |
94 | |
95 /* This hangs on some systems (?) | |
96 system ("touch conf.sdltest"); | |
97 */ | |
98 { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } | |
99 | |
100 /* HP/UX 9 (%@#!) writes to sscanf strings */ | |
101 tmp_version = my_strdup("$min_sdl_version"); | |
102 if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { | |
103 printf("%s, bad version string\n", "$min_sdl_version"); | |
104 exit(1); | |
105 } | |
106 | |
107 if (($sdl_major_version > major) || | |
108 (($sdl_major_version == major) && ($sdl_minor_version > minor)) || | |
109 (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) | |
110 { | |
111 return 0; | |
112 } | |
113 else | |
114 { | |
115 printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); | |
116 printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); | |
117 printf("*** best to upgrade to the required version.\n"); | |
118 printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); | |
119 printf("*** to point to the correct copy of sdl-config, and remove the file\n"); | |
120 printf("*** config.cache before re-running configure\n"); | |
121 return 1; | |
122 } | |
123 } | |
124 | |
125 ],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) | |
126 CFLAGS="$ac_save_CFLAGS" | |
1550 | 127 CXXFLAGS="$ac_save_CXXFLAGS" |
0 | 128 LIBS="$ac_save_LIBS" |
129 fi | |
130 fi | |
131 if test "x$no_sdl" = x ; then | |
132 AC_MSG_RESULT(yes) | |
133 ifelse([$2], , :, [$2]) | |
134 else | |
135 AC_MSG_RESULT(no) | |
136 if test "$SDL_CONFIG" = "no" ; then | |
137 echo "*** The sdl-config script installed by SDL could not be found" | |
138 echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" | |
139 echo "*** your path, or set the SDL_CONFIG environment variable to the" | |
140 echo "*** full path to sdl-config." | |
141 else | |
142 if test -f conf.sdltest ; then | |
143 : | |
144 else | |
145 echo "*** Could not run SDL test program, checking why..." | |
146 CFLAGS="$CFLAGS $SDL_CFLAGS" | |
1118
65f4b2dd46b7
Date: Wed, 17 Aug 2005 11:23:40 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
794
diff
changeset
|
147 CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" |
0 | 148 LIBS="$LIBS $SDL_LIBS" |
149 AC_TRY_LINK([ | |
150 #include <stdio.h> | |
151 #include "SDL.h" | |
1
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
152 |
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
153 int main(int argc, char *argv[]) |
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
154 { return 0; } |
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
155 #undef main |
cf2af46e9e2a
Changes since SDL 1.2.0 release
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
156 #define main K_and_R_C_main |
0 | 157 ], [ return 0; ], |
158 [ echo "*** The test program compiled, but did not run. This usually means" | |
159 echo "*** that the run-time linker is not finding SDL or finding the wrong" | |
160 echo "*** version of SDL. If it is not finding SDL, you'll need to set your" | |
161 echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" | |
162 echo "*** to the installed location Also, make sure you have run ldconfig if that" | |
163 echo "*** is required on your system" | |
164 echo "***" | |
165 echo "*** If you have an old version installed, it is best to remove it, although" | |
166 echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], | |
167 [ echo "*** The test program failed to compile or link. See the file config.log for the" | |
168 echo "*** exact error that occured. This usually means SDL was incorrectly installed" | |
169 echo "*** or that you have moved SDL since it was installed. In the latter case, you" | |
170 echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) | |
171 CFLAGS="$ac_save_CFLAGS" | |
1118
65f4b2dd46b7
Date: Wed, 17 Aug 2005 11:23:40 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
794
diff
changeset
|
172 CXXFLAGS="$ac_save_CXXFLAGS" |
0 | 173 LIBS="$ac_save_LIBS" |
174 fi | |
175 fi | |
176 SDL_CFLAGS="" | |
177 SDL_LIBS="" | |
178 ifelse([$3], , :, [$3]) | |
179 fi | |
180 AC_SUBST(SDL_CFLAGS) | |
181 AC_SUBST(SDL_LIBS) | |
182 rm -f conf.sdltest | |
183 ]) |