Fixed building with mingw32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
diff --git a/src/audio/winmm/SDL_winmm.c b/src/audio/winmm/SDL_winmm.c
index aba90fc..908c37e 100644
--- a/src/audio/winmm/SDL_winmm.c
+++ b/src/audio/winmm/SDL_winmm.c
@@ -33,6 +33,41 @@
#include "../SDL_audio_c.h"
#include "SDL_winmm.h"
+/*====== WORKAROUND for MinGW's WinAPI header where those structures are being missed ======*/
+#if defined(__MINGW32__) && !defined(__MINGW64__)
+
+typedef struct tagWAVEINCAPS2W
+{
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ WCHAR szPname[MAXPNAMELEN];
+ DWORD dwFormats;
+ WORD wChannels;
+ WORD wReserved1;
+ GUID ManufacturerGuid;
+ GUID ProductGuid;
+ GUID NameGuid;
+} WAVEINCAPS2W,*PWAVEINCAPS2W,*NPWAVEINCAPS2W,*LPWAVEINCAPS2W;
+
+typedef struct tagWAVEOUTCAPS2W
+{
+ WORD wMid;
+ WORD wPid;
+ MMVERSION vDriverVersion;
+ WCHAR szPname[MAXPNAMELEN];
+ DWORD dwFormats;
+ WORD wChannels;
+ WORD wReserved1;
+ DWORD dwSupport;
+ GUID ManufacturerGuid;
+ GUID ProductGuid;
+ GUID NameGuid;
+} WAVEOUTCAPS2W,*PWAVEOUTCAPS2W,*NPWAVEOUTCAPS2W,*LPWAVEOUTCAPS2W;
+
+#endif /* defined(__MINGW32__) && !defined(__MINGW64__) */
+/*==========================================================================================*/
+
#ifndef WAVE_FORMAT_IEEE_FLOAT
#define WAVE_FORMAT_IEEE_FLOAT 0x0003
#endif
diff --git a/src/joystick/windows/SDL_mmjoystick.c b/src/joystick/windows/SDL_mmjoystick.c
index c3148e8..847c750 100644
--- a/src/joystick/windows/SDL_mmjoystick.c
+++ b/src/joystick/windows/SDL_mmjoystick.c
@@ -85,7 +85,12 @@ GetJoystickName(int index, const char *szRegKey)
char regvalue[256];
char regname[256];
- SDL_snprintf(regkey, SDL_arraysize(regkey), "%s\\%s\\%s",
+ SDL_snprintf(regkey, SDL_arraysize(regkey),
+#ifdef UNICODE
+ "%S\\%s\\%S",
+#else
+ "%s\\%s\\%s",
+#endif
REGSTR_PATH_JOYCONFIG, szRegKey, REGSTR_KEY_JOYCURR);
hTopKey = HKEY_LOCAL_MACHINE;
regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey);
@@ -110,8 +115,13 @@ GetJoystickName(int index, const char *szRegKey)
}
/* open that registry key */
- SDL_snprintf(regkey, SDL_arraysize(regkey), "%s\\%s", REGSTR_PATH_JOYOEM,
- regname);
+ SDL_snprintf(regkey, SDL_arraysize(regkey),
+#ifdef UNICODE
+ "%S\\%s",
+#else
+ "%s\\%s",
+#endif
+ REGSTR_PATH_JOYOEM, regname);
regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey);
if (regresult != ERROR_SUCCESS) {
return NULL;
@@ -313,7 +323,7 @@ SDL_SYS_JoystickUpdate(SDL_Joystick * joystick)
};
DWORD pos[MAX_AXES];
struct _transaxis *transaxis;
- int value, change;
+ int value;
JOYINFOEX joyinfo;
joyinfo.dwSize = sizeof(joyinfo);
diff --git a/src/stdlib/SDL_string.c b/src/stdlib/SDL_string.c
index 6e90519..d4712fa 100644
--- a/src/stdlib/SDL_string.c
+++ b/src/stdlib/SDL_string.c
@@ -1628,6 +1628,16 @@ SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt,
len = SDL_PrintFloat(text, left, &info, va_arg(ap, double));
done = SDL_TRUE;
break;
+ case 'S':
+ {
+ /* In practice this is used on Windows for WCHAR strings */
+ wchar_t *wide_arg = va_arg(ap, wchar_t *);
+ char *arg = SDL_iconv_string("UTF-8", "UTF-16LE", (char *)(wide_arg), (SDL_wcslen(wide_arg)+1)*sizeof(*wide_arg));
+ len = SDL_PrintString(text, left, &info, arg);
+ SDL_free(arg);
+ done = SDL_TRUE;
+ }
+ break;
case 's':
len = SDL_PrintString(text, left, &info, va_arg(ap, char *));
done = SDL_TRUE;