SDL: Re-added WinRT support until we're sure that it's no longer being used

From a635a485bcd926a128ffc4b78cb82105bc351360 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Wed, 23 Nov 2022 10:41:43 -0800
Subject: [PATCH] Re-added WinRT support until we're sure that it's no longer
 being used

---
 .github/workflows/msvc.yml                    |   3 +
 CMakeLists.txt                                | 107 ++-
 Makefile.in                                   |   2 +-
 VisualC-GDK/SDL/SDL.vcxproj                   |   1 +
 VisualC-GDK/SDL/SDL.vcxproj.filters           |   3 +
 VisualC-WinRT/SDL-UWP.sln                     |  40 +
 VisualC-WinRT/SDL-UWP.vcxproj                 | 594 ++++++++++++
 VisualC-WinRT/SDL-UWP.vcxproj.filters         | 849 ++++++++++++++++
 VisualC/SDL/SDL.vcxproj                       |   1 +
 VisualC/SDL/SDL.vcxproj.filters               |   3 +
 build-scripts/fnsince.pl                      |   6 +
 cmake/test/CMakeLists.txt                     |   4 +-
 docs/README-winrt.md                          | 519 ++++++++++
 docs/README.md                                |   1 +
 include/SDL_config.h                          |   2 +
 include/SDL_config.h.cmake                    |   2 +
 include/SDL_config_windows.h                  |   2 +
 include/SDL_config_winrt.h                    | 220 +++++
 include/SDL_cpuinfo.h                         |   2 +-
 include/SDL_hints.h                           |  99 ++
 include/SDL_main.h                            |  28 +
 include/SDL_platform.h                        |   3 +-
 include/SDL_system.h                          | 103 ++
 include/SDL_syswm.h                           |  11 +
 include/begin_code.h                          |   4 +-
 src/SDL.c                                     |   4 +-
 src/SDL_log.c                                 |  14 +-
 src/atomic/SDL_spinlock.c                     |   2 +-
 src/audio/wasapi/SDL_wasapi.c                 | 115 +--
 src/audio/wasapi/SDL_wasapi.h                 |  17 +
 src/audio/wasapi/SDL_wasapi_win32.c           | 162 ++++
 src/audio/wasapi/SDL_wasapi_winrt.cpp         | 447 +++++++++
 src/core/windows/SDL_hid.c                    |   4 +
 src/core/windows/SDL_hid.h                    |   4 +
 src/core/windows/SDL_windows.c                |  37 +-
 src/core/windows/SDL_windows.h                |   2 +
 src/core/windows/SDL_xinput.c                 |   6 +-
 src/core/winrt/SDL_winrtapp_common.cpp        |  67 ++
 src/core/winrt/SDL_winrtapp_common.h          |  31 +
 src/core/winrt/SDL_winrtapp_direct3d.cpp      | 797 +++++++++++++++
 src/core/winrt/SDL_winrtapp_direct3d.h        |  92 ++
 src/core/winrt/SDL_winrtapp_xaml.cpp          | 160 +++
 src/core/winrt/SDL_winrtapp_xaml.h            |  33 +
 src/cpuinfo/SDL_cpuinfo.c                     |   4 +-
 src/dynapi/SDL_dynapi.h                       |   2 +
 src/dynapi/SDL_dynapi_overrides.h             |   4 +
 src/dynapi/SDL_dynapi_procs.h                 |   8 +
 src/file/SDL_rwops.c                          |   3 +
 src/filesystem/winrt/SDL_sysfilesystem.cpp    | 242 +++++
 src/joystick/SDL_joystick.c                   |   4 +
 src/joystick/windows/SDL_rawinputjoystick.c   |   5 +
 .../windows/SDL_windows_gaming_input.c        |  27 +-
 src/joystick/windows/SDL_windowsjoystick.c    |  14 +-
 src/joystick/windows/SDL_xinputjoystick.c     |  10 +-
 src/loadso/windows/SDL_sysloadso.c            |   8 +
 src/locale/winrt/SDL_syslocale.c              |  58 ++
 .../winrt/SDL3-WinRTResource_BlankCursor.cur  |   0
 src/main/winrt/SDL3-WinRTResources.rc         |   3 +
 src/main/winrt/SDL_winrt_main_NonXAML.cpp     |  54 ++
 src/misc/winrt/SDL_sysurl.cpp                 |  41 +
 src/power/SDL_power.c                         |   3 +
 src/power/SDL_syspower.h                      |   1 +
 src/power/winrt/SDL_syspower.cpp              |  44 +
 src/render/direct3d11/SDL_render_d3d11.c      |  57 +-
 src/render/direct3d11/SDL_render_winrt.cpp    | 116 +++
 src/render/direct3d11/SDL_render_winrt.h      |  40 +
 src/render/opengles2/SDL_render_gles2.c       |   8 +
 src/thread/stdcpp/SDL_systhread.cpp           |  31 +
 src/thread/windows/SDL_syscond_cv.c           |  12 +
 src/thread/windows/SDL_sysmutex.c             |  16 +
 src/thread/windows/SDL_syssem.c               |  15 +
 src/thread/windows/SDL_systhread.c            |   4 +-
 src/thread/windows/SDL_systls.c               |  12 +
 src/timer/windows/SDL_systimer.c              |  22 +-
 src/video/SDL_egl.c                           |  10 +-
 src/video/SDL_stretch.c                       |   2 +-
 src/video/SDL_sysvideo.h                      |   1 +
 src/video/SDL_video.c                         |  55 +-
 src/video/winrt/SDL_winrtevents.cpp           | 153 +++
 src/video/winrt/SDL_winrtevents_c.h           |  83 ++
 src/video/winrt/SDL_winrtgamebar.cpp          | 196 ++++
 src/video/winrt/SDL_winrtgamebar_cpp.h        |  35 +
 src/video/winrt/SDL_winrtkeyboard.cpp         | 466 +++++++++
 src/video/winrt/SDL_winrtmessagebox.cpp       | 118 +++
 src/video/winrt/SDL_winrtmessagebox.h         |  29 +
 src/video/winrt/SDL_winrtmouse.cpp            | 222 +++++
 src/video/winrt/SDL_winrtmouse_c.h            |  40 +
 src/video/winrt/SDL_winrtopengles.cpp         | 203 ++++
 src/video/winrt/SDL_winrtopengles.h           |  70 ++
 src/video/winrt/SDL_winrtpointerinput.cpp     | 407 ++++++++
 src/video/winrt/SDL_winrtvideo.cpp            | 907 ++++++++++++++++++
 src/video/winrt/SDL_winrtvideo_cpp.h          | 106 ++
 92 files changed, 8410 insertions(+), 164 deletions(-)
 create mode 100644 VisualC-WinRT/SDL-UWP.sln
 create mode 100644 VisualC-WinRT/SDL-UWP.vcxproj
 create mode 100644 VisualC-WinRT/SDL-UWP.vcxproj.filters
 create mode 100644 docs/README-winrt.md
 create mode 100644 include/SDL_config_winrt.h
 create mode 100644 src/audio/wasapi/SDL_wasapi_win32.c
 create mode 100644 src/audio/wasapi/SDL_wasapi_winrt.cpp
 create mode 100644 src/core/winrt/SDL_winrtapp_common.cpp
 create mode 100644 src/core/winrt/SDL_winrtapp_common.h
 create mode 100644 src/core/winrt/SDL_winrtapp_direct3d.cpp
 create mode 100644 src/core/winrt/SDL_winrtapp_direct3d.h
 create mode 100644 src/core/winrt/SDL_winrtapp_xaml.cpp
 create mode 100644 src/core/winrt/SDL_winrtapp_xaml.h
 create mode 100644 src/filesystem/winrt/SDL_sysfilesystem.cpp
 create mode 100644 src/locale/winrt/SDL_syslocale.c
 create mode 100644 src/main/winrt/SDL3-WinRTResource_BlankCursor.cur
 create mode 100644 src/main/winrt/SDL3-WinRTResources.rc
 create mode 100644 src/main/winrt/SDL_winrt_main_NonXAML.cpp
 create mode 100644 src/misc/winrt/SDL_sysurl.cpp
 create mode 100644 src/power/winrt/SDL_syspower.cpp
 create mode 100644 src/render/direct3d11/SDL_render_winrt.cpp
 create mode 100644 src/render/direct3d11/SDL_render_winrt.h
 create mode 100644 src/video/winrt/SDL_winrtevents.cpp
 create mode 100644 src/video/winrt/SDL_winrtevents_c.h
 create mode 100644 src/video/winrt/SDL_winrtgamebar.cpp
 create mode 100644 src/video/winrt/SDL_winrtgamebar_cpp.h
 create mode 100644 src/video/winrt/SDL_winrtkeyboard.cpp
 create mode 100644 src/video/winrt/SDL_winrtmessagebox.cpp
 create mode 100644 src/video/winrt/SDL_winrtmessagebox.h
 create mode 100644 src/video/winrt/SDL_winrtmouse.cpp
 create mode 100644 src/video/winrt/SDL_winrtmouse_c.h
 create mode 100644 src/video/winrt/SDL_winrtopengles.cpp
 create mode 100644 src/video/winrt/SDL_winrtopengles.h
 create mode 100644 src/video/winrt/SDL_winrtpointerinput.cpp
 create mode 100644 src/video/winrt/SDL_winrtvideo.cpp
 create mode 100644 src/video/winrt/SDL_winrtvideo_cpp.h

diff --git a/.github/workflows/msvc.yml b/.github/workflows/msvc.yml
index 0af15d9eb32b..01d95485da10 100644
--- a/.github/workflows/msvc.yml
+++ b/.github/workflows/msvc.yml
@@ -19,6 +19,8 @@ jobs:
         - { name: Windows (clang-cl x86), flags: -T ClangCL -A Win32 }
         - { name: Windows (ARM),          flags: -A ARM }
         - { name: Windows (ARM64),        flags: -A ARM64 }
+        - { name: UWP (x64),              flags: -A x64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0" -DSDL_TESTS=OFF, nowerror: true,
+            project: VisualC-WinRT/SDL-UWP.sln, projectflags: '/p:Platform=x64 /p:WindowsTargetPlatformVersion=10.0.17763.0' }
 
     steps:
     - uses: actions/checkout@v3
@@ -57,6 +59,7 @@ jobs:
         echo "SDL3_DIR=$Env:GITHUB_WORKSPACE/prefix" >> $Env:GITHUB_ENV
         cmake --install build/
     - name: Verify CMake configuration files
+      if: ${{ !contains(matrix.platform.name, 'UWP') }}  # FIXME: cmake/test/CMakeLists.txt should support UWP
       run: |
         cmake -S cmake/test -B cmake_config_build `
           -DCMAKE_PREFIX_PATH=${{ env.SDL3_DIR }} `
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1386072d66df..57b32101628f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,6 +26,12 @@ set(EXTRA_LDFLAGS)
 #  etc. See https://github.com/libsdl-org/SDL/issues/4150
 add_library(sdl-build-options INTERFACE)
 
+if(WINDOWS_STORE)
+  cmake_minimum_required(VERSION 3.11.0)
+  target_compile_definitions(sdl-build-options INTERFACE "-DSDL_BUILDING_WINRT=1")
+  target_compile_options(sdl-build-options INTERFACE "-ZW")
+endif()
+
 # Build in parallel under Visual Studio. Not enabled by default.
 if(MSVC)
   target_compile_options(sdl-build-options INTERFACE "/MP")
@@ -233,7 +239,7 @@ endif()
 #  so we'll just use libusb when it's available. libusb does not support iOS,
 #  so we default to yes on iOS.
 #  TODO: Windows can support libusb, the hid.c file just depends on Unix APIs
-if(WINDOWS OR IOS OR TVOS OR ANDROID)
+if((WINDOWS AND NOT WINDOWS_STORE) OR IOS OR TVOS OR ANDROID)
   set(HIDAPI_SKIP_LIBUSB TRUE)
 else()
   set(HIDAPI_SKIP_LIBUSB FALSE)
@@ -1664,6 +1670,11 @@ elseif(WINDOWS)
   file(GLOB CORE_SOURCES ${SDL3_SOURCE_DIR}/src/core/windows/*.c)
   list(APPEND SOURCE_FILES ${CORE_SOURCES})
 
+  if(WINDOWS_STORE)
+    file(GLOB WINRT_SOURCE_FILES ${SDL3_SOURCE_DIR}/src/core/winrt/*.c ${SDL3_SOURCE_DIR}/src/core/winrt/*.cpp)
+    list(APPEND SOURCE_FILES ${WINRT_SOURCE_FILES})
+  endif()
+
   if(MSVC AND NOT SDL_LIBC)
     # Prevent codegen that would use the VC runtime libraries.
     set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
@@ -1673,7 +1684,11 @@ elseif(WINDOWS)
   endif()
 
   if(SDL_MISC)
-    file(GLOB MISC_SOURCES ${SDL3_SOURCE_DIR}/src/misc/windows/*.c)
+    if(WINDOWS_STORE)
+      file(GLOB MISC_SOURCES ${SDL3_SOURCE_DIR}/src/misc/winrt/*.cpp)
+    else()
+      file(GLOB MISC_SOURCES ${SDL3_SOURCE_DIR}/src/misc/windows/*.c)
+    endif()
     list(APPEND SOURCE_FILES ${MISC_SOURCES})
     set(HAVE_SDL_MISC TRUE)
   endif()
@@ -1703,7 +1718,7 @@ elseif(WINDOWS)
     check_include_file(ddraw.h HAVE_DDRAW_H)
     check_include_file(dsound.h HAVE_DSOUND_H)
     check_include_file(dinput.h HAVE_DINPUT_H)
-    if(CMAKE_GENERATOR_PLATFORM STREQUAL "ARM")
+    if(WINDOWS_STORE OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM")
       set(HAVE_DINPUT_H 0)
     endif()
     check_include_file(dxgi.h HAVE_DXGI_H)
@@ -1750,7 +1765,7 @@ elseif(WINDOWS)
   check_include_file(shellscalingapi.h HAVE_SHELLSCALINGAPI_H)
 
   if(SDL_AUDIO)
-    if(HAVE_DSOUND_H)
+    if(HAVE_DSOUND_H AND NOT WINDOWS_STORE)
       set(SDL_AUDIO_DRIVER_DSOUND 1)
       file(GLOB DSOUND_AUDIO_SOURCES ${SDL3_SOURCE_DIR}/src/audio/directsound/*.c)
       list(APPEND SOURCE_FILES ${DSOUND_AUDIO_SOURCES})
@@ -1761,6 +1776,9 @@ elseif(WINDOWS)
       set(SDL_AUDIO_DRIVER_WASAPI 1)
       set(HAVE_WASAPI TRUE)
       file(GLOB WASAPI_AUDIO_SOURCES ${SDL3_SOURCE_DIR}/src/audio/wasapi/*.c)
+      if(WINDOWS_STORE)
+        list(APPEND WASAPI_AUDIO_SOURCES ${SDL3_SOURCE_DIR}/src/audio/wasapi/SDL_wasapi_winrt.cpp)
+      endif()
       list(APPEND SOURCE_FILES ${WASAPI_AUDIO_SOURCES})
       set(HAVE_SDL_AUDIO TRUE)
     endif()
@@ -1771,11 +1789,20 @@ elseif(WINDOWS)
     if(NOT SDL_LOADSO)
       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
     endif()
-    set(SDL_VIDEO_DRIVER_WINDOWS 1)
-    file(GLOB WIN_VIDEO_SOURCES ${SDL3_SOURCE_DIR}/src/video/windows/*.c)
+    if(WINDOWS_STORE)
+      set(SDL_VIDEO_DRIVER_WINRT 1)
+      file(GLOB WIN_VIDEO_SOURCES
+        ${SDL3_SOURCE_DIR}/src/video/winrt/*.c
+        ${SDL3_SOURCE_DIR}/src/video/winrt/*.cpp
+        ${SDL3_SOURCE_DIR}/src/render/direct3d11/*.cpp
+        )
+    else()
+      set(SDL_VIDEO_DRIVER_WINDOWS 1)
+      file(GLOB WIN_VIDEO_SOURCES ${SDL3_SOURCE_DIR}/src/video/windows/*.c)
+    endif()
     list(APPEND SOURCE_FILES ${WIN_VIDEO_SOURCES})
 
-    if(SDL_RENDER_D3D AND HAVE_D3D_H)
+    if(SDL_RENDER_D3D AND HAVE_D3D_H AND NOT WINDOWS_STORE)
       set(SDL_VIDEO_RENDER_D3D 1)
       set(HAVE_RENDER_D3D TRUE)
     endif()
@@ -1783,7 +1810,7 @@ elseif(WINDOWS)
       set(SDL_VIDEO_RENDER_D3D11 1)
       set(HAVE_RENDER_D3D TRUE)
     endif()
-    if(SDL_RENDER_D3D AND HAVE_D3D12_H)
+    if(SDL_RENDER_D3D AND HAVE_D3D12_H AND NOT WINDOWS_STORE)
       set(SDL_VIDEO_RENDER_D3D12 1)
       set(HAVE_RENDER_D3D TRUE)
     endif()
@@ -1803,7 +1830,7 @@ elseif(WINDOWS)
     set(HAVE_SDL_THREADS TRUE)
   endif()
 
-  if(SDL_SENSOR AND HAVE_SENSORSAPI_H)
+  if(SDL_SENSOR AND HAVE_SENSORSAPI_H AND NOT WINDOWS_STORE)
     set(SDL_SENSOR_WINDOWS 1)
     set(HAVE_SDL_SENSORS TRUE)
     file(GLOB WINDOWS_SENSOR_SOURCES ${SDL3_SOURCE_DIR}/src/sensor/windows/*.c)
@@ -1811,26 +1838,50 @@ elseif(WINDOWS)
   endif()
 
   if(SDL_POWER)
-    set(SDL_POWER_WINDOWS 1)
-    list(APPEND SOURCE_FILES ${SDL3_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
-    set(HAVE_SDL_POWER TRUE)
+    if(WINDOWS_STORE)
+      set(SDL_POWER_WINRT 1)
+      list(APPEND SOURCE_FILES ${SDL3_SOURCE_DIR}/src/power/winrt/SDL_syspower.cpp)
+    else()
+      set(SDL_POWER_WINDOWS 1)
+      list(APPEND SOURCE_FILES ${SDL3_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
+      set(HAVE_SDL_POWER TRUE)
+    endif()
   endif()
 
   if(SDL_LOCALE)
-    file(GLOB LOCALE_SOURCES ${SDL3_SOURCE_DIR}/src/locale/windows/*.c)
+    if(WINDOWS_STORE)
+      file(GLOB LOCALE_SOURCES ${SDL3_SOURCE_DIR}/src/locale/winrt/*.c)
+    else()
+      file(GLOB LOCALE_SOURCES ${SDL3_SOURCE_DIR}/src/locale/windows/*.c)
+    endif()
     list(APPEND SOURCE_FILES ${LOCALE_SOURCES})
     set(HAVE_SDL_LOCALE TRUE)
   endif()
 
   if(SDL_FILESYSTEM)
     set(SDL_FILESYSTEM_WINDOWS 1)
-    file(GLOB FILESYSTEM_SOURCES ${SDL3_SOURCE_DIR}/src/filesystem/windows/*.c)
+    if(WINDOWS_STORE)
+      file(GLOB FILESYSTEM_SOURCES ${SDL3_SOURCE_DIR}/src/filesystem/winrt/*.cpp)
+    else()
+      file(GLOB FILESYSTEM_SOURCES ${SDL3_SOURCE_DIR}/src/filesystem/windows/*.c)
+    endif()
     list(APPEND SOURCE_FILES ${FILESYSTEM_SOURCES})
     set(HAVE_SDL_FILESYSTEM TRUE)
   endif()
 
   # Libraries for Win32 native and MinGW
-  list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
+  if(NOT WINDOWS_STORE)
+    list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
+  endif()
+
+  if(WINDOWS_STORE)
+    list(APPEND EXTRA_LIBS
+      -nodefaultlib:vccorlib$<$<CONFIG:Debug>:d>
+      -nodefaultlib:msvcrt$<$<CONFIG:Debug>:d>
+      vccorlib$<$<CONFIG:Debug>:d>.lib
+      msvcrt$<$<CONFIG:Debug>:d>.lib
+    )
+  endif()
 
   if(SDL_TIMERS)
     set(SDL_TIMER_WINDOWS 1)
@@ -1850,7 +1901,7 @@ elseif(WINDOWS)
   list(APPEND SOURCE_FILES ${CORE_SOURCES})
 
   if(SDL_VIDEO)
-    if(SDL_OPENGL)
+    if(SDL_OPENGL AND NOT WINDOWS_STORE)
       set(SDL_VIDEO_OPENGL 1)
       set(SDL_VIDEO_OPENGL_WGL 1)
       set(SDL_VIDEO_RENDER_OGL 1)
@@ -1878,14 +1929,18 @@ elseif(WINDOWS)
     file(GLOB JOYSTICK_SOURCES ${SDL3_SOURCE_DIR}/src/joystick/windows/*.c)
     list(APPEND SOURCE_FILES ${JOYSTICK_SOURCES})
 
-    set(SDL_JOYSTICK_RAWINPUT 1)
+    if(NOT WINDOWS_STORE)
+      set(SDL_JOYSTICK_RAWINPUT 1)
+    endif()
     if(HAVE_DINPUT_H)
       set(SDL_JOYSTICK_DINPUT 1)
       list(APPEND EXTRA_LIBS dinput8)
     endif()
     if(HAVE_XINPUT_H)
-      set(SDL_JOYSTICK_XINPUT 1)
-      set(HAVE_XINPUT TRUE)
+      if(NOT WINDOWS_STORE)
+        set(SDL_JOYSTICK_XINPUT 1)
+        set(HAVE_XINPUT TRUE)
+      endif()
       if(HAVE_WINDOWS_GAMING_INPUT_H)
         set(SDL_JOYSTICK_WGI 1)
       endif()
@@ -1893,7 +1948,7 @@ elseif(WINDOWS)
     set(HAVE_SDL_JOYSTICK TRUE)
 
     if(SDL_HAPTIC)
-      if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
+      if((HAVE_DINPUT_H OR HAVE_XINPUT_H) AND NOT WINDOWS_STORE)
         file(GLOB HAPTIC_SOURCES ${SDL3_SOURCE_DIR}/src/haptic/windows/*.c)
         if(HAVE_DINPUT_H)
           set(SDL_HAPTIC_DINPUT 1)
@@ -3071,7 +3126,7 @@ endif()
 # Ensure that the extra cflags are used at compile time
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${EXTRA_CFLAGS_BUILD}")
 
-if(NOT SDL3_DISABLE_SDL3MAIN)
+if(NOT WINDOWS_STORE AND NOT SDL3_DISABLE_SDL3MAIN)
   # Build SDLmain
   add_library(SDL3main STATIC ${SDLMAIN_SOURCES})
   add_dependencies(SDL3main sdl_headers_copy)
@@ -3153,8 +3208,10 @@ if(SDL_SHARED)
   # Note: The clang toolset for Visual Studio does not support /NODEFAULTLIB.
   if(MSVC AND NOT SDL_LIBC AND NOT MSVC_CLANG AND NOT CMAKE_GENERATOR_PLATFORM STREQUAL "ARM")
     # Don't try to link with the default set of libraries.
-    set_target_properties(SDL3 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
-    set_target_properties(SDL3 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
+    if(NOT WINDOWS_STORE)
+      set_target_properties(SDL3 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
+      set_target_properties(SDL3 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
+    endif()
     set_target_properties(SDL3 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
   endif()
   # FIXME: if CMAKE_VERSION >= 3.13, use target_link_options for EXTRA_LDFLAGS
@@ -3236,7 +3293,7 @@ if(NOT SDL3_DISABLE_INSTALL)
       RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
   endif()
 
-  if(NOT SDL3_DISABLE_SDL3MAIN)
+  if(NOT WINDOWS_STORE AND NOT SDL3_DISABLE_SDL3MAIN)
     install(TARGETS SDL3main EXPORT SDL3mainTargets
       LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
       ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
@@ -3289,7 +3346,7 @@ if(NOT SDL3_DISABLE_INSTALL)
     endif()
   endif()
 
-  if(NOT SDL3_DISABLE_SDL3MAIN)
+  if(NOT WINDOWS_STORE AND NOT SDL3_DISABLE_SDL3MAIN)
     install(EXPORT SDL3mainTargets
       FILE SDL3mainTargets.cmake
       NAMESPACE SDL3::
diff --git a/Makefile.in b/Makefile.in
index 96dfed9ace7d..f72a044c2ac1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -51,7 +51,7 @@ WAYLAND_SCANNER_CODE_MODE = @WAYLAND_SCANNER_CODE_MODE@
 
 INSTALL_SDL3_CONFIG = @INSTALL_SDL3_CONFIG@
 
-SRC_DIST = *.md *.txt acinclude Android.mk autogen.sh android-project build-scripts cmake cmake_uninstall.cmake.in configure configure.ac docs include Makefile.* mingw sdl3-config.cmake.in sdl3-config-version.cmake.in sdl3-config.in sdl3.m4 sdl3.pc.in SDL3.spec.in SDL3Config.cmake.in src test VisualC Xcode Xcode-iOS wayland-protocols
+SRC_DIST = *.md *.txt acinclude Android.mk autogen.sh android-project build-scripts cmake cmake_uninstall.cmake.in configure configure.ac docs include Makefile.* mingw sdl3-config.cmake.in sdl3-config-version.cmake.in sdl3-config.in sdl3.m4 sdl3.pc.in SDL3.spec.in SDL3Config.cmake.in src test VisualC VisualC-WinRT Xcode Xcode-iOS wayland-protocols
 GEN_DIST = SDL3.spec
 
 ifneq ($V,1)
diff --git a/VisualC-GDK/SDL/SDL.vcxproj b/VisualC-GDK/SDL/SDL.vcxproj
index cc02748da41f..14b2d37c197f 100644
--- a/VisualC-GDK/SDL/SDL.vcxproj
+++ b/VisualC-GDK/SDL/SDL.vcxproj
@@ -534,6 +534,7 @@
     <ClCompile Include="..\..\src\audio\SDL_mixer.c" />
     <ClCompile Include="..\..\src\audio\SDL_wave.c" />
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c" />
+    <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi_win32.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_hid.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_immdevice.c" />
     <ClCompile Include="..\..\src\core\windows\SDL_windows.c" />
diff --git a/VisualC-GDK/SDL/SDL.vcxproj.filters b/VisualC-GDK/SDL/SDL.vcxproj.filters
index c8a757b1ea83..aee609a4cbc6 100644
--- a/VisualC-GDK/SDL/SDL.vcxproj.filters
+++ b/VisualC-GDK/SDL/SDL.vcxproj.filters
@@ -1021,6 +1021,9 @@
     <ClCompile Include="..\..\src\audio\dummy\SDL_dummyaudio.c">
       <Filter>audio\dummy</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi_win32.c">
+      <Filter>audio\wasapi</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\src\audio\wasapi\SDL_wasapi.c">
       <Filter>audio\wasapi</Filter>
     </ClCompile>
diff --git a/VisualC-WinRT/SDL-UWP.sln b/VisualC-WinRT/SDL-UWP.sln
new file mode 100644
index 000000000000..62f9f04172bb
--- /dev/null
+++ b/VisualC-WinRT/SDL-UWP.sln
@@ -0,0 +1,40 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL3-UWP", "SDL-UWP.vcxproj", "{89E9B32E-A86A-47C3-A948-D2B1622925CE}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|ARM = Debug|ARM
+		Debug|ARM64 = Debug|ARM64
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|ARM = Release|ARM
+		Release|ARM64 = Release|ARM64
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Debug|ARM.ActiveCfg = Debug|ARM
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Debug|ARM.Build.0 = Debug|ARM
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Debug|ARM64.ActiveCfg = Debug|ARM64
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Debug|ARM64.Build.0 = Debug|ARM64
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Debug|x64.ActiveCfg = Debug|x64
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Debug|x64.Build.0 = Debug|x64
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Debug|x86.ActiveCfg = Debug|Win32
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Debug|x86.Build.0 = Debug|Win32
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Release|ARM.ActiveCfg = Release|ARM
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Release|ARM.Build.0 = Release|ARM
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Release|ARM64.ActiveCfg = Release|ARM64
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Release|ARM64.Build.0 = Release|ARM64
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Release|x64.ActiveCfg = Release|x64
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Release|x64.Build.0 = Release|x64
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Release|x86.ActiveCfg = Release|Win32
+		{89E9B32E-A86A-47C3-A948-D2B1622925CE}.Release|x86.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/VisualC-WinRT/SDL-UWP.vcxproj b/VisualC-WinRT/SDL-UWP.vcxproj
new file mode 100644
index 000000000000..a34357e73372
--- /dev/null
+++ b/VisualC-WinRT/SDL-UWP.vcxproj
@@ -0,0 +1,594 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|ARM64">
+      <Configuration>Debug</Configuration>
+      <Platform>ARM64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|ARM">
+      <Configuration>Debug</Configuration>
+      <Platform>ARM</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|ARM">
+      <Configuration>Release</Configuration>
+      <Platform>ARM</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|ARM64">
+      <Configuration>Release</Configuration>
+      <Platform>ARM64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\include\begin_code.h" />
+    <ClInclude Include="..\include\close_code.h" />
+    <ClInclude Include="..\include\SDL.h" />
+    <ClInclude Include="..\include\SDL_assert.h" />
+    <ClInclude Include="..\include\SDL_atomic.h" />
+    <ClInclude Include="..\include\SDL_audio.h" />
+    <ClInclude Include="..\include\SDL_blendmode.h" />
+    <ClInclude Include="..\include\SDL_clipboard.h" />
+    <ClInclude Include="..\include\SDL_config.h" />
+    <ClInclude Include="..\include\SDL_config_minimal.h" />
+    <ClInclude Include="..\include\SDL_config_winrt.h" />
+    <ClInclude Include="..\include\SDL_copying.h" />
+    <ClInclude Include="..\include\SDL_cpuinfo.h" />
+    <ClInclude Include="..\include\SDL_egl.h" />
+    <ClInclude Include="..\include\SDL_endian.h" />
+    <ClInclude Include="..\include\SDL_error.h" />
+    <ClInclude Include="..\include\SDL_events.h" />
+    <ClInclude Include="..\include\SDL_filesystem.h" />
+    <ClInclude Include="..\include\SDL_guid.h" />
+    <ClInclude Include="..\include\SDL_haptic.h" />
+    <ClInclude Include="..\include\SDL_hints.h" />
+    <ClInclude Include="..\include\SDL_hidapi.h" />
+    <ClInclude Include="..\include\SDL_input.h" />
+    <ClInclude Include="..\include\SDL_joystick.h" />
+    <ClInclude Include="..\include\SDL_keyboard.h" />
+    <ClInclude Include="..\include\SDL_keycode.h" />
+    <ClInclude Include="..\include\SDL_loadso.h" />
+    <ClInclude Include="..\include\SDL_locale.h" />
+    <ClInclude Include="..\include\SDL_log.h" />
+    <ClInclude Include="..\include\SDL_main.h" />
+    <ClInclude Include="..\include\SDL_misc.h" />
+    <ClInclude Include="..\include\SDL_mouse.h" />
+    <ClInclude Include="..\include\SDL_mutex.h" />
+    <ClInclude Include="..\include\SDL_name.h" />
+    <ClInclude Include="..\include\SDL_opengles2.h" />
+    <ClInclude Include="..\include\SDL_pixels.h" />
+    <ClInclude Include="..\include\SDL_platform.h" />
+    <ClInclude Include="..\include\SDL_power.h" />
+    <ClInclude Include="..\include\SDL_quit.h" />
+    <ClInclude Include="..\include\SDL_rect.h" />
+    <ClInclude Include="..\include\SDL_render.h" />
+    <ClInclude Include="..\include\SDL_revision.h" />
+    <ClInclude Include="..\include\SDL_rwops.h" />
+    <ClInclude Include="..\include\SDL_scancode.h" />
+    <ClInclude Include="..\include\SDL_sensor.h" />
+    <ClInclude Include="..\include\SDL_shape.h" />
+    <ClInclude Include="..\include\SDL_stdinc.h" />
+    <ClInclude Include="..\include\SDL_surface.h" />
+    <ClInclude Include="..\include\SDL_system.h" />
+    <ClInclude Include="..\include\SDL_syswm.h" />
+    <ClInclude Include="..\include\SDL_thread.h" />
+    <ClInclude Include="..\include\SDL_timer.h" />
+    <ClInclude Include="..\include\SDL_touch.h" />
+    <ClInclude Include="..\include\SDL_types.h" />
+    <ClInclude Include="..\include\SDL_version.h" />
+    <ClInclude Include="..\include\SDL_video.h" />
+    <ClInclude Include="..\src\audio\disk\SDL_diskaudio.h" />
+    <ClInclude Include="..\src\audio\dummy\SDL_dummyaudio.h" />
+    <ClInclude Include="..\src\audio\SDL_audiodev_c.h" />
+    <ClInclude Include="..\src\audio\SDL_audio_c.h" />
+    <ClInclude Include="..\src\audio\SDL_sysaudio.h" />
+    <ClInclude Include="..\src\audio\SDL_wave.h" />
+    <ClInclude Include="..\src\audio\wasapi\SDL_wasapi.h" />
+    <ClInclude Include="..\src\core\windows\SDL_directx.h" />
+    <ClInclude Include="..\src\core\windows\SDL_windows.h" />
+    <ClInclude Include="..\src\core\windows\SDL_xinput.h" />
+    <ClInclude Include="..\src\core\winrt\SDL_winrtapp_common.h" />
+    <ClInclude Include="..\src\core\winrt\SDL_winrtapp_direct3d.h" />
+    <ClInclude Include="..\src\core\winrt\SDL_winrtapp_xaml.h" />
+    <ClInclude Include="..\src\dynapi\SDL_dynapi.h" />
+    <ClInclude Include="..\src\dynapi\SDL_dynapi_overrides.h" />
+    <ClInclude Include="..\src\dynapi\SDL_dynapi_procs.h" />
+    <ClInclude Include="..\src\events\blank_cursor.h" />
+    <ClInclude Include="..\src\events\default_cursor.h" />
+    <ClInclude Include="..\src\events\SDL_clipboardevents_c.h" />
+    <ClInclude Include="..\src\events\SDL_displayevents_c.h" />
+    <ClInclude Include="..\src\events\SDL_dropevents_c.h" />
+    <ClInclude Include="..\src\events\SDL_events_c.h" />
+    <ClInclude Include="..\src\events\SDL_keyboard_c.h" />
+    <ClInclude Include="..\src\events\SDL_mouse_c.h" />
+    <ClInclude Include="..\src\events\SDL_touch_c.h" />
+    <ClInclude Include="..\src\events\SDL_windowevents_c.h" />
+    <ClInclude Include="..\src\haptic\SDL_haptic_c.h" />
+    <ClInclude Include="..\src\haptic\SDL_syshaptic.h" />
+    <ClInclude Include="..\src\haptic\windows\SDL_dinputhaptic_c.h" />
+    <ClInclude Include="..\src\haptic\windows\SDL_windowshaptic_c.h" />
+    <ClInclude Include="..\src\haptic\windows\SDL_xinputhaptic_c.h" />
+    <ClInclude Include="..\src\joystick\controller_type.h" />
+    <ClInclude Include="..\src\joystick\SDL_gamecontrollerdb.h" />
+    <ClInclude Include="..\src\joystick\SDL_joystick_c.h" />
+    <ClInclude Include="..\src\joystick\SDL_sysjoystick.h" />
+    <ClInclude Include="..\src\joystick\virtual\SDL_virtualjoystick_c.h" />
+    <ClInclude Include="..\src\joystick\windows\SDL_dinputjoystick_c.h" />
+    <ClInclude Include="..\src\joystick\windows\SDL_windowsjoystick_c.h" />
+    <ClInclude Include="..\src\joystick\windows\SDL_xinputjoystick_c.h" />
+    <ClInclude Include="..\src\locale\SDL_syslocale.h" />
+    <ClInclude Include="..\src\render\direct3d11\SDL_render_winrt.h" />
+    <ClInclude Include="..\src\render\direct3d11\SDL_shaders_d3d11.h" />
+    <ClInclude Include="..\src\render\opengles2\SDL_gles2funcs.h" />
+    <ClInclude Include="..\src\render\opengles2\SDL_shaders_gles2.h" />
+    <ClInclude Include="..\src\render\SDL_d3dmath.h" />
+    <ClInclude Include="..\src\render\SDL_sysrender.h" />
+    <ClInclude Include="..\src\render\SDL_yuv_sw_c.h" />
+    <ClInclude Include="..\src\render\software\SDL_blendfillrect.h" />
+    <ClInclude Include="..\src\render\software\SDL_blendline.h" />
+    <ClInclude Include="..\src\render\software\SDL_blendpoint.h" />
+    <ClInclude Include="..\src\render\software\SDL_draw.h" />
+    <ClInclude Include="..\src\render\software\SDL_drawline.h" />
+    <ClInclude Include="..\src\render\software\SDL_drawpoint.h" />
+    <ClInclude Include="..\src\render\software\SDL_render_sw_c.h" />
+    <ClInclude Include="..\src\render\software\SDL_rotate.h" />
+    <ClInclude Include="..\src\render\software\SDL_triangle.h" />
+    <ClInclude Include="..\src\SDL_assert_c.h" />
+    <ClInclude Include="..\src\SDL_dataqueue.h" />
+    <ClInclude Include="..\src\SDL_error_c.h" />
+    <ClInclude Include="..\src\SDL_fatal.h" />
+    <ClInclude Include="..\src\SDL_hints_c.h" />
+    <ClInclude Include="..\src\SDL_internal.h" />
+    <ClInclude Include="..\src\SDL_list.h" />
+    <ClInclude Include="..\src\SDL_log_c.h" />
+    <ClInclude Include="..\src\sensor\dummy\SDL_dummysensor.h" />
+    <ClInclude Inc

(Patch may be truncated, please check the link at the top of this post.)