summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--groups/251.native_packages_lib.group12
-rw-r--r--groups/261.native_packages_x11.group8
-rw-r--r--patches/sdl2-2.0.8.local.patch356
-rw-r--r--patches/sdl2-2.0.8_pre.local.patch127
-rw-r--r--patches/sdl2/iconv.patch12
-rw-r--r--patches/sdl2/u16.patch123
-rw-r--r--patches/sdl2/wchar.patch102
-rw-r--r--patches/sdl2/win32.patch203
-rw-r--r--vars/sdl2.vars8
9 files changed, 887 insertions, 64 deletions
diff --git a/groups/251.native_packages_lib.group b/groups/251.native_packages_lib.group
index ed0360db..ab9dbe03 100644
--- a/groups/251.native_packages_lib.group
+++ b/groups/251.native_packages_lib.group
@@ -8,7 +8,7 @@ libevent libfastjson libfetch libffi libfirm libflac libgcrypt libgpg_error libi
libjpeg_turbo libksba libmspack libnettle libogg libpcap libpipeline libpng
libreadline libredwg libressl libsasl2 libshine libsndfile libsolv libssh libtasn1
libtelnet libtheora libtirpc libudns libunistring libuv libvorbis libxml2
-libxslt libz libzip sdl1 sdl1_net sdl1_image wolfssl")";
+libxslt libz libzip sdl1 sdl1_net sdl1_image sdl2 wolfssl")";
: ${PKG_GLIB_DEPENDS:="libffi libz pcre"};
: ${PKG_GLIB_SHA256SUM:=fe22998ff0394ec31e6e5511c379b74011bee61a4421bca7fcab223dfbe0fc6a};
: ${PKG_GLIB_VERSION:=2.54.0};
@@ -241,6 +241,16 @@ libxslt libz libzip sdl1 sdl1_net sdl1_image wolfssl")";
: ${PKG_SDL1_IMAGE_VERSION:=1.2.12};
: ${PKG_SDL1_IMAGE_URL:=https://www.libsdl.org/projects/SDL_image/release/SDL_image-${PKG_SDL1_IMAGE_VERSION}.tar.gz};
: ${PKG_SDL1_IMAGE_CONFIGURE_ARGS_EXTRA:="--enable-jpg-shared --enable-png-shared --enable-tif-shared --disable-webp --disable-webp-shared"};
+: ${PKG_SDL2_DEPENDS:="w32api w32lib"};
+: ${PKG_SDL2_VERSION:=2.0.8};
+: ${PKG_SDL2_SHA256SUM:=edc77c57308661d576e843344d8638e025a7818bff73f8fbfab09c3c5fd092ec};
+: ${PKG_SDL2_URL:=https://www.libsdl.org/release/SDL2-${PKG_SDL2_VERSION}.tar.gz};
+: ${PKG_SDL2_CONFIGURE_ARGS_EXTRA:="--disable-video-vulkan --disable-video-opengles2 --disable-alsa --disable-static --disable-power"};
+: ${PKG_SDL2_CFLAGS_CONFIGURE_EXTRA:="-DWINAPI_UTF16_DEFAULT -DUNICODE -DWINVER=0x0601 -I${PREFIX_NATIVE}/include/w32api.ports -DSDL_DISABLE_WINDOWS_IME"};
+: ${PKG_SDL2_LDFLAGS_CONFIGURE_EXTRA:="-L${PREFIX_NATIVE}/lib/w32lib -lkernel32 -luser32 -lgdi32 -limm32 -lshell32 -lu16ports"};
+: ${PKG_SDL2_MAKEFLAGS_BUILD:=-j1};
+: ${PKG_SDL2_IN_TREE:=1};
+: ${PKG_SDL2_FORCE_AUTORECONF:=1};
: ${PKG_WOLFSSL_SHA256SUM:=7de62300ce14daa0051bfefc7c4d6302f96cabc768b6ae49eda77523b118250c};
: ${PKG_WOLFSSL_VERSION:=4.5.0};
: ${PKG_WOLFSSL_URL:=https://github.com/wolfSSL/wolfssl/archive/v${PKG_WOLFSSL_VERSION}-stable.tar.gz};
diff --git a/groups/261.native_packages_x11.group b/groups/261.native_packages_x11.group
index 709ac86b..9d81686d 100644
--- a/groups/261.native_packages_x11.group
+++ b/groups/261.native_packages_x11.group
@@ -8,7 +8,7 @@ freetype_pre fribidi gdk glew gtk2 gtk3 harfbuzz imlib2 libass libcaca
libepoxy libfontenc libICE libpthread_stubs libSM libX11 libXau libXaw
libXdamage libXdmcp libXext libxfce4ui libxfce4util libXfixes libXfont2
libXft libXi libxkbfile libXmu libXpm libXt libXtst libXcursor mesa pango pixman
-rdesktop rxvt_unicode sdl2 st util_macros xcb xcb_proto xcb_util
+rdesktop rxvt_unicode st util_macros xcb xcb_proto xcb_util
xcb_util_image xcb_util_wm xcowsay xcalc xeyes xfconf xorgproto Xrender xterm
xtrans xwd xwin")";
: ${PKG_ATK_DEPENDS:="glib"};
@@ -224,12 +224,6 @@ xtrans xwd xwin")";
: ${PKG_RXVT_UNICODE_VERSION:=9.22};
: ${PKG_RXVT_UNICODE_URL:=http://dist.schmorp.de/rxvt-unicode/rxvt-unicode-${PKG_RXVT_UNICODE_VERSION}.tar.bz2};
: ${PKG_RXVT_UNICODE_CONFIGURE_ARGS_EXTRA:=--disable-perl --disable-lastlog --disable-utmp --disable-wtmp};
-: ${PKG_SDL2_DEPENDS:="libICE libXext"};
-: ${PKG_SDL2_VERSION:=2.0.8};
-: ${PKG_SDL2_SHA256SUM:=edc77c57308661d576e843344d8638e025a7818bff73f8fbfab09c3c5fd092ec};
-: ${PKG_SDL2_URL:=https://www.libsdl.org/release/SDL2-${PKG_SDL2_VERSION}.tar.gz};
-: ${PKG_SDL2_CONFIGURE_ARGS_EXTRA:="--disable-video-vulkan --disable-video-opengles2 --disable-alsa --disable-static"};
-: ${PKG_SDL2_MAKEFLAGS_BUILD:=-j1};
: ${PKG_ST_DEPENDS:="freetype fontconfig libX11 libXft"};
: ${PKG_ST_SHA256SUM:=f7870d906ccc988926eef2cc98950a99cc78725b685e934c422c03c1234e6000};
: ${PKG_ST_VERSION:=0.7};
diff --git a/patches/sdl2-2.0.8.local.patch b/patches/sdl2-2.0.8.local.patch
index cd91a960..dc030117 100644
--- a/patches/sdl2-2.0.8.local.patch
+++ b/patches/sdl2-2.0.8.local.patch
@@ -1,57 +1,301 @@
-diff -ru SDL2-2.0.8.orig/configure SDL2-2.0.8/configure
---- SDL2-2.0.8.orig/configure 2018-03-01 17:34:41.000000000 +0100
-+++ SDL2-2.0.8/configure 2018-03-26 21:34:16.065368148 +0200
-@@ -23829,7 +23829,7 @@
- CheckWarnAll
-
- case "$host" in
-- *-*-linux*|*-*-uclinux*|*-*-gnu*|*-*-k*bsd*-gnu|*-*-bsdi*|*-*-freebsd*|*-*-dragonfly*|*-*-netbsd*|*-*-openbsd*|*-*-sysv5*|*-*-solaris*|*-*-hpux*|*-*-aix*|*-*-minix*|*-*-nto*)
-+ *-*-linux*|*-*-uclinux*|*-*-gnu*|*-*-k*bsd*-gnu|*-*-bsdi*|*-*-freebsd*|*-*-dragonfly*|*-*-netbsd*|*-*-openbsd*|*-*-sysv5*|*-*-solaris*|*-*-hpux*|*-*-aix*|*-*-minix*|*-*-nto*|*-*-midipix*)
- case "$host" in
- *-*-android*)
- # Android
-@@ -23854,6 +23854,7 @@
- *-*-knetbsd*-gnu) ARCH=knetbsd-gnu ;;
- *-*-kopenbsd*-gnu) ARCH=kopenbsd-gnu ;;
- *-*-gnu*) ARCH=gnu ;; # must be last of the gnu variants
-+ *-*-midipix*) ARCH=gnu ;;
- *-*-bsdi*) ARCH=bsdi ;;
- *-*-freebsd*) ARCH=freebsd ;;
- *-*-dragonfly*) ARCH=freebsd ;;
-diff -ru SDL2-2.0.8.orig/Makefile.in SDL2-2.0.8/Makefile.in
---- SDL2-2.0.8.orig/Makefile.in 2018-03-01 17:34:41.000000000 +0100
-+++ SDL2-2.0.8/Makefile.in 2018-03-26 22:59:44.238745288 +0200
-@@ -124,7 +124,7 @@
- LT_REVISION = @LT_REVISION@
- LT_LDFLAGS = -no-undefined -rpath $(libdir) -release $(LT_RELEASE) -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
-
--all: $(srcdir)/configure Makefile $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET) $(objects)/$(SDLTEST_TARGET)
-+all: $(srcdir)/configure Makefile $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET)
-
- $(srcdir)/configure: $(srcdir)/configure.in
- @echo "Warning, configure is out of date, please re-run autogen.sh"
-@@ -167,11 +167,10 @@
- $(INSTALL) -m 644 $(srcdir)/include/SDL_revision.h $(DESTDIR)$(includedir)/SDL2/SDL_revision.h; \
- fi
-
--install-lib: $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET) $(objects)/$(SDLTEST_TARGET)
-+install-lib: $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET)
- $(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(libdir)
- $(LIBTOOL) --mode=install $(INSTALL) $(objects)/$(TARGET) $(DESTDIR)$(libdir)/$(TARGET)
- $(LIBTOOL) --mode=install $(INSTALL) $(objects)/$(SDLMAIN_TARGET) $(DESTDIR)$(libdir)/$(SDLMAIN_TARGET)
-- $(LIBTOOL) --mode=install $(INSTALL) $(objects)/$(SDLTEST_TARGET) $(DESTDIR)$(libdir)/$(SDLTEST_TARGET)
- install-data:
- $(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(datadir)/aclocal
- $(INSTALL) -m 644 $(srcdir)/sdl2.m4 $(DESTDIR)$(datadir)/aclocal/sdl2.m4
-diff -ru SDL2-2.0.8.orig/src/dynapi/SDL_dynapi.c SDL2-2.0.8/src/dynapi/SDL_dynapi.c
---- SDL2-2.0.8.orig/src/dynapi/SDL_dynapi.c 2018-03-01 17:34:42.000000000 +0100
-+++ SDL2-2.0.8/src/dynapi/SDL_dynapi.c 2018-03-26 22:05:52.162381490 +0200
-@@ -222,7 +222,7 @@
- return retval;
- }
-
--#elif defined(unix) || defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) || defined(__QNX__)
-+#elif defined(unix) || defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) || defined(__QNX__) || defined(__midipix__)
- #include <dlfcn.h>
- static SDL_INLINE void *get_sdlapi_entry(const char *fname, const char *sym)
+diff -ru SDL2-2.0.8.orig/src/video/windows/SDL_windowskeyboard.c SDL2-2.0.8/src/video/windows/SDL_windowskeyboard.c
+--- SDL2-2.0.8.orig/src/video/windows/SDL_windowskeyboard.c 2018-03-01 17:34:43.000000000 +0100
++++ SDL2-2.0.8/src/video/windows/SDL_windowskeyboard.c 2020-10-05 00:37:25.684238476 +0200
+@@ -30,6 +30,10 @@
+ #include <imm.h>
+ #include <oleauto.h>
+
++#ifndef CFS_FORCE_POSITION
++#define CFS_FORCE_POSITION 0x0020
++#endif
++
+ #ifndef SDL_DISABLE_WINDOWS_IME
+ static void IME_Init(SDL_VideoData *videodata, HWND hwnd);
+ static void IME_Enable(SDL_VideoData *videodata, HWND hwnd);
+diff -ru SDL2-2.0.8.orig/src/video/windows/SDL_msctf.h SDL2-2.0.8/src/video/windows/SDL_msctf.h
+--- SDL2-2.0.8.orig/src/video/windows/SDL_msctf.h 2018-03-01 17:34:43.000000000 +0100
++++ SDL2-2.0.8/src/video/windows/SDL_msctf.h 2020-10-04 12:38:34.746446128 +0200
+@@ -22,7 +22,18 @@
+ #ifndef SDL_msctf_h_
+ #define SDL_msctf_h_
+
+-#include <unknwn.h>
++#include <windows.h>
++#include <stdint.h>
++typedef uint16_t* BSTR;
++typedef DWORD HIMCC;
++#define NEAR
++#define FAR
++typedef struct tagCANDIDATEFORM {
++ DWORD dwIndex;
++ DWORD dwStyle;
++ POINT ptCurrentPos;
++ RECT rcArea;
++} CANDIDATEFORM,*PCANDIDATEFORM,*NPCANDIDATEFORM,*LPCANDIDATEFORM;
+
+ #define TF_INVALID_COOKIE (0xffffffff)
+ #define TF_IPSINK_FLAG_ACTIVE 0x0001
+@@ -53,20 +53,20 @@
+
+ typedef struct ITfThreadMgrVtbl
{
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfThreadMgr *, REFIID, void **);
+- ULONG (STDMETHODCALLTYPE *AddRef)(ITfThreadMgr *);
+- ULONG (STDMETHODCALLTYPE *Release)(ITfThreadMgr *);
+- HRESULT (STDMETHODCALLTYPE *Activate)(ITfThreadMgr *, TfClientId *);
+- HRESULT (STDMETHODCALLTYPE *Deactivate)(ITfThreadMgr *);
+- HRESULT (STDMETHODCALLTYPE *CreateDocumentMgr)(ITfThreadMgr *);
+- HRESULT (STDMETHODCALLTYPE *EnumDocumentMgrs)(ITfThreadMgr *, IEnumTfDocumentMgrs **);
+- HRESULT (STDMETHODCALLTYPE *GetFocus)(ITfThreadMgr *, ITfDocumentMgr **);
+- HRESULT (STDMETHODCALLTYPE *SetFocus)(ITfThreadMgr *, ITfDocumentMgr *);
+- HRESULT (STDMETHODCALLTYPE *AssociateFocus)(ITfThreadMgr *, HWND, ITfDocumentMgr *, ITfDocumentMgr **);
+- HRESULT (STDMETHODCALLTYPE *IsThreadFocus)(ITfThreadMgr *, BOOL *);
+- HRESULT (STDMETHODCALLTYPE *GetFunctionProvider)(ITfThreadMgr *, REFCLSID, ITfFunctionProvider **);
+- HRESULT (STDMETHODCALLTYPE *EnumFunctionProviders)(ITfThreadMgr *, IEnumTfFunctionProviders **);
+- HRESULT (STDMETHODCALLTYPE *GetGlobalCompartment)(ITfThreadMgr *, ITfCompartmentMgr **);
++ HRESULT (__stdcall *QueryInterface)(ITfThreadMgr *, REFIID, void **);
++ ULONG (__stdcall *AddRef)(ITfThreadMgr *);
++ ULONG (__stdcall *Release)(ITfThreadMgr *);
++ HRESULT (__stdcall *Activate)(ITfThreadMgr *, TfClientId *);
++ HRESULT (__stdcall *Deactivate)(ITfThreadMgr *);
++ HRESULT (__stdcall *CreateDocumentMgr)(ITfThreadMgr *);
++ HRESULT (__stdcall *EnumDocumentMgrs)(ITfThreadMgr *, IEnumTfDocumentMgrs **);
++ HRESULT (__stdcall *GetFocus)(ITfThreadMgr *, ITfDocumentMgr **);
++ HRESULT (__stdcall *SetFocus)(ITfThreadMgr *, ITfDocumentMgr *);
++ HRESULT (__stdcall *AssociateFocus)(ITfThreadMgr *, HWND, ITfDocumentMgr *, ITfDocumentMgr **);
++ HRESULT (__stdcall *IsThreadFocus)(ITfThreadMgr *, BOOL *);
++ HRESULT (__stdcall *GetFunctionProvider)(ITfThreadMgr *, REFCLSID, ITfFunctionProvider **);
++ HRESULT (__stdcall *EnumFunctionProviders)(ITfThreadMgr *, IEnumTfFunctionProviders **);
++ HRESULT (__stdcall *GetGlobalCompartment)(ITfThreadMgr *, ITfCompartmentMgr **);
+ } ITfThreadMgrVtbl;
+
+ struct ITfThreadMgr
+@@ -76,22 +76,22 @@
+
+ typedef struct ITfThreadMgrExVtbl
+ {
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfThreadMgrEx *, REFIID, void **);
+- ULONG (STDMETHODCALLTYPE *AddRef)(ITfThreadMgrEx *);
+- ULONG (STDMETHODCALLTYPE *Release)(ITfThreadMgrEx *);
+- HRESULT (STDMETHODCALLTYPE *Activate)(ITfThreadMgrEx *, TfClientId *);
+- HRESULT (STDMETHODCALLTYPE *Deactivate)(ITfThreadMgrEx *);
+- HRESULT (STDMETHODCALLTYPE *CreateDocumentMgr)(ITfThreadMgrEx *, ITfDocumentMgr **);
+- HRESULT (STDMETHODCALLTYPE *EnumDocumentMgrs)(ITfThreadMgrEx *, IEnumTfDocumentMgrs **);
+- HRESULT (STDMETHODCALLTYPE *GetFocus)(ITfThreadMgrEx *, ITfDocumentMgr **);
+- HRESULT (STDMETHODCALLTYPE *SetFocus)(ITfThreadMgrEx *, ITfDocumentMgr *);
+- HRESULT (STDMETHODCALLTYPE *AssociateFocus)(ITfThreadMgrEx *, ITfDocumentMgr *, ITfDocumentMgr **);
+- HRESULT (STDMETHODCALLTYPE *IsThreadFocus)(ITfThreadMgrEx *, BOOL *);
+- HRESULT (STDMETHODCALLTYPE *GetFunctionProvider)(ITfThreadMgrEx *, REFCLSID, ITfFunctionProvider **);
+- HRESULT (STDMETHODCALLTYPE *EnumFunctionProviders)(ITfThreadMgrEx *, IEnumTfFunctionProviders **);
+- HRESULT (STDMETHODCALLTYPE *GetGlobalCompartment)(ITfThreadMgrEx *, ITfCompartmentMgr **);
+- HRESULT (STDMETHODCALLTYPE *ActivateEx)(ITfThreadMgrEx *, TfClientId *, DWORD);
+- HRESULT (STDMETHODCALLTYPE *GetActiveFlags)(ITfThreadMgrEx *, DWORD *);
++ HRESULT (__stdcall *QueryInterface)(ITfThreadMgrEx *, REFIID, void **);
++ ULONG (__stdcall *AddRef)(ITfThreadMgrEx *);
++ ULONG (__stdcall *Release)(ITfThreadMgrEx *);
++ HRESULT (__stdcall *Activate)(ITfThreadMgrEx *, TfClientId *);
++ HRESULT (__stdcall *Deactivate)(ITfThreadMgrEx *);
++ HRESULT (__stdcall *CreateDocumentMgr)(ITfThreadMgrEx *, ITfDocumentMgr **);
++ HRESULT (__stdcall *EnumDocumentMgrs)(ITfThreadMgrEx *, IEnumTfDocumentMgrs **);
++ HRESULT (__stdcall *GetFocus)(ITfThreadMgrEx *, ITfDocumentMgr **);
++ HRESULT (__stdcall *SetFocus)(ITfThreadMgrEx *, ITfDocumentMgr *);
++ HRESULT (__stdcall *AssociateFocus)(ITfThreadMgrEx *, ITfDocumentMgr *, ITfDocumentMgr **);
++ HRESULT (__stdcall *IsThreadFocus)(ITfThreadMgrEx *, BOOL *);
++ HRESULT (__stdcall *GetFunctionProvider)(ITfThreadMgrEx *, REFCLSID, ITfFunctionProvider **);
++ HRESULT (__stdcall *EnumFunctionProviders)(ITfThreadMgrEx *, IEnumTfFunctionProviders **);
++ HRESULT (__stdcall *GetGlobalCompartment)(ITfThreadMgrEx *, ITfCompartmentMgr **);
++ HRESULT (__stdcall *ActivateEx)(ITfThreadMgrEx *, TfClientId *, DWORD);
++ HRESULT (__stdcall *GetActiveFlags)(ITfThreadMgrEx *, DWORD *);
+ } ITfThreadMgrExVtbl;
+
+ struct ITfThreadMgrEx
+@@ -101,15 +101,15 @@
+
+ typedef struct ITfDocumentMgrVtbl
+ {
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfDocumentMgr *, REFIID, void **);
+- ULONG (STDMETHODCALLTYPE *AddRef)(ITfDocumentMgr *);
+- ULONG (STDMETHODCALLTYPE *Release)(ITfDocumentMgr *);
+- HRESULT (STDMETHODCALLTYPE *CreateContext)(ITfDocumentMgr *, TfClientId, DWORD, IUnknown *, ITfContext **, TfEditCookie *);
+- HRESULT (STDMETHODCALLTYPE *Push)(ITfDocumentMgr *, ITfContext *);
+- HRESULT (STDMETHODCALLTYPE *Pop)(ITfDocumentMgr *);
+- HRESULT (STDMETHODCALLTYPE *GetTop)(ITfDocumentMgr *, ITfContext **);
+- HRESULT (STDMETHODCALLTYPE *GetBase)(ITfDocumentMgr *, ITfContext **);
+- HRESULT (STDMETHODCALLTYPE *EnumContexts)(ITfDocumentMgr *, IEnumTfContexts **);
++ HRESULT (__stdcall *QueryInterface)(ITfDocumentMgr *, REFIID, void **);
++ ULONG (__stdcall *AddRef)(ITfDocumentMgr *);
++ ULONG (__stdcall *Release)(ITfDocumentMgr *);
++ HRESULT (__stdcall *CreateContext)(ITfDocumentMgr *, TfClientId, DWORD, IUnknown *, ITfContext **, TfEditCookie *);
++ HRESULT (__stdcall *Push)(ITfDocumentMgr *, ITfContext *);
++ HRESULT (__stdcall *Pop)(ITfDocumentMgr *);
++ HRESULT (__stdcall *GetTop)(ITfDocumentMgr *, ITfContext **);
++ HRESULT (__stdcall *GetBase)(ITfDocumentMgr *, ITfContext **);
++ HRESULT (__stdcall *EnumContexts)(ITfDocumentMgr *, IEnumTfContexts **);
+ } ITfDocumentMgrVtbl;
+
+ struct ITfDocumentMgr
+@@ -119,12 +119,12 @@
+
+ typedef struct ITfUIElementSinkVtbl
+ {
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfUIElementSink *, REFIID, void **);
+- ULONG (STDMETHODCALLTYPE *AddRef)(ITfUIElementSink *);
+- ULONG (STDMETHODCALLTYPE *Release)(ITfUIElementSink *);
+- HRESULT (STDMETHODCALLTYPE *BeginUIElement)(ITfUIElementSink *, DWORD, BOOL *);
+- HRESULT (STDMETHODCALLTYPE *UpdateUIElement)(ITfUIElementSink *, DWORD);
+- HRESULT (STDMETHODCALLTYPE *EndUIElement)(ITfUIElementSink *, DWORD);
++ HRESULT (__stdcall *QueryInterface)(ITfUIElementSink *, REFIID, void **);
++ ULONG (__stdcall *AddRef)(ITfUIElementSink *);
++ ULONG (__stdcall *Release)(ITfUIElementSink *);
++ HRESULT (__stdcall *BeginUIElement)(ITfUIElementSink *, DWORD, BOOL *);
++ HRESULT (__stdcall *UpdateUIElement)(ITfUIElementSink *, DWORD);
++ HRESULT (__stdcall *EndUIElement)(ITfUIElementSink *, DWORD);
+ } ITfUIElementSinkVtbl;
+
+ struct ITfUIElementSink
+@@ -134,14 +134,14 @@
+
+ typedef struct ITfUIElementMgrVtbl
+ {
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfUIElementMgr *, REFIID, void **);
+- ULONG (STDMETHODCALLTYPE *AddRef)(ITfUIElementMgr *);
+- ULONG (STDMETHODCALLTYPE *Release)(ITfUIElementMgr *);
+- HRESULT (STDMETHODCALLTYPE *BeginUIElement)(ITfUIElementMgr *, ITfUIElement *, BOOL *, DWORD *);
+- HRESULT (STDMETHODCALLTYPE *UpdateUIElement)(ITfUIElementMgr *, DWORD);
+- HRESULT (STDMETHODCALLTYPE *EndUIElement)(ITfUIElementMgr *, DWORD);
+- HRESULT (STDMETHODCALLTYPE *GetUIElement)(ITfUIElementMgr *, DWORD, ITfUIElement **);
+- HRESULT (STDMETHODCALLTYPE *EnumUIElements)(ITfUIElementMgr *, IEnumTfUIElements **);
++ HRESULT (__stdcall *QueryInterface)(ITfUIElementMgr *, REFIID, void **);
++ ULONG (__stdcall *AddRef)(ITfUIElementMgr *);
++ ULONG (__stdcall *Release)(ITfUIElementMgr *);
++ HRESULT (__stdcall *BeginUIElement)(ITfUIElementMgr *, ITfUIElement *, BOOL *, DWORD *);
++ HRESULT (__stdcall *UpdateUIElement)(ITfUIElementMgr *, DWORD);
++ HRESULT (__stdcall *EndUIElement)(ITfUIElementMgr *, DWORD);
++ HRESULT (__stdcall *GetUIElement)(ITfUIElementMgr *, DWORD, ITfUIElement **);
++ HRESULT (__stdcall *EnumUIElements)(ITfUIElementMgr *, IEnumTfUIElements **);
+ } ITfUIElementMgrVtbl;
+
+ struct ITfUIElementMgr
+@@ -151,21 +151,21 @@
+
+ typedef struct ITfCandidateListUIElementVtbl
+ {
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfCandidateListUIElement *, REFIID, void **);
+- ULONG (STDMETHODCALLTYPE *AddRef)(ITfCandidateListUIElement *);
+- ULONG (STDMETHODCALLTYPE *Release)(ITfCandidateListUIElement *);
+- HRESULT (STDMETHODCALLTYPE *GetDescription)(ITfCandidateListUIElement *, BSTR *);
+- HRESULT (STDMETHODCALLTYPE *GetGUID)(ITfCandidateListUIElement *, GUID *);
+- HRESULT (STDMETHODCALLTYPE *Show)(ITfCandidateListUIElement *, BOOL);
+- HRESULT (STDMETHODCALLTYPE *IsShown)(ITfCandidateListUIElement *, BOOL *);
+- HRESULT (STDMETHODCALLTYPE *GetUpdatedFlags)(ITfCandidateListUIElement *, DWORD *);
+- HRESULT (STDMETHODCALLTYPE *GetDocumentMgr)(ITfCandidateListUIElement *, ITfDocumentMgr **);
+- HRESULT (STDMETHODCALLTYPE *GetCount)(ITfCandidateListUIElement *, UINT *);
+- HRESULT (STDMETHODCALLTYPE *GetSelection)(ITfCandidateListUIElement *, UINT *);
+- HRESULT (STDMETHODCALLTYPE *GetString)(ITfCandidateListUIElement *, UINT, BSTR *);
+- HRESULT (STDMETHODCALLTYPE *GetPageIndex)(ITfCandidateListUIElement *, UINT *, UINT, UINT *);
+- HRESULT (STDMETHODCALLTYPE *SetPageIndex)(ITfCandidateListUIElement *, UINT *, UINT);
+- HRESULT (STDMETHODCALLTYPE *GetCurrentPage)(ITfCandidateListUIElement *, UINT *);
++ HRESULT (__stdcall *QueryInterface)(ITfCandidateListUIElement *, REFIID, void **);
++ ULONG (__stdcall *AddRef)(ITfCandidateListUIElement *);
++ ULONG (__stdcall *Release)(ITfCandidateListUIElement *);
++ HRESULT (__stdcall *GetDescription)(ITfCandidateListUIElement *, BSTR *);
++ HRESULT (__stdcall *GetGUID)(ITfCandidateListUIElement *, GUID *);
++ HRESULT (__stdcall *Show)(ITfCandidateListUIElement *, BOOL);
++ HRESULT (__stdcall *IsShown)(ITfCandidateListUIElement *, BOOL *);
++ HRESULT (__stdcall *GetUpdatedFlags)(ITfCandidateListUIElement *, DWORD *);
++ HRESULT (__stdcall *GetDocumentMgr)(ITfCandidateListUIElement *, ITfDocumentMgr **);
++ HRESULT (__stdcall *GetCount)(ITfCandidateListUIElement *, UINT *);
++ HRESULT (__stdcall *GetSelection)(ITfCandidateListUIElement *, UINT *);
++ HRESULT (__stdcall *GetString)(ITfCandidateListUIElement *, UINT, BSTR *);
++ HRESULT (__stdcall *GetPageIndex)(ITfCandidateListUIElement *, UINT *, UINT, UINT *);
++ HRESULT (__stdcall *SetPageIndex)(ITfCandidateListUIElement *, UINT *, UINT);
++ HRESULT (__stdcall *GetCurrentPage)(ITfCandidateListUIElement *, UINT *);
+ } ITfCandidateListUIElementVtbl;
+
+ struct ITfCandidateListUIElement
+@@ -175,19 +175,19 @@
+
+ typedef struct ITfReadingInformationUIElementVtbl
+ {
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfReadingInformationUIElement *, REFIID, void **);
+- ULONG (STDMETHODCALLTYPE *AddRef)(ITfReadingInformationUIElement *);
+- ULONG (STDMETHODCALLTYPE *Release)(ITfReadingInformationUIElement *);
+- HRESULT (STDMETHODCALLTYPE *GetDescription)(ITfReadingInformationUIElement *, BSTR *);
+- HRESULT (STDMETHODCALLTYPE *GetGUID)(ITfReadingInformationUIElement *, GUID *);
+- HRESULT (STDMETHODCALLTYPE *Show)(ITfReadingInformationUIElement *, BOOL);
+- HRESULT (STDMETHODCALLTYPE *IsShown)(ITfReadingInformationUIElement *, BOOL *);
+- HRESULT (STDMETHODCALLTYPE *GetUpdatedFlags)(ITfReadingInformationUIElement *, DWORD *);
+- HRESULT (STDMETHODCALLTYPE *GetContext)(ITfReadingInformationUIElement *, ITfContext **);
+- HRESULT (STDMETHODCALLTYPE *GetString)(ITfReadingInformationUIElement *, BSTR *);
+- HRESULT (STDMETHODCALLTYPE *GetMaxReadingStringLength)(ITfReadingInformationUIElement *, UINT *);
+- HRESULT (STDMETHODCALLTYPE *GetErrorIndex)(ITfReadingInformationUIElement *, UINT *);
+- HRESULT (STDMETHODCALLTYPE *IsVerticalOrderPreferred)(ITfReadingInformationUIElement *, BOOL *);
++ HRESULT (__stdcall *QueryInterface)(ITfReadingInformationUIElement *, REFIID, void **);
++ ULONG (__stdcall *AddRef)(ITfReadingInformationUIElement *);
++ ULONG (__stdcall *Release)(ITfReadingInformationUIElement *);
++ HRESULT (__stdcall *GetDescription)(ITfReadingInformationUIElement *, BSTR *);
++ HRESULT (__stdcall *GetGUID)(ITfReadingInformationUIElement *, GUID *);
++ HRESULT (__stdcall *Show)(ITfReadingInformationUIElement *, BOOL);
++ HRESULT (__stdcall *IsShown)(ITfReadingInformationUIElement *, BOOL *);
++ HRESULT (__stdcall *GetUpdatedFlags)(ITfReadingInformationUIElement *, DWORD *);
++ HRESULT (__stdcall *GetContext)(ITfReadingInformationUIElement *, ITfContext **);
++ HRESULT (__stdcall *GetString)(ITfReadingInformationUIElement *, BSTR *);
++ HRESULT (__stdcall *GetMaxReadingStringLength)(ITfReadingInformationUIElement *, UINT *);
++ HRESULT (__stdcall *GetErrorIndex)(ITfReadingInformationUIElement *, UINT *);
++ HRESULT (__stdcall *IsVerticalOrderPreferred)(ITfReadingInformationUIElement *, BOOL *);
+ } ITfReadingInformationUIElementVtbl;
+
+ struct ITfReadingInformationUIElement
+@@ -197,13 +197,13 @@
+
+ typedef struct ITfUIElementVtbl
+ {
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfUIElement *, REFIID, void **);
+- ULONG (STDMETHODCALLTYPE *AddRef)(ITfUIElement *);
+- ULONG (STDMETHODCALLTYPE *Release)(ITfUIElement *);
+- HRESULT (STDMETHODCALLTYPE *GetDescription)(ITfUIElement *, BSTR *);
+- HRESULT (STDMETHODCALLTYPE *GetGUID)(ITfUIElement *, GUID *);
+- HRESULT (STDMETHODCALLTYPE *Show)(ITfUIElement *, BOOL);
+- HRESULT (STDMETHODCALLTYPE *IsShown)(ITfUIElement *, BOOL *);
++ HRESULT (__stdcall *QueryInterface)(ITfUIElement *, REFIID, void **);
++ ULONG (__stdcall *AddRef)(ITfUIElement *);
++ ULONG (__stdcall *Release)(ITfUIElement *);
++ HRESULT (__stdcall *GetDescription)(ITfUIElement *, BSTR *);
++ HRESULT (__stdcall *GetGUID)(ITfUIElement *, GUID *);
++ HRESULT (__stdcall *Show)(ITfUIElement *, BOOL);
++ HRESULT (__stdcall *IsShown)(ITfUIElement *, BOOL *);
+ } ITfUIElementVtbl;
+
+ struct ITfUIElement
+@@ -213,10 +213,10 @@
+
+ typedef struct ITfInputProcessorProfileActivationSinkVtbl
+ {
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfInputProcessorProfileActivationSink *, REFIID, void **);
+- ULONG (STDMETHODCALLTYPE *AddRef)(ITfInputProcessorProfileActivationSink *);
+- ULONG (STDMETHODCALLTYPE *Release)(ITfInputProcessorProfileActivationSink *);
+- HRESULT (STDMETHODCALLTYPE *OnActivated)(ITfInputProcessorProfileActivationSink *, DWORD, LANGID, REFCLSID, REFGUID, REFGUID, HKL, DWORD);
++ HRESULT (__stdcall *QueryInterface)(ITfInputProcessorProfileActivationSink *, REFIID, void **);
++ ULONG (__stdcall *AddRef)(ITfInputProcessorProfileActivationSink *);
++ ULONG (__stdcall *Release)(ITfInputProcessorProfileActivationSink *);
++ HRESULT (__stdcall *OnActivated)(ITfInputProcessorProfileActivationSink *, DWORD, LANGID, REFCLSID, REFGUID, REFGUID, HKL, DWORD);
+
+ } ITfInputProcessorProfileActivationSinkVtbl;
+
+@@ -227,11 +227,11 @@
+
+ typedef struct ITfSourceVtbl
+ {
+- HRESULT (STDMETHODCALLTYPE *QueryInterface)(ITfSource *, REFIID, void **);
+- ULONG (STDMETHODCALLTYPE *AddRef)(ITfSource *);
+- ULONG (STDMETHODCALLTYPE *Release)(ITfSource *);
+- HRESULT (STDMETHODCALLTYPE *AdviseSink)(ITfSource *, REFIID, IUnknown *, DWORD *);
+- HRESULT (STDMETHODCALLTYPE *UnadviseSink)(ITfSource *, DWORD);
++ HRESULT (__stdcall *QueryInterface)(ITfSource *, REFIID, void **);
++ ULONG (__stdcall *AddRef)(ITfSource *);
++ ULONG (__stdcall *Release)(ITfSource *);
++ HRESULT (__stdcall *AdviseSink)(ITfSource *, REFIID, IUnknown *, DWORD *);
++ HRESULT (__stdcall *UnadviseSink)(ITfSource *, DWORD);
+ } ITfSourceVtbl;
+
+ struct ITfSource
diff --git a/patches/sdl2-2.0.8_pre.local.patch b/patches/sdl2-2.0.8_pre.local.patch
new file mode 100644
index 00000000..5e870924
--- /dev/null
+++ b/patches/sdl2-2.0.8_pre.local.patch
@@ -0,0 +1,127 @@
+diff -ru SDL2-2.0.8.orig/configure.in SDL2-2.0.8/configure.in
+--- SDL2-2.0.8.orig/configure.in 2018-03-01 17:34:41.000000000 +0100
++++ SDL2-2.0.8/configure.in 2020-09-27 15:02:24.837099348 +0200
+@@ -1868,7 +1868,6 @@
+ XITouchClassInfo *t;
+ ],[
+ have_xinput2_multitouch=yes
+- AC_DEFINE([SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH], 1, [])
+ SUMMARY_video_x11="${SUMMARY_video_x11} xinput2_multitouch"
+ ])
+ AC_MSG_RESULT($have_xinput2_multitouch)
+@@ -2770,6 +2769,10 @@
+ pthread_cflags="-D_REENTRANT"
+ pthread_lib="-lpthread"
+ ;;
++ *-*-midipix*)
++ pthread_cflags="-D_REENTRANT"
++ pthread_lib=""
++ ;;
+ *-*-bsdi*)
+ pthread_cflags="-D_REENTRANT -D_THREAD_SAFE"
+ pthread_lib=""
+@@ -3484,6 +3487,67 @@
+ # Set up other core UNIX files
+ SOURCES="$SOURCES $srcdir/src/core/unix/*.c"
+ ;;
++ *-*-midipix*)
++ ARCH=midipix
++
++ CheckWINDOWS
++ # TODO: oh dear.
++ #CheckWINDOWSGL
++ #CheckWINDOWSGLES
++ #CheckVulkan
++ CheckDIRECTX
++ CheckVisibilityHidden
++ CheckDeclarationAfterStatement
++ CheckDummyVideo
++ CheckDiskAudio
++ CheckDummyAudio
++ CheckDLOPEN
++ CheckPTHREAD
++ CheckClockGettime
++
++ # Set up files for the video library
++ if test x$enable_video = xyes; then
++ AC_DEFINE(SDL_VIDEO_DRIVER_WINDOWS, 1, [ ])
++ SOURCES="$SOURCES $srcdir/src/video/windows/*.c"
++ have_video=yes
++ AC_ARG_ENABLE(render-d3d,
++AC_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[default=yes]]]),
++ , enable_render_d3d=yes)
++ if test x$enable_render_d3d = xyes -a x$have_d3d = xyes; then
++ AC_DEFINE(SDL_VIDEO_RENDER_D3D, 1, [ ])
++ fi
++ if test x$enable_render_d3d = xyes -a x$have_d3d11 = xyes; then
++ AC_DEFINE(SDL_VIDEO_RENDER_D3D11, 1, [ ])
++ fi
++ fi
++
++ # Set up files for the audio library
++ # TODO: wasapi is missing entirely still
++
++ # Set up files for the haptic library
++ # TODO: not sure.
++
++ # Set up files for the power library
++ if test x$enable_power = xyes; then
++ AC_DEFINE(SDL_POWER_WINDOWS, 1, [ ])
++ SOURCES="$SOURCES $srcdir/src/power/windows/*.c"
++ have_power=yes
++ fi
++ # Set up files for the filesystem library
++ if test x$enable_filesystem = xyes; then
++ AC_DEFINE(SDL_FILESYSTEM_UNIX, 1, [ ])
++ SOURCES="$SOURCES $srcdir/src/filesystem/unix/*.c"
++ have_filesystem=yes
++ fi
++ # Set up files for the timer library
++ if test x$enable_timers = xyes; then
++ AC_DEFINE(SDL_TIMER_UNIX, 1, [ ])
++ SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
++ have_timers=yes
++ fi
++
++ SOURCES="$SOURCES $srcdir/src/core/unix/*.c"
++ ;;
+ *-*-cygwin* | *-*-mingw32*)
+ ARCH=win32
+ if test "$build" != "$host"; then # cross-compiling
+diff -ru SDL2-2.0.8.orig/Makefile.in SDL2-2.0.8/Makefile.in
+--- SDL2-2.0.8.orig/Makefile.in 2018-03-01 17:34:41.000000000 +0100
++++ SDL2-2.0.8/Makefile.in 2020-09-27 14:14:34.616542401 +0200
+@@ -124,7 +124,7 @@
+ LT_REVISION = @LT_REVISION@
+ LT_LDFLAGS = -no-undefined -rpath $(libdir) -release $(LT_RELEASE) -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
+
+-all: $(srcdir)/configure Makefile $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET) $(objects)/$(SDLTEST_TARGET)
++all: $(srcdir)/configure Makefile $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET)
+
+ $(srcdir)/configure: $(srcdir)/configure.in
+ @echo "Warning, configure is out of date, please re-run autogen.sh"
+@@ -167,11 +167,10 @@
+ $(INSTALL) -m 644 $(srcdir)/include/SDL_revision.h $(DESTDIR)$(includedir)/SDL2/SDL_revision.h; \
+ fi
+
+-install-lib: $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET) $(objects)/$(SDLTEST_TARGET)
++install-lib: $(objects) $(objects)/$(TARGET) $(objects)/$(SDLMAIN_TARGET)
+ $(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(libdir)
+ $(LIBTOOL) --mode=install $(INSTALL) $(objects)/$(TARGET) $(DESTDIR)$(libdir)/$(TARGET)
+ $(LIBTOOL) --mode=install $(INSTALL) $(objects)/$(SDLMAIN_TARGET) $(DESTDIR)$(libdir)/$(SDLMAIN_TARGET)
+- $(LIBTOOL) --mode=install $(INSTALL) $(objects)/$(SDLTEST_TARGET) $(DESTDIR)$(libdir)/$(SDLTEST_TARGET)
+ install-data:
+ $(SHELL) $(auxdir)/mkinstalldirs $(DESTDIR)$(datadir)/aclocal
+ $(INSTALL) -m 644 $(srcdir)/sdl2.m4 $(DESTDIR)$(datadir)/aclocal/sdl2.m4
+diff -ru SDL2-2.0.8.orig/src/dynapi/SDL_dynapi.c SDL2-2.0.8/src/dynapi/SDL_dynapi.c
+--- SDL2-2.0.8.orig/src/dynapi/SDL_dynapi.c 2018-03-01 17:34:42.000000000 +0100
++++ SDL2-2.0.8/src/dynapi/SDL_dynapi.c 2020-09-27 14:14:34.616542401 +0200
+@@ -222,7 +222,7 @@
+ return retval;
+ }
+
+-#elif defined(unix) || defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) || defined(__QNX__)
++#elif defined(unix) || defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) || defined(__QNX__) || defined(__midipix__)
+ #include <dlfcn.h>
+ static SDL_INLINE void *get_sdlapi_entry(const char *fname, const char *sym)
+ {
diff --git a/patches/sdl2/iconv.patch b/patches/sdl2/iconv.patch
new file mode 100644
index 00000000..64008c8a
--- /dev/null
+++ b/patches/sdl2/iconv.patch
@@ -0,0 +1,12 @@
+diff -ru SDL2-2.0.8.orig/src/stdlib/SDL_iconv.c SDL2-2.0.8/src/stdlib/SDL_iconv.c
+--- SDL2-2.0.8.orig/src/stdlib/SDL_iconv.c 2018-03-01 17:34:42.000000000 +0100
++++ SDL2-2.0.8/src/stdlib/SDL_iconv.c 2020-10-05 12:56:24.565427760 +0200
+@@ -37,7 +37,7 @@
+ iconv() may or may not use const char ** for the inbuf param.
+ If we get this wrong, it's just a warning, so no big deal.
+ */
+-#if defined(_XGP6) || defined(__APPLE__) || \
++#if defined(_XGP6) || defined(__APPLE__) || defined(__midipix__) || \
+ defined(__EMSCRIPTEN__) || \
+ (defined(__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) || \
+ (defined(_NEWLIB_VERSION)))
diff --git a/patches/sdl2/u16.patch b/patches/sdl2/u16.patch
new file mode 100644
index 00000000..d282e5e7
--- /dev/null
+++ b/patches/sdl2/u16.patch
@@ -0,0 +1,123 @@
+diff -ru SDL2-2.0.8.orig/include/SDL_stdinc.h SDL2-2.0.8/include/SDL_stdinc.h
+--- SDL2-2.0.8.orig/include/SDL_stdinc.h 2018-03-01 17:34:41.000000000 +0100
++++ SDL2-2.0.8/include/SDL_stdinc.h 2020-10-05 12:29:51.927442178 +0200
+@@ -451,10 +451,17 @@
+ extern DECLSPEC void *SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len);
+ extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len);
+
++#ifdef __midipix__
++extern DECLSPEC size_t SDLCALL SDL_wcslen(const uint16_t *wstr);
++extern DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) uint16_t *dst, const uint16_t *src, size_t maxlen);
++extern DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) uint16_t *dst, const uint16_t *src, size_t maxlen);
++extern DECLSPEC int SDLCALL SDL_wcscmp(const uint16_t *str, const uint16_t *str2);
++#else
+ extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr);
+ extern DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen);
+ extern DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen);
+ extern DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *str2);
++#endif /* !__midipix__ */
+
+ extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str);
+ extern DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen);
+diff -ru SDL2-2.0.8.orig/src/dynapi/SDL_dynapi_procs.h SDL2-2.0.8/src/dynapi/SDL_dynapi_procs.h
+--- SDL2-2.0.8.orig/src/dynapi/SDL_dynapi_procs.h 2018-03-01 17:34:42.000000000 +0100
++++ SDL2-2.0.8/src/dynapi/SDL_dynapi_procs.h 2020-10-05 12:41:07.154180772 +0200
+@@ -418,9 +418,15 @@
+ SDL_DYNAPI_PROC(void*,SDL_memcpy,(SDL_OUT_BYTECAP(c) void *a, SDL_IN_BYTECAP(c) const void *b, size_t c),(a,b,c),return)
+ SDL_DYNAPI_PROC(void*,SDL_memmove,(SDL_OUT_BYTECAP(c) void *a, SDL_IN_BYTECAP(c) const void *b, size_t c),(a,b,c),return)
+ SDL_DYNAPI_PROC(int,SDL_memcmp,(const void *a, const void *b, size_t c),(a,b,c),return)
++#ifdef __midipix__
++SDL_DYNAPI_PROC(size_t,SDL_wcslen,(const uint16_t *a),(a),return)
++SDL_DYNAPI_PROC(size_t,SDL_wcslcpy,(SDL_OUT_Z_CAP(c) uint16_t *a, const uint16_t *b, size_t c),(a,b,c),return)
++SDL_DYNAPI_PROC(size_t,SDL_wcslcat,(SDL_INOUT_Z_CAP(c) uint16_t *a, const uint16_t *b, size_t c),(a,b,c),return)
++#else
+ SDL_DYNAPI_PROC(size_t,SDL_wcslen,(const wchar_t *a),(a),return)
+ SDL_DYNAPI_PROC(size_t,SDL_wcslcpy,(SDL_OUT_Z_CAP(c) wchar_t *a, const wchar_t *b, size_t c),(a,b,c),return)
+ SDL_DYNAPI_PROC(size_t,SDL_wcslcat,(SDL_INOUT_Z_CAP(c) wchar_t *a, const wchar_t *b, size_t c),(a,b,c),return)
++#endif
+ SDL_DYNAPI_PROC(size_t,SDL_strlen,(const char *a),(a),return)
+ SDL_DYNAPI_PROC(size_t,SDL_strlcpy,(SDL_OUT_Z_CAP(c) char *a, const char *b, size_t c),(a,b,c),return)
+ SDL_DYNAPI_PROC(size_t,SDL_utf8strlcpy,(SDL_OUT_Z_CAP(c) char *a, const char *b, size_t c),(a,b,c),return)
+@@ -660,7 +666,11 @@
+ SDL_DYNAPI_PROC(SDL_JoystickID,SDL_JoystickGetDeviceInstanceID,(int a),(a),return)
+ SDL_DYNAPI_PROC(size_t,SDL_utf8strlen,(const char *a),(a),return)
+ SDL_DYNAPI_PROC(void*,SDL_LoadFile_RW,(SDL_RWops *a, size_t *b, int c),(a,b,c),return)
++#ifdef __midipix__
++SDL_DYNAPI_PROC(int,SDL_wcscmp,(const uint16_t *a, const uint16_t *b),(a,b),return)
++#else
+ SDL_DYNAPI_PROC(int,SDL_wcscmp,(const wchar_t *a, const wchar_t *b),(a,b),return)
++#endif
+ SDL_DYNAPI_PROC(SDL_BlendMode,SDL_ComposeCustomBlendMode,(SDL_BlendFactor a, SDL_BlendFactor b, SDL_BlendOperation c, SDL_BlendFactor d, SDL_BlendFactor e, SDL_BlendOperation f),(a,b,c,d,e,f),return)
+ SDL_DYNAPI_PROC(SDL_Surface*,SDL_DuplicateSurface,(SDL_Surface *a),(a),return)
+ SDL_DYNAPI_PROC(int,SDL_Vulkan_LoadLibrary,(const char *a),(a),return)
+diff -ru SDL2-2.0.8.orig/src/stdlib/SDL_string.c SDL2-2.0.8/src/stdlib/SDL_string.c
+--- SDL2-2.0.8.orig/src/stdlib/SDL_string.c 2018-03-01 17:34:42.000000000 +0100
++++ SDL2-2.0.8/src/stdlib/SDL_string.c 2020-10-05 12:29:39.691442561 +0200
+@@ -416,6 +416,44 @@
+ #endif /* HAVE_STRLEN */
+ }
+
++#ifdef __midipix__
++#include <u16ports/u16ports.h>
++
++size_t
++SDL_wcslen(const uint16_t * string)
++{
++ return u16_wcslen(string);
++}
++
++size_t
++SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) uint16_t *dst, const uint16_t *src, size_t maxlen)
++{
++ size_t srclen = u16_wcslen(src);
++ if(maxlen > 0) {
++ size_t len = SDL_min(srclen, maxlen - 1);
++ SDL_memcpy(dst, src, len * sizeof(uint16_t));
++ dst[len] = '\0';
++ }
++ return srclen;
++}
++
++size_t
++SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) uint16_t *dst, const uint16_t *src, size_t maxlen)
++{
++ size_t dstlen = u16_wcslen(dst);
++ size_t srclen = u16_wcslen(src);
++ if (dstlen < maxlen) {
++ SDL_wcslcpy(dst + dstlen, src, maxlen - dstlen);
++ }
++ return dstlen + srclen;
++}
++
++int
++SDL_wcscmp(const uint16_t *str1, const uint16_t *str2)
++{
++ return u16_wcscmp(str1, str2);
++}
++#else
+ size_t
+ SDL_wcslen(const wchar_t * string)
+ {
+@@ -476,6 +514,7 @@
+ return (int)(*str1 - *str2);
+ #endif /* HAVE_WCSCMP */
+ }
++#endif /* !__midipix__ */
+
+ size_t
+ SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen)
+diff -ru SDL2-2.0.8.orig/src/video/windows/SDL_windowsmessagebox.c SDL2-2.0.8/src/video/windows/SDL_windowsmessagebox.c
+--- SDL2-2.0.8.orig/src/video/windows/SDL_windowsmessagebox.c 2018-03-01 17:34:42.000000000 +0100
++++ SDL2-2.0.8/src/video/windows/SDL_windowsmessagebox.c 2020-10-05 12:51:31.389436939 +0200
+@@ -350,7 +350,11 @@
+ HFONT DialogFont;
+ SIZE Size;
+ RECT TextSize;
++#ifdef __midipix__
++ uint16_t *wmessage;
++#else
+ wchar_t* wmessage;
++#endif
+ TEXTMETRIC TM;
+
+ HWND ParentWindow = NULL;
diff --git a/patches/sdl2/wchar.patch b/patches/sdl2/wchar.patch
new file mode 100644
index 00000000..ea5a7dfb
--- /dev/null
+++ b/patches/sdl2/wchar.patch
@@ -0,0 +1,102 @@
+diff -ru SDL2-2.0.8.orig/src/video/windows/SDL_windowsevents.c SDL2-2.0.8/src/video/windows/SDL_windowsevents.c
+--- SDL2-2.0.8.orig/src/video/windows/SDL_windowsevents.c 2018-03-01 17:34:42.000000000 +0100
++++ SDL2-2.0.8/src/video/windows/SDL_windowsevents.c 2020-10-05 13:11:43.595494306 +0200
+@@ -47,6 +47,10 @@
+ #include "wmmsg.h"
+ #endif
+
++#ifdef __midipix__
++#define sdl_window_data (uint16_t[]){'S','D','L','_','W','i','n','d','o','w','D','a','t','a',0}
++#endif
++
+ /* For processing mouse WM_*BUTTON* and WM_MOUSEMOVE message-data from GetMessageExtraInfo() */
+ #define MOUSEEVENTF_FROMTOUCH 0xFF515700
+
+@@ -384,7 +388,11 @@
+ }
+
+ /* Get the window data for the window */
++#ifdef __midipix__
++ data = (SDL_WindowData *) GetProp(hwnd, sdl_window_data);
++#else
+ data = (SDL_WindowData *) GetProp(hwnd, TEXT("SDL_WindowData"));
++#endif
+ if (!data) {
+ return CallWindowProc(DefWindowProc, hwnd, msg, wParam, lParam);
+ }
+diff -ru SDL2-2.0.8.orig/src/video/windows/SDL_windowswindow.c SDL2-2.0.8/src/video/windows/SDL_windowswindow.c
+--- SDL2-2.0.8.orig/src/video/windows/SDL_windowswindow.c 2018-03-01 17:34:42.000000000 +0100
++++ SDL2-2.0.8/src/video/windows/SDL_windowswindow.c 2020-10-05 13:23:58.342720394 +0200
+@@ -45,10 +45,22 @@
+ #define SWP_NOCOPYBITS 0
+ #endif
+
++#ifdef __midipix__
++#define sdl_helper_window_input_catcher (uint16_t[]){'S','D','L','H','e','l','p','e','r','W','i','n','d','o','w','I','n','p','u','t','C','a','t','c','h','e','r',0}
++#define sdl_helper_window_name (uint16_t[]){'S','D','L','H','e','l','p','e','r','W','i','n','d','o','w','I','n','p','u','t','M','s','g','W','i','n','d','o','w',0}
++#define sdl_window (uint16_t[]){'S','D','L','_','W','i','n','d','o','w','D','a','t','a',0}
++#define sdl_empty (uint16_t[]){0}
++#endif
++
+ /* Fake window to help with DirectInput events. */
+ HWND SDL_HelperWindow = NULL;
++#ifdef __midipix__
++static WCHAR *SDL_HelperWindowClassName = sdl_helper_window_input_catcher;
++static WCHAR *SDL_HelperWindowName = sdl_helper_window_name;
++#else
+ static WCHAR *SDL_HelperWindowClassName = TEXT("SDLHelperWindowInputCatcher");
+ static WCHAR *SDL_HelperWindowName = TEXT("SDLHelperWindowInputMsgWindow");
++#endif
+ static ATOM SDL_HelperWindowClass = 0;
+
+ /* For borderless Windows, still want the following flags:
+@@ -183,7 +195,11 @@
+ window->driverdata = data;
+
+ /* Associate the data with the window */
++#ifdef __midipix__
++ if (!SetProp(hwnd, sdl_window, data)) {
++#else
+ if (!SetProp(hwnd, TEXT("SDL_WindowData"), data)) {
++#endif
+ ReleaseDC(hwnd, data->hdc);
+ SDL_free(data);
+ return WIN_SetError("SetProp() failed");
+@@ -307,7 +323,11 @@
+ int w, h;
+
+ if (window->flags & SDL_WINDOW_SKIP_TASKBAR) {
++#ifdef __midipix__
++ parent = CreateWindow(SDL_Appname, sdl_empty, STYLE_BASIC, 0, 0, 32, 32, NULL, NULL, SDL_Instance, NULL);
++#else
+ parent = CreateWindow(SDL_Appname, TEXT(""), STYLE_BASIC, 0, 0, 32, 32, NULL, NULL, SDL_Instance, NULL);
++#endif
+ }
+
+ style |= GetWindowStyle(window);
+@@ -315,9 +335,13 @@
+ /* Figure out what the window area will be */
+ WIN_AdjustWindowRectWithStyle(window, style, FALSE, &x, &y, &w, &h, SDL_FALSE);
+
++#ifdef __midipix__
++ hwnd = CreateWindow(SDL_Appname, sdl_empty, style, x, y, w, h, parent, NULL, SDL_Instance, NULL);
++#else
+ hwnd =
+ CreateWindow(SDL_Appname, TEXT(""), style, x, y, w, h, parent, NULL,
+ SDL_Instance, NULL);
++#endif
+ if (!hwnd) {
+ return WIN_SetError("Couldn't create window");
+ }
+@@ -741,7 +765,11 @@
+
+ if (data) {
+ ReleaseDC(data->hwnd, data->hdc);
++#ifdef __midipix__
++ RemoveProp(data->hwnd, sdl_window);
++#else
+ RemoveProp(data->hwnd, TEXT("SDL_WindowData"));
++#endif
+ if (data->created) {
+ DestroyWindow(data->hwnd);
+ if (data->parent) {
diff --git a/patches/sdl2/win32.patch b/patches/sdl2/win32.patch
new file mode 100644
index 00000000..0cc8167a
--- /dev/null
+++ b/patches/sdl2/win32.patch
@@ -0,0 +1,203 @@
+--- SDL2-2.0.8.orig/src/video/windows/SDL_windowsvideo.c 2018-03-01 17:34:42.000000000 +0100
++++ SDL2-2.0.8/src/video/windows/SDL_windowsvideo.c 2020-10-05 01:07:51.101894646 +0200
+@@ -240,13 +240,17 @@
+ WIN_QuitMouse(_this);
+ }
+
+-
++#ifdef SDL_VIDEO_RENDER_D3D
+ #define D3D_DEBUG_INFO
+ #include <d3d9.h>
++#endif
+
+ SDL_bool
+ D3D_LoadDLL(void **pD3DDLL, IDirect3D9 **pDirect3D9Interface)
+ {
++#ifndef SDL_VIDEO_RENDER_D3D
++ return SDL_FALSE;
++#else
+ *pD3DDLL = SDL_LoadObject("D3D9.DLL");
+ if (*pD3DDLL) {
+ typedef IDirect3D9 *(WINAPI *Direct3DCreate9_t) (UINT SDKVersion);
+@@ -284,12 +288,16 @@
+ }
+ *pDirect3D9Interface = NULL;
+ return SDL_FALSE;
++#endif
+ }
+
+
+ int
+ SDL_Direct3D9GetAdapterIndex(int displayIndex)
+ {
++#ifndef SDL_VIDEO_RENDER_D3D
++ return 0;
++#else
+ void *pD3DDLL;
+ IDirect3D9 *pD3D;
+ if (!D3D_LoadDLL(&pD3DDLL, &pD3D)) {
+@@ -324,6 +332,7 @@
+
+ return adapterIndex;
+ }
++#endif
+ }
+
+ #if HAVE_DXGI_H
+--- SDL2-2.0.8.orig/src/video/windows/SDL_windowsevents.c 2018-03-01 17:34:42.000000000 +0100
++++ SDL2-2.0.8/src/video/windows/SDL_windowsevents.c 2020-10-05 01:59:14.387146659 +0200
+@@ -1162,7 +1166,7 @@
+ }
+ } else {
+ /* Use the first icon as a default icon, like in the Explorer */
+- GetModuleFileName(SDL_Instance, path, MAX_PATH);
++ GetModuleFileNameA(SDL_Instance, path, MAX_PATH);
+ ExtractIconEx(path, 0, &wcex.hIcon, &wcex.hIconSm, 1);
+ }
+
+--- SDL2-2.0.8.orig/include/SDL_system.h 2018-03-01 17:34:41.000000000 +0100
++++ SDL2-2.0.8/include/SDL_system.h 2020-10-05 00:17:56.683991095 +0200
+@@ -41,7 +41,7 @@
+
+
+ /* Platform specific functions for Windows */
+-#ifdef __WIN32__
++#if defined(__WIN32__) || defined(__midipix__)
+
+ /**
+ \brief Set a function that is called for every windows message, before TranslateMessage()
+--- SDL2-2.0.8.orig/src/core/unix/SDL_windows.c 1970-01-01 01:00:00.000000000 +0100
++++ SDL2-2.0.8/src/core/unix/SDL_windows.c 2020-10-05 01:45:58.660207506 +0200
+@@ -0,0 +1,54 @@
++/*
++ Simple DirectMedia Layer
++ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
++
++ This software is provided 'as-is', without any express or implied
++ warranty. In no event will the authors be held liable for any damages
++ arising from the use of this software.
++
++ Permission is granted to anyone to use this software for any purpose,
++ including commercial applications, and to alter it and redistribute it
++ freely, subject to the following restrictions:
++
++ 1. The origin of this software must not be misrepresented; you must not
++ claim that you wrote the original software. If you use this software
++ in a product, an acknowledgment in the product documentation would be
++ appreciated but is not required.
++ 2. Altered source versions must be plainly marked as such, and must not be
++ misrepresented as being the original software.
++ 3. This notice may not be removed or altered from any source distribution.
++*/
++#include "../../SDL_internal.h"
++
++#if defined(__WIN32__) || defined(__WINRT__) || defined(__midipix__)
++
++#include "SDL_windows.h"
++#include "SDL_error.h"
++#include "SDL_assert.h"
++
++#ifndef _WIN32_WINNT_VISTA
++#define _WIN32_WINNT_VISTA 0x0600
++#endif
++
++
++/* Sets an error message based on an HRESULT */
++int
++WIN_SetErrorFromHRESULT(const char *prefix, HRESULT hr)
++{
++ TCHAR buffer[1024];
++ char *message;
++ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, hr, 0,
++ buffer, SDL_arraysize(buffer), NULL);
++ message = WIN_StringToUTF8(buffer);
++ SDL_SetError("%s%s%s", prefix ? prefix : "", prefix ? ": " : "", message);
++ SDL_free(message);
++ return -1;
++}
++
++/* Sets an error message based on GetLastError() */
++int
++WIN_SetError(const char *prefix)
++{
++ return WIN_SetErrorFromHRESULT(prefix, GetLastError());
++}
++#endif
+--- SDL2-2.0.8.orig/src/core/unix/SDL_windows.h 1970-01-01 01:00:00.000000000 +0100
++++ SDL2-2.0.8/src/core/unix/SDL_windows.h 2020-10-05 01:36:40.827047116 +0200
+@@ -0,0 +1,75 @@
++/*
++ Simple DirectMedia Layer
++ Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
++
++ This software is provided 'as-is', without any express or implied
++ warranty. In no event will the authors be held liable for any damages
++ arising from the use of this software.
++
++ Permission is granted to anyone to use this software for any purpose,
++ including commercial applications, and to alter it and redistribute it
++ freely, subject to the following restrictions:
++
++ 1. The origin of this software must not be misrepresented; you must not
++ claim that you wrote the original software. If you use this software
++ in a product, an acknowledgment in the product documentation would be
++ appreciated but is not required.
++ 2. Altered source versions must be plainly marked as such, and must not be
++ misrepresented as being the original software.
++ 3. This notice may not be removed or altered from any source distribution.
++*/
++
++/* This is an include file for windows.h with the SDL build settings */
++
++#ifndef _INCLUDED_WINDOWS_H
++#define _INCLUDED_WINDOWS_H
++
++#if defined(__WIN32__)
++#define WIN32_LEAN_AND_MEAN
++#define STRICT
++#ifndef UNICODE
++#define UNICODE 1
++#endif
++#undef _WIN32_WINNT
++#define _WIN32_WINNT 0x501 /* Need 0x410 for AlphaBlend() and 0x500 for EnumDisplayDevices(), 0x501 for raw input */
++#endif
++
++#include <windows.h>
++#include <basetyps.h> /* for REFIID with broken mingw.org headers */
++
++/* Routines to convert from UTF8 to native Windows text */
++#if UNICODE
++#define WIN_StringToUTF8(S) SDL_iconv_string("UTF-8", "UTF-16LE", (char *)(S), (SDL_wcslen(S)+1)*sizeof(WCHAR))
++#define WIN_UTF8ToString(S) (WCHAR *)SDL_iconv_string("UTF-16LE", "UTF-8", (char *)(S), SDL_strlen(S)+1)
++#else
++/* !!! FIXME: UTF8ToString() can just be a SDL_strdup() here. */
++#define WIN_StringToUTF8(S) SDL_iconv_string("UTF-8", "ASCII", (char *)(S), (SDL_strlen(S)+1))
++#define WIN_UTF8ToString(S) SDL_iconv_string("ASCII", "UTF-8", (char *)(S), SDL_strlen(S)+1)
++#endif
++
++/* Sets an error message based on a given HRESULT */
++extern int WIN_SetErrorFromHRESULT(const char *prefix, HRESULT hr);
++
++/* Sets an error message based on GetLastError(). Always return -1. */
++extern int WIN_SetError(const char *prefix);
++
++/* Wrap up the oddities of CoInitialize() into a common function. */
++extern HRESULT WIN_CoInitialize(void);
++extern void WIN_CoUninitialize(void);
++
++/* Returns SDL_TRUE if we're running on Windows Vista and newer */
++extern BOOL WIN_IsWindowsVistaOrGreater(void);
++
++/* Returns SDL_TRUE if we're running on Windows 7 and newer */
++extern BOOL WIN_IsWindows7OrGreater(void);
++
++/* You need to SDL_free() the result of this call. */
++extern char *WIN_LookupAudioDeviceName(const WCHAR *name, const GUID *guid);
++
++/* Checks to see if two GUID are the same. */
++extern BOOL WIN_IsEqualGUID(const GUID * a, const GUID * b);
++extern BOOL WIN_IsEqualIID(REFIID a, REFIID b);
++
++#endif /* _INCLUDED_WINDOWS_H */
++
++/* vi: set ts=4 sw=4 expandtab: */
diff --git a/vars/sdl2.vars b/vars/sdl2.vars
new file mode 100644
index 00000000..e2ea261d
--- /dev/null
+++ b/vars/sdl2.vars
@@ -0,0 +1,8 @@
+#
+# set +o errexit -o noglob -o nounset is assumed.
+#
+
+: ${PKG_SDL2_CONFIG_CACHE_EXTRA:="
+ac_cv_func_strtod=yes"};
+
+# vim:filetype=sh textwidth=0