[ITP] SDL3

Takashi Yano via Cygwin-apps <[email protected]>
Newsgroups gmane.os.cygwin.applications
Message-ID <[email protected]>
Now, SDL2 is not recommended and suggested to use SDL3
with sdl2-compat.

-- 
Takashi Yano <[email protected]>
SDL3.cygport (text/plain, 1.7 KB)
NAME="SDL3"
VERSION=3.2.20
RELEASE=1
LICENSE="Zlib"
CATEGORY="Libs"
SUMMARY="Simple DirectMedia Layer core library"
DESCRIPTION="This is the Simple DirectMedia Layer, a general API that provides
low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL,
and 2D framebuffer across multiple platforms."
HOMEPAGE="http://www.libsdl.org/"
SRC_URI="https://github.com/libsdl-org/SDL/releases/download/release-${VERSION}/SDL3-${VERSION}.tar.gz"

inherit cmake

PKG_NAMES="libSDL3_0 libSDL3-devel"
libSDL3_0_REQUIRES="libdbus1_3 libGL1 libsamplerate0 libX11_6 libXcursor1 libXext6 libXi6 libXinerama1 libXrandr2 libXss1" # libaudio2 libpulse-simple0
libSDL3_0_CONTENTS="usr/bin/cygSDL3-0.dll usr/share/doc/ usr/share/licenses/"
libSDL3_devel_CONTENTS="usr/include/ usr/lib/"

DISTCLEANFILES="acinclude/l*.m4"
DIFF_EXCLUDES="SDL_config.h"

CYGCMAKE_ARGS="
	-DSDL_JACK=OFF
	-DSDL_SNDIO=OFF
"

ACLOCAL_FLAGS="-I acinclude"
NO_AUTOHEADER=1
CYGCONF_ARGS="
	--enable-pthreads
	--enable-pthread-sem

	--disable-arts
	--disable-arts-shared
	--enable-esd
	--enable-esd-shared
	--enable-nas
	--enable-nas-shared
	--enable-oss
	--enable-pulseaudio
	--enable-pulseaudio-shared
	--enable-libsamplerate
	--enable-libsamplerate-shared

	--enable-video-dummy
	--enable-video-opengl
	--enable-video-opengles
	--enable-video-x11
	--enable-video-x11-scrnsaver
	--enable-video-x11-xcursor
	--enable-video-x11-xinput
	--enable-video-x11-xrandr
	--enable-video-x11-xshape
	--enable-x11-shared

	--enable-xinput
	--enable-render-d3d

	--disable-jack
	--disable-sndio
"

DOCS="README-SDL.txt README-porting.txt"

BUILD_REQUIRES="libX11-devel libGL-devel libEGL-devel libsamplerate-devel libesd-devel nas"
SDL3-3.2.20-1.src.patch (text/plain, 22.4 KB)
--- origsrc/SDL3-3.2.20/CMakeLists.txt	2025-08-05 01:58:55.000000000 +0900
+++ src/SDL3-3.2.20/CMakeLists.txt	2025-08-26 14:36:35.689597000 +0900
@@ -367,9 +367,9 @@ dep_option(SDL_WAYLAND_LIBDECOR_SHARED
 dep_option(SDL_RPI                 "Use Raspberry Pi video driver" ON "SDL_VIDEO;UNIX_SYS;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF)
 dep_option(SDL_ROCKCHIP            "Use ROCKCHIP Hardware Acceleration video driver" ON "SDL_VIDEO;UNIX_SYS;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF)
 dep_option(SDL_COCOA               "Use Cocoa video driver" ON "APPLE" OFF)
-dep_option(SDL_DIRECTX             "Use DirectX for Windows audio/video" ON "SDL_AUDIO OR SDL_VIDEO;WINDOWS" OFF)
-dep_option(SDL_XINPUT              "Use Xinput for Windows" ON "WINDOWS" OFF)
-dep_option(SDL_WASAPI              "Use the Windows WASAPI audio driver" ON "WINDOWS;SDL_AUDIO" OFF)
+dep_option(SDL_DIRECTX             "Use DirectX for Windows audio/video" ON "SDL_AUDIO OR SDL_VIDEO;WINDOWS OR CYGWIN" OFF)
+dep_option(SDL_XINPUT              "Use Xinput for Windows" ON "WINDOWS OR CYGWIN" OFF)
+dep_option(SDL_WASAPI              "Use the Windows WASAPI audio driver" ON "SDL_AUDIO" OFF)
 dep_option(SDL_RENDER_D3D          "Enable the Direct3D 9 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF)
 dep_option(SDL_RENDER_D3D11        "Enable the Direct3D 11 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF)
 dep_option(SDL_RENDER_D3D12        "Enable the Direct3D 12 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF)
@@ -480,7 +480,7 @@ else()
   endif()
 endif()
 
-if(CYGWIN)
+if(FALSE AND CYGWIN)
   # We build SDL on cygwin without the UNIX emulation layer
   sdl_include_directories(PUBLIC SYSTEM "/usr/include/mingw")
   cmake_push_check_state()
@@ -1262,7 +1262,7 @@ if(SDL_CAMERA)
   #endif()
 endif()
 
-if(UNIX OR APPLE)
+if(UNIX OR APPLE OR CYGWIN)
   # Relevant for Unix/Darwin only
   set(DYNAPI_NEEDS_DLOPEN 1)
   CheckDLOPEN()
@@ -1273,7 +1273,7 @@ if(UNIX OR APPLE)
   endif()
 endif()
 
-if(UNIX OR APPLE OR HAIKU OR RISCOS)
+if(UNIX OR APPLE OR HAIKU OR RISCOS OR CYGWIN)
   CheckO_CLOEXEC()
 endif()
 
@@ -1567,7 +1567,7 @@ elseif(EMSCRIPTEN)
   CheckPTHREAD()
   CheckLibUnwind()
 
-elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
+elseif((UNIX OR CYGWIN) AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
   if(SDL_AUDIO)
     if(NETBSD)
         set(SDL_AUDIO_DRIVER_NETBSD 1)
@@ -1609,7 +1609,7 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS
     set(HAVE_SDL_TRAY TRUE)
   endif()
 
-  if(UNIX)
+  if(UNIX OR CYGWIN)
     sdl_glob_sources("${SDL3_SOURCE_DIR}/src/core/unix/*.c")
 
     check_c_source_compiles("
@@ -1901,6 +1901,136 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS
     set (HAVE_VSNPRINTF 0)
     set (USE_POSIX_SPAWN 1)
   endif()
+
+  if (CYGWIN)
+    check_c_source_compiles("
+      #include <windows.h>
+      int main(int argc, char **argv) { return 0; }" HAVE_WIN32_CC)
+    sdl_glob_sources("${SDL3_SOURCE_DIR}/src/core/windows/*.c")
+    sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/windows/*.c")
+    sdl_link_dependency(base LIBS kernel32 user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32 dxguid)
+  endif()
+
+  if(CYGWIN AND SDL_DIRECTX)
+    cmake_push_check_state()
+
+    #check_include_file(d3d9.h HAVE_D3D9_H)
+    #check_include_file(d3d11_1.h HAVE_D3D11_H)
+    #check_include_file(ddraw.h HAVE_DDRAW_H)
+    #check_include_file(dsound.h HAVE_DSOUND_H)
+    #check_include_file(dinput.h HAVE_DINPUT_H)
+    set(HAVE_D3D9_H TRUE)
+    set(HAVE_D3D11_H TRUE)
+    set(HAVE_DDRAW_H TRUE)
+    set(HAVE_DSOUND_H TRUE)
+    set(HAVE_DINPUT_H TRUE)
+    if(SDL_CPU_ARM32)  # !!! FIXME: this should probably check if we're !(x86 or x86-64) instead of arm.
+      set(HAVE_DINPUT_H 0)
+    endif()
+    check_include_file(dxgi.h HAVE_DXGI_H)
+    cmake_pop_check_state()
+    if(HAVE_D3D9_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H)
+      set(HAVE_DIRECTX TRUE)
+      if(NOT MINGW AND NOT CYGWIN AND NOT USE_WINSDK_DIRECTX)
+        if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+          set(PROCESSOR_ARCH "x64")
+        else()
+          set(PROCESSOR_ARCH "x86")
+        endif()
+        sdl_link_directories("$<BUILD_INTERFACE:$$ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH}>")
+        sdl_include_directories(PRIVATE SYSTEM "$<BUILD_INTERFACE:$ENV{DXSDK_DIR}\\Include>")
+      endif()
+    endif()
+  endif()
+
+  if(CYGWIN AND SDL_XINPUT)
+    # xinput.h may need windows.h, but does not include it itself.
+    check_c_source_compiles("
+      #include <windows.h>
+      #include <xinput.h>
+      int main(int argc, char **argv) { return 0; }" HAVE_XINPUT_H)
+  endif()
+
+  if(CYGWIN AND SDL_VIDEO)
+    set(SDL_VIDEO_DRIVER_WINDOWS 1)
+    sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/windows/*.c")
+
+    CheckOpenVR()
+
+    if(SDL_RENDER_D3D AND HAVE_D3D9_H)
+      set(SDL_VIDEO_RENDER_D3D 1)
+      set(HAVE_RENDER_D3D TRUE)
+    endif()
+    if(SDL_RENDER_D3D11 AND HAVE_D3D11_H)
+      set(SDL_VIDEO_RENDER_D3D11 1)
+      set(HAVE_RENDER_D3D11 TRUE)
+    endif()
+    if(SDL_RENDER_D3D12)
+      set(SDL_VIDEO_RENDER_D3D12 1)
+      set(HAVE_RENDER_D3D12 TRUE)
+    endif()
+    set(HAVE_SDL_VIDEO TRUE)
+  endif()
+
+  if(CYGWIN AND SDL_VIDEO)
+    if(SDL_OPENGL)
+      set(SDL_VIDEO_OPENGL 1)
+      set(SDL_VIDEO_OPENGL_WGL 1)
+      set(SDL_VIDEO_RENDER_OGL 1)
+      set(HAVE_OPENGL TRUE)
+    endif()
+
+    if(SDL_OPENGLES)
+      set(SDL_VIDEO_OPENGL_EGL 1)
+      set(SDL_VIDEO_OPENGL_ES2 1)
+      set(SDL_VIDEO_RENDER_OGL_ES2 1)
+      set(HAVE_OPENGLES TRUE)
+    endif()
+
+    if(SDL_VULKAN)
+      set(SDL_VIDEO_VULKAN 1)
+      set(HAVE_VULKAN TRUE)
+      if(SDL_RENDER_VULKAN)
+        set(SDL_VIDEO_RENDER_VULKAN 1)
+        set(HAVE_RENDER_VULKAN TRUE)
+      endif()
+    endif()
+  endif()
+
+  if(CYGWIN AND SDL_HIDAPI)
+    CheckHIDAPI()
+  endif()
+
+  if(CYGWIN AND SDL_JOYSTICK)
+    sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/windows/*.c")
+
+    set(SDL_JOYSTICK_RAWINPUT 1)
+    if(HAVE_DINPUT_H)
+      set(SDL_JOYSTICK_DINPUT 1)
+      sdl_link_dependency(joystick LIBS dinput8)
+    endif()
+    if(HAVE_XINPUT_H)
+      set(SDL_JOYSTICK_XINPUT 1)
+      set(HAVE_XINPUT TRUE)
+    endif()
+    if(HAVE_WINDOWS_GAMING_INPUT_H)
+      set(SDL_JOYSTICK_WGI 1)
+    endif()
+    if(HAVE_GAMEINPUT_H)
+      sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/gdk/*.c")
+      set(SDL_JOYSTICK_GAMEINPUT 1)
+    endif()
+    set(HAVE_SDL_JOYSTICK TRUE)
+
+    if(SDL_HAPTIC)
+      if(HAVE_DINPUT_H)
+        sdl_glob_sources("${SDL3_SOURCE_DIR}/src/haptic/windows/*.c")
+        set(SDL_HAPTIC_DINPUT 1)
+        set(HAVE_SDL_HAPTIC TRUE)
+      endif()
+    endif()
+  endif()
+
 elseif(WINDOWS)
   check_c_source_compiles("
     #include <windows.h>
@@ -1930,7 +2060,7 @@ elseif(WINDOWS)
     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
         set(USE_WINSDK_DIRECTX TRUE)
     endif()
-    if(NOT MINGW AND NOT USE_WINSDK_DIRECTX)
+    if(NOT MINGW AND NOT CYGWIN AND NOT USE_WINSDK_DIRECTX)
       if("$ENV{DXSDK_DIR}" STREQUAL "")
         message(FATAL_ERROR "DIRECTX requires the \$DXSDK_DIR environment variable to be set")
       endif()
@@ -1949,7 +2079,7 @@ elseif(WINDOWS)
     cmake_pop_check_state()
     if(HAVE_D3D9_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H)
       set(HAVE_DIRECTX TRUE)
-      if(NOT MINGW AND NOT USE_WINSDK_DIRECTX)
+      if(NOT MINGW AND NOT CYGWIN AND NOT USE_WINSDK_DIRECTX)
         if(CMAKE_SIZEOF_VOID_P EQUAL 8)
           set(PROCESSOR_ARCH "x64")
         else()
@@ -2943,7 +3073,7 @@ if (SDL_DIALOG)
   if(ANDROID)
     sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/android/SDL_androiddialog.c)
     set(HAVE_SDL_DIALOG TRUE)
-  elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
+  elseif((UNIX OR CYGWIN) AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
     sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_unixdialog.c)
     sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_portaldialog.c)
     sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_zenitydialog.c)
@@ -2961,7 +3091,7 @@ if (SDL_DIALOG)
 endif()
 
 sdl_sources("${SDL3_SOURCE_DIR}/src/process/SDL_process.c")
-if(WINDOWS)
+if(WINDOWS AND NOT CYGWIN)
   sdl_glob_sources("${SDL3_SOURCE_DIR}/src/process/windows/*.c")
   set(SDL_PROCESS_WINDOWS 1)
   set(HAVE_SDL_PROCESS TRUE)
--- origsrc/SDL3-3.2.20/cmake/sdlchecks.cmake	2025-06-27 07:43:29.000000000 +0900
+++ src/SDL3-3.2.20/cmake/sdlchecks.cmake	2025-08-25 15:51:53.858383400 +0900
@@ -22,6 +22,35 @@ macro(FindLibraryAndSONAME _LIB)
 
     if(APPLE)
       string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*dylib$" "\\1.dylib" _LIB_REGEXD "${_LIB_JUSTNAME}")
+    elseif(CYGWIN)
+      set(_LIB_LIBDIR "/usr/bin")
+      string(REGEX MATCH "libpulse\\.dll\\.a" LIBPULSE ${_LIB_JUSTNAME})
+      string(REGEX MATCH "libX11\\.dll\\.a" LIBX11 ${_LIB_JUSTNAME})
+      string(REGEX MATCH "libXext\\.dll\\.a" LIBXEXT ${_LIB_JUSTNAME})
+      string(REGEX MATCH "libXcursor\\.dll\\.a" LIBXCURSOR ${_LIB_JUSTNAME})
+      string(REGEX MATCH "libXi\\.dll\\.a" LIBXI ${_LIB_JUSTNAME})
+      string(REGEX MATCH "libXfixes\\.dll\\.a" LIBXFIXES ${_LIB_JUSTNAME})
+      string(REGEX MATCH "libXrandr\\.dll\\.a" LIBXRANDR ${_LIB_JUSTNAME})
+      string(REGEX MATCH "libXrender\\.dll\\.a" LIBXRENDER ${_LIB_JUSTNAME})
+      if(LIBPULSE)
+        set(_LIB_REGEXD "cygpulse-0.dll")
+      elseif(LIBX11)
+        set(_LIB_REGEXD "cygX11-6.dll")
+      elseif(LIBXEXT)
+        set(_LIB_REGEXD "cygXext-6.dll")
+      elseif(LIBXCURSOR)
+        set(_LIB_REGEXD "cygXcursor-1.dll")
+      elseif(LIBXI)
+        set(_LIB_REGEXD "cygXi-6.dll")
+      elseif(LIBXFIXES)
+        set(_LIB_REGEXD "cygXfixes-3.dll")
+      elseif(LIBXRANDR)
+        set(_LIB_REGEXD "cygXrandr-2.dll")
+      elseif(LIBXRENDER)
+        set(_LIB_REGEXD "cygXrender-1.dll")
+      else()
+        message(FATAL_ERROR "Please fix sdlchecks.cmake: " ${_LIB_JUSTNAME})
+      endif()
     else()
       string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*$" "\\1" _LIB_REGEXD "${_LIB_JUSTNAME}")
     endif()
--- origsrc/SDL3-3.2.20/include/SDL3/SDL_platform_defines.h	2025-02-05 06:57:41.000000000 +0900
+++ src/SDL3-3.2.20/include/SDL3/SDL_platform_defines.h	2025-08-25 15:51:53.862384700 +0900
@@ -112,8 +112,7 @@
 #undef SDL_PLATFORM_LINUX
 #endif
 
-#if defined(__unix__) || defined(__unix) || defined(unix)
-
+#if defined(__unix__) || defined(__unix) || defined(unix) || defined(__CYGWIN__)
 /**
  * A preprocessor macro that is only defined if compiling for a Unix-like
  * system.
@@ -317,7 +316,7 @@
 #define SDL_PLATFORM_CYGWIN 1
 #endif
 
-#if defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN)
+#if defined(_WIN32)
 
 /**
  * A preprocessor macro that is only defined if compiling for Windows.
--- origsrc/SDL3-3.2.20/include/SDL3/SDL_system.h	2025-01-22 03:12:25.000000000 +0900
+++ src/SDL3-3.2.20/include/SDL3/SDL_system.h	2025-08-25 15:51:53.865394400 +0900
@@ -49,7 +49,7 @@ extern "C" {
 /*
  * Platform specific functions for Windows
  */
-#if defined(SDL_PLATFORM_WINDOWS)
+#if defined(SDL_PLATFORM_WINDOWS) || defined(SDL_PLATFORM_CYGWIN)
 
 typedef struct tagMSG MSG;
 
--- origsrc/SDL3-3.2.20/src/SDL.c	2025-07-12 23:48:56.000000000 +0900
+++ src/SDL3-3.2.20/src/SDL.c	2025-08-25 15:51:53.869395100 +0900
@@ -65,7 +65,7 @@
 
 // Initialization/Cleanup routines
 #include "timer/SDL_timer_c.h"
-#ifdef SDL_PLATFORM_WINDOWS
+#if defined(SDL_PLATFORM_WINDOWS) || defined(SDL_PLATFORM_CYGWIN)
 extern bool SDL_HelperWindowCreate(void);
 extern void SDL_HelperWindowDestroy(void);
 #endif
@@ -317,7 +317,7 @@ bool SDL_InitSubSystem(SDL_InitFlags fla
     SDL_DBus_Init();
 #endif
 
-#ifdef SDL_PLATFORM_WINDOWS
+#if defined(SDL_PLATFORM_WINDOWS) || defined(SDL_PLATFORM_CYGWIN)
     if (flags & (SDL_INIT_HAPTIC | SDL_INIT_JOYSTICK)) {
         if (!SDL_HelperWindowCreate()) {
             goto quit_and_error;
@@ -653,7 +653,7 @@ void SDL_Quit(void)
     SDL_bInMainQuit = true;
 
     // Quit all subsystems
-#ifdef SDL_PLATFORM_WINDOWS
+#if defined(SDL_PLATFORM_WINDOWS) || defined(SDL_PLATFORM_CYGWIN)
     SDL_HelperWindowDestroy();
 #endif
     SDL_QuitSubSystem(SDL_INIT_EVERYTHING);
--- origsrc/SDL3-3.2.20/src/audio/dsp/SDL_dspaudio.c	2025-02-15 07:16:10.000000000 +0900
+++ src/SDL3-3.2.20/src/audio/dsp/SDL_dspaudio.c	2025-08-25 15:51:53.873386600 +0900
@@ -166,7 +166,11 @@ static bool DSP_OpenDevice(SDL_AudioDevi
     while ((0x01U << frag_spec) < device->buffer_size) {
         frag_spec++;
     }
+#ifdef __CYGWIN__
+    frag_spec |= 0x00040000; // four fragments for cygwin to avoid choppy sound
+#else
     frag_spec |= 0x00020000; // two fragments, for low latency
+#endif
 
     // Set the audio buffering parameters
 #ifdef DEBUG_AUDIO
--- origsrc/SDL3-3.2.20/src/core/SDL_core_unsupported.c	2025-02-04 10:03:26.000000000 +0900
+++ src/SDL3-3.2.20/src/core/SDL_core_unsupported.c	2025-08-25 15:51:53.876396700 +0900
@@ -76,7 +76,7 @@ void SDL_GDKResumeGPU(SDL_GPUDevice *dev
 
 #endif
 
-#if !defined(SDL_PLATFORM_WINDOWS)
+#if !defined(SDL_PLATFORM_WINDOWS) && !defined(SDL_PLATFORM_CYGWIN)
 
 SDL_DECLSPEC bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst);
 bool SDL_RegisterApp(const char *name, Uint32 style, void *hInst)
--- origsrc/SDL3-3.2.20/src/core/windows/SDL_windows.c	2025-07-12 23:48:56.000000000 +0900
+++ src/SDL3-3.2.20/src/core/windows/SDL_windows.c	2025-08-25 15:51:53.880397700 +0900
@@ -20,7 +20,7 @@
 */
 #include "SDL_internal.h"
 
-#if defined(SDL_PLATFORM_WINDOWS)
+#if defined(SDL_PLATFORM_WINDOWS) || defined(SDL_PLATFORM_CYGWIN)
 
 #include "SDL_windows.h"
 
--- origsrc/SDL3-3.2.20/src/core/windows/SDL_windows.h	2025-03-20 13:23:06.000000000 +0900
+++ src/SDL3-3.2.20/src/core/windows/SDL_windows.h	2025-08-25 15:51:53.884398500 +0900
@@ -74,6 +74,24 @@
 #undef _WIN32_WINNT
 #define _WIN32_WINNT 0xA00
 #define WINVER       _WIN32_WINNT
+
+#elif defined(SDL_PLATFORM_CYGWIN)
+#ifndef STRICT
+#define STRICT 1
+#endif
+#ifndef UNICODE
+#define UNICODE 1
+#endif
+#undef WINVER
+#undef _WIN32_WINNT
+#if defined(SDL_VIDEO_RENDER_D3D12) || defined(HAVE_DXGI1_6_H)
+#define _WIN32_WINNT 0xA00 // For D3D12, 0xA00 is required
+#elif defined(HAVE_SHELLSCALINGAPI_H)
+#define _WIN32_WINNT 0x603 // For DPI support
+#else
+#define _WIN32_WINNT 0x501 // Need 0x410 for AlphaBlend() and 0x500 for EnumDisplayDevices(), 0x501 for raw input
+#endif
+#define WINVER _WIN32_WINNT
 #endif
 
 // See https://github.com/libsdl-org/SDL/pull/7607
@@ -92,6 +110,10 @@
 #include <windows.h>
 #include <basetyps.h> // for REFIID with broken mingw.org headers
 #include <mmreg.h>
+#ifdef __CYGWIN__
+#define SDL_WINAPI_FAMILY_PHONE 0
+#define IUnknown_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#endif
 
 // Routines to convert from UTF8 to native Windows text
 #define WIN_StringToUTF8W(S) SDL_iconv_string("UTF-8", "UTF-16LE", (const char *)(S), (SDL_wcslen(S) + 1) * sizeof(WCHAR))
--- origsrc/SDL3-3.2.20/src/dynapi/SDL_dynapi.c	2025-02-07 02:46:15.000000000 +0900
+++ src/SDL3-3.2.20/src/dynapi/SDL_dynapi.c	2025-08-25 15:51:53.887399000 +0900
@@ -510,7 +510,7 @@ extern SDL_NORETURN void SDL_ExitProcess
 static void SDL_InitDynamicAPILocked(void)
 {
     // this can't use SDL_getenv_unsafe_REAL, because it might allocate memory before the app can set their allocator.
-#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__)
+#if defined(WIN32) || defined(_WIN32)
     // We've always used LoadLibraryA for this, so this has never worked with Unicode paths on Windows. Sorry.
     char envbuf[512];  // overflows will just report as environment variable being unset, but LoadLibraryA has a MAX_PATH of 260 anyhow, apparently.
     const DWORD rc = GetEnvironmentVariableA(SDL_DYNAMIC_API_ENVVAR, envbuf, (DWORD) sizeof (envbuf));
--- origsrc/SDL3-3.2.20/src/dynapi/SDL_dynapi_unsupported.h	2025-01-02 00:45:52.000000000 +0900
+++ src/SDL3-3.2.20/src/dynapi/SDL_dynapi_unsupported.h	2025-08-25 15:51:53.891400100 +0900
@@ -23,7 +23,7 @@
 #define SDL_dynapi_unsupported_h_
 
 
-#if !defined(SDL_PLATFORM_WINDOWS)
+#if !defined(SDL_PLATFORM_WINDOWS) && !defined(SDL_PLATFORM_CYGWIN)
 typedef struct ID3D12Device ID3D12Device;
 typedef void *SDL_WindowsMessageHook;
 #endif
--- origsrc/SDL3-3.2.20/src/joystick/windows/SDL_dinputjoystick.c	2025-07-12 23:48:56.000000000 +0900
+++ src/SDL3-3.2.20/src/joystick/windows/SDL_dinputjoystick.c	2025-08-26 12:09:01.045765300 +0900
@@ -376,6 +376,8 @@ DIEFFECT *CreateRumbleEffectData(Sint16
         FreeRumbleEffectData(effect);
         return NULL;
     }
+    effect->rgdwAxes[0] = DIJOFS_X;
+    effect->rgdwAxes[1] = DIJOFS_Y;
 
     effect->rglDirection = (LONG *)SDL_calloc(effect->cAxes, sizeof(LONG));
     if (!effect->rglDirection) {
@@ -913,26 +915,29 @@ bool SDL_DINPUT_JoystickRumble(SDL_Joyst
         return SDL_Unsupported();
     }
 
-    if (joystick->hwdata->ff_initialized) {
+    if (!joystick->hwdata->ff_initialized) {
+        if (!SDL_DINPUT_JoystickInitRumble(joystick, magnitude)) {
+            return false;
+        }
+        joystick->hwdata->ff_initialized = true;
+    }
+    do {
         DIPERIODIC *periodic = ((DIPERIODIC *)joystick->hwdata->ffeffect->lpvTypeSpecificParams);
         periodic->dwMagnitude = CONVERT_MAGNITUDE(magnitude);
+        joystick->hwdata->ffeffect->rglDirection[0] = low_frequency_rumble;
+        joystick->hwdata->ffeffect->rglDirection[1] = high_frequency_rumble;
 
-        result = IDirectInputEffect_SetParameters(joystick->hwdata->ffeffect_ref, joystick->hwdata->ffeffect, (DIEP_DURATION | DIEP_TYPESPECIFICPARAMS));
+        result = IDirectInputEffect_SetParameters(joystick->hwdata->ffeffect_ref, joystick->hwdata->ffeffect, (DIEP_DURATION | DIEP_DIRECTION | DIEP_TYPESPECIFICPARAMS));
         if (result == DIERR_INPUTLOST) {
             result = IDirectInputDevice8_Acquire(joystick->hwdata->InputDevice);
             if (SUCCEEDED(result)) {
-                result = IDirectInputEffect_SetParameters(joystick->hwdata->ffeffect_ref, joystick->hwdata->ffeffect, (DIEP_DURATION | DIEP_TYPESPECIFICPARAMS));
+                result = IDirectInputEffect_SetParameters(joystick->hwdata->ffeffect_ref, joystick->hwdata->ffeffect, (DIEP_DURATION | DIEP_DIRECTION | DIEP_TYPESPECIFICPARAMS));
             }
         }
         if (FAILED(result)) {
             return SetDIerror("IDirectInputDevice8::SetParameters", result);
         }
-    } else {
-        if (!SDL_DINPUT_JoystickInitRumble(joystick, magnitude)) {
-            return false;
-        }
-        joystick->hwdata->ff_initialized = true;
-    }
+    } while (false);
 
     result = IDirectInputEffect_Start(joystick->hwdata->ffeffect_ref, 1, 0);
     if (result == DIERR_INPUTLOST || result == DIERR_NOTEXCLUSIVEACQUIRED) {
--- origsrc/SDL3-3.2.20/src/joystick/windows/SDL_windowsjoystick.c	2025-01-03 03:25:18.000000000 +0900
+++ src/SDL3-3.2.20/src/joystick/windows/SDL_windowsjoystick.c	2025-08-25 15:51:53.895401300 +0900
@@ -54,10 +54,14 @@
 
 // local variables
 static bool s_bJoystickThread = false;
+#ifndef __CYGWIN__
 static SDL_Condition *s_condJoystickThread = NULL;
+#endif
 static SDL_Mutex *s_mutexJoyStickEnum = NULL;
+#ifndef __CYGWIN__
 static SDL_Thread *s_joystickThread = NULL;
 static bool s_bJoystickThreadQuit = false;
+#endif
 static Uint64 s_lastDeviceChange = 0;
 static GUID GUID_DEVINTERFACE_HID = { 0x4D1E55B2L, 0xF16F, 0x11CF, { 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } };
 
@@ -190,6 +194,7 @@ static bool SDL_CreateDeviceNotification
     return true;
 }
 
+#ifndef __CYGWIN__
 static bool SDL_WaitForDeviceNotification(SDL_DeviceNotificationData *data, SDL_Mutex *mutex)
 {
     MSG msg;
@@ -210,6 +215,7 @@ static bool SDL_WaitForDeviceNotificatio
     SDL_LockMutex(mutex);
     return (lastret != -1);
 }
+#endif
 
 #endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
 
@@ -217,6 +223,7 @@ static bool SDL_WaitForDeviceNotificatio
 static SDL_DeviceNotificationData s_notification_data;
 #endif
 
+#ifndef __CYGWIN__
 // Function/thread to scan the system for joysticks.
 static int SDLCALL SDL_JoystickThread(void *_data)
 {
@@ -269,10 +276,12 @@ static int SDLCALL SDL_JoystickThread(vo
 
     return 1;
 }
+#endif
 
 // spin up the thread to detect hotplug of devices
 static bool SDL_StartJoystickThread(void)
 {
+#ifndef __CYGWIN__
     s_mutexJoyStickEnum = SDL_CreateMutex();
     if (!s_mutexJoyStickEnum) {
         return false;
@@ -288,11 +297,13 @@ static bool SDL_StartJoystickThread(void
     if (!s_joystickThread) {
         return false;
     }
+#endif
     return true;
 }
 
 static void SDL_StopJoystickThread(void)
 {
+#ifndef __CYGWIN__
     if (!s_joystickThread) {
         return;
     }
@@ -316,6 +327,7 @@ static void SDL_StopJoystickThread(void)
     s_mutexJoyStickEnum = NULL;
 
     s_joystickThread = NULL;
+#endif
 }
 
 void WINDOWS_AddJoystickDevice(JoyStick_DeviceData *device)
--- origsrc/SDL3-3.2.20/src/render/direct3d11/SDL_render_d3d11.c	2025-03-06 15:39:31.000000000 +0900
+++ src/SDL3-3.2.20/src/render/direct3d11/SDL_render_d3d11.c	2025-08-25 15:51:53.899402300 +0900
@@ -18,6 +18,10 @@
      misrepresented as being the original software.
   3. This notice may not be removed or altered from any source distribution.
 */
+#ifdef __CYGWIN__
+#define MESA_EGL_NO_X11_HEADERS
+#endif
+
 #include "SDL_internal.h"
 
 #ifdef SDL_VIDEO_RENDER_D3D11
@@ -921,7 +925,7 @@ static HRESULT D3D11_CreateSwapChain(SDL
             goto done;
         }
     } else {
-#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK)
+#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN)
         HWND hwnd = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(renderer->window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL);
         if (!hwnd) {
             SDL_SetError("Couldn't get window handle");
--- origsrc/SDL3-3.2.20/src/video/directx/d3d12.h	2024-08-30 09:33:52.000000000 +0900
+++ src/SDL3-3.2.20/src/video/directx/d3d12.h	2025-08-25 15:51:53.908403900 +0900
@@ -11,7 +11,9 @@
 
  /* File created by MIDL compiler version 8.01.0628 */
 
-
+#ifdef __CYGWIN__
+#define _WIN32
+#endif
 
 /* verify that the <rpcndr.h> version is high enough to compile this file*/
 #ifndef __REQUIRED_RPCNDR_H_VERSION__
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.