Fixed bug 3609 - Windows build fails due to conflicting types for 'XINPUT_GAMEPAD_EX'

Ozkan Sezer

(In reply to Ryan C. Gordon from comment #9)
> I've put this patch in as https://hg.libsdl.org/SDL/rev/7213ae46e870 ...can
> you verify this works on the latest MinGW?
>
> Thanks,
> --ryan.


This patch is wrong: the structure in question has nothing to do with any
gcc version in use.  I suggest reverting this adding a conigury check for
it, instead.  Something like the following should do it: (configure needs
regenerating.)
This commit is contained in:
Sam Lantinga 2017-07-10 18:31:28 -07:00
parent cd79d8ccec
commit 3c09265daf
7 changed files with 81 additions and 8 deletions

View file

@ -1095,6 +1095,16 @@ elseif(WINDOWS)
#include <windows.h> #include <windows.h>
#include <xinput.h> #include <xinput.h>
int main(int argc, char **argv) { }" HAVE_XINPUT_H) int main(int argc, char **argv) { }" HAVE_XINPUT_H)
check_c_source_compiles("
#include <windows.h>
#include <xinput.h>
XINPUT_GAMEPAD_EX x1;
int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
check_c_source_compiles("
#include <windows.h>
#include <xinput.h>
XINPUT_STATE_EX s1;
int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
else() else()
check_include_file(xinput.h HAVE_XINPUT_H) check_include_file(xinput.h HAVE_XINPUT_H)
endif() endif()

48
configure vendored
View file

@ -22687,6 +22687,44 @@ if test "x$ac_cv_header_xinput_h" = xyes; then :
fi fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <windows.h>
#include <xinput.h>
XINPUT_GAMEPAD_EX x1;
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
have_xinput_gamepadex=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <windows.h>
#include <xinput.h>
XINPUT_STATE_EX s1;
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
have_xinput_stateex=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
if test x$have_ddraw = xyes; then if test x$have_ddraw = xyes; then
@ -22712,6 +22750,16 @@ $as_echo "#define HAVE_DXGI_H 1" >>confdefs.h
$as_echo "#define HAVE_XINPUT_H 1" >>confdefs.h $as_echo "#define HAVE_XINPUT_H 1" >>confdefs.h
fi
if test x$have_xinput_gamepadex = xyes; then
$as_echo "#define HAVE_XINPUT_GAMEPAD_EX 1" >>confdefs.h
fi
if test x$have_xinput_stateex = xyes; then
$as_echo "#define HAVE_XINPUT_STATE_EX 1" >>confdefs.h
fi fi
SUMMARY_video="${SUMMARY_video} directx" SUMMARY_video="${SUMMARY_video} directx"

View file

@ -2801,6 +2801,16 @@ AC_HELP_STRING([--enable-directx], [use DirectX for Windows audio/video [[defaul
AC_CHECK_HEADER(dxgi.h, have_dxgi=yes) AC_CHECK_HEADER(dxgi.h, have_dxgi=yes)
AC_CHECK_HEADER(xaudio2.h, have_xaudio2=yes) AC_CHECK_HEADER(xaudio2.h, have_xaudio2=yes)
AC_CHECK_HEADER(xinput.h, have_xinput=yes) AC_CHECK_HEADER(xinput.h, have_xinput=yes)
AC_TRY_COMPILE([
#include <windows.h>
#include <xinput.h>
XINPUT_GAMEPAD_EX x1;
],[],[have_xinput_gamepadex=yes])
AC_TRY_COMPILE([
#include <windows.h>
#include <xinput.h>
XINPUT_STATE_EX s1;
],[],[have_xinput_stateex=yes])
if test x$have_ddraw = xyes; then if test x$have_ddraw = xyes; then
AC_DEFINE(HAVE_DDRAW_H, 1, [ ]) AC_DEFINE(HAVE_DDRAW_H, 1, [ ])
@ -2817,6 +2827,12 @@ AC_HELP_STRING([--enable-directx], [use DirectX for Windows audio/video [[defaul
if test x$have_xinput = xyes; then if test x$have_xinput = xyes; then
AC_DEFINE(HAVE_XINPUT_H, 1, [ ]) AC_DEFINE(HAVE_XINPUT_H, 1, [ ])
fi fi
if test x$have_xinput_gamepadex = xyes; then
AC_DEFINE(HAVE_XINPUT_GAMEPAD_EX, 1, [ ])
fi
if test x$have_xinput_stateex = xyes; then
AC_DEFINE(HAVE_XINPUT_STATE_EX, 1, [ ])
fi
SUMMARY_video="${SUMMARY_video} directx" SUMMARY_video="${SUMMARY_video} directx"
SUMMARY_audio="${SUMMARY_audio} directx" SUMMARY_audio="${SUMMARY_audio} directx"

View file

@ -55,6 +55,8 @@
#cmakedefine HAVE_XAUDIO2_H @HAVE_XAUDIO2_H@ #cmakedefine HAVE_XAUDIO2_H @HAVE_XAUDIO2_H@
#cmakedefine HAVE_XINPUT_H @HAVE_XINPUT_H@ #cmakedefine HAVE_XINPUT_H @HAVE_XINPUT_H@
#cmakedefine HAVE_DXGI_H @HAVE_DXGI_H@ #cmakedefine HAVE_DXGI_H @HAVE_DXGI_H@
#cmakedefine HAVE_XINPUT_GAMEPAD_EX @HAVE_XINPUT_GAMEPAD_EX@
#cmakedefine HAVE_XINPUT_STATE_EX @HAVE_XINPUT_STATE_EX@
/* Comment this if you want to build without any C library requirements */ /* Comment this if you want to build without any C library requirements */
#cmakedefine HAVE_LIBC 1 #cmakedefine HAVE_LIBC 1

View file

@ -55,6 +55,8 @@
#undef HAVE_DSOUND_H #undef HAVE_DSOUND_H
#undef HAVE_DXGI_H #undef HAVE_DXGI_H
#undef HAVE_XINPUT_H #undef HAVE_XINPUT_H
#undef HAVE_XINPUT_GAMEPAD_EX
#undef HAVE_XINPUT_STATE_EX
/* Comment this if you want to build without any C library requirements */ /* Comment this if you want to build without any C library requirements */
#undef HAVE_LIBC #undef HAVE_LIBC

View file

@ -35,6 +35,7 @@
#endif #endif
#include <windows.h> #include <windows.h>
#include <basetyps.h> /* for REFIID with broken mingw.org headers */
/* Routines to convert from UTF8 to native Windows text */ /* Routines to convert from UTF8 to native Windows text */
#if UNICODE #if UNICODE

View file

@ -101,13 +101,7 @@
/* typedef's for XInput structs we use */ /* typedef's for XInput structs we use */
/* Don't redeclare these on MinGW with gcc >= 5.0.2 */ #ifndef HAVE_XINPUT_GAMEPAD_EX
#if defined(__MINGW32__) && (((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + __GNUC_PATCHLEVEL__) >= 50002)
#define HAS_XINPUT_GAMEPAD_EX
#define HAS_XINPUT_STATE_EX
#endif
#ifndef HAS_XINPUT_GAMEPAD_EX
typedef struct typedef struct
{ {
WORD wButtons; WORD wButtons;
@ -121,7 +115,7 @@ typedef struct
} XINPUT_GAMEPAD_EX; } XINPUT_GAMEPAD_EX;
#endif #endif
#ifndef HAS_XINPUT_STATE_EX #ifndef HAVE_XINPUT_STATE_EX
typedef struct typedef struct
{ {
DWORD dwPacketNumber; DWORD dwPacketNumber;