From d18d0b4a12da3187a4010546b5f77affa6333fa7 Mon Sep 17 00:00:00 2001 From: suve Date: Fri, 27 Aug 2021 13:39:06 +0200 Subject: [PATCH 1/5] Fix TSDL_SysWMmsg definition --- sdlsyswm.inc | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/sdlsyswm.inc b/sdlsyswm.inc index 28a9ca02..6ca065e7 100644 --- a/sdlsyswm.inc +++ b/sdlsyswm.inc @@ -87,23 +87,26 @@ Type PSDL_SysWMmsg = ^TSDL_SysWMmsg; TSDL_SysWMmsg = record version: TSDL_version; - subsystem: TSDL_SYSWM_TYPE; - {$IFDEF SDL_VIDEO_DRIVER_WINDOWS} - win: __SYSWM_WINDOWS; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_X11} - x11: __SYSWM_X11; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_DIRECTFB} - dfb: __SYSWM_DIRECTFB; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_COCOA} - cocoa: __SYSWM_COCOA; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_UIKIT} - uikit: __SYSWM_UIKIT; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_VIVANTE} - vivante: __SYSWM_VIVANTE; - {$ELSE} - (* Cannot have empty record case *) - dummy: integer; - {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} + case subsystem: TSDL_SYSWM_TYPE of + {$IFDEF SDL_VIDEO_DRIVER_WINDOWS} + SDL_SYSWM_WINDOWS: (win: __SYSWM_WINDOWS); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_X11} + SDL_SYSWM_X11: (x11: __SYSWM_X11); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_DIRECTFB} + SDL_SYSWM_DIRECTFB: (dfb: __SYSWM_DIRECTFB); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_COCOA} + SDL_SYSWM_COCOA: (cocoa: __SYSWM_COCOA); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_UIKIT} + SDL_SYSWM_UIKIT: (uikit: __SYSWM_UIKIT); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_VIVANTE} + SDL_SYSWM_VIVANTE: (vivante: __SYSWM_VIVANTE); + {$ENDIF} + SDL_SYSWM_UNKNOWN: (dummy: integer); end; /// Once again, sdl_syswm.h uses anonymous structs, declared right in SDL_SysWMinfo. From 5babee3ab86629c80fb1fc7279703a5e12141ef9 Mon Sep 17 00:00:00 2001 From: suve Date: Fri, 27 Aug 2021 13:44:04 +0200 Subject: [PATCH 2/5] Fix TSDL_SysWMinfo definition --- sdlsyswm.inc | 58 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/sdlsyswm.inc b/sdlsyswm.inc index 6ca065e7..39e582c8 100644 --- a/sdlsyswm.inc +++ b/sdlsyswm.inc @@ -183,31 +183,39 @@ Type PSDL_SysWMinfo = ^TSDL_SysWMinfo; TSDL_SysWMinfo = record version: TSDL_version; - subsystem: TSDL_SYSWM_TYPE; - {$IFDEF SDL_VIDEO_DRIVER_WINDOWS} - win : __WMINFO_WINDOWS; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_WINRT} - winrt : __WMINFO_WINRT; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_X11} - x11 : __WMINFO_X11; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_DIRECTFB} - dfb : __WMINFO_DFB; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_COCOA} - cocoa : __WMINFO_COCOA; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_UIKIT} - uikit : __WMINFO_UIKIT; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_WAYLAND} - wl : __WMINFO_WAYLAND; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_MIR} - mir : __WMINFO_MIR; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_ANDROID} - android: __WMINFO_ANDROID; - {$ELSE} {$IFDEF SDL_VIDEO_DRIVER_VIVANTE} - vivante: __WMINFO_VIVANTE; - {$ELSE} - (* Cannot have empty record case *) - dummy: integer; - {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} + case subsystem: TSDL_SYSWM_TYPE of + {$IFDEF SDL_VIDEO_DRIVER_WINDOWS} + SDL_SYSWM_WINDOWS: (win : __WMINFO_WINDOWS); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_WINRT} + SDL_SYSWM_WINRT: (winrt : __WMINFO_WINRT); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_X11} + SDL_SYSWM_X11: (x11 : __WMINFO_X11); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_DIRECTFB} + SDL_SYSWM_DIRECTFB: (dfb : __WMINFO_DFB); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_COCOA} + SDL_SYSWM_COCOA: (cocoa : __WMINFO_COCOA); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_UIKIT} + SDL_SYSWM_UIKIT: (uikit : __WMINFO_UIKIT); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_WAYLAND} + SDL_SYSWM_WAYLAND: (wl : __WMINFO_WAYLAND); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_MIR} + SDL_SYSWM_MIR: (mir : __WMINFO_MIR); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_ANDROID} + SDL_SYSWM_ANDROID: (android: __WMINFO_ANDROID); + {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_VIVANTE} + SDL_SYSWM_VIVANTE: (vivante: __WMINFO_VIVANTE); + {$ENDIF} + (* Ensure this union is always 64 bytes (8 64-bit pointers) *) + SDL_SYSWM_UNKNOWN: (dummy: array[0..63] of Byte); end; {* Function prototypes *} From d5b011744380a10ec3c3f77033de8af2938e1780 Mon Sep 17 00:00:00 2001 From: suve Date: Fri, 27 Aug 2021 14:05:01 +0200 Subject: [PATCH 3/5] Group type definitions together in sdlsyswm.inc --- sdlsyswm.inc | 138 ++++++++++++++++++++++++--------------------------- 1 file changed, 66 insertions(+), 72 deletions(-) diff --git a/sdlsyswm.inc b/sdlsyswm.inc index 39e582c8..0cd4fd7c 100644 --- a/sdlsyswm.inc +++ b/sdlsyswm.inc @@ -4,8 +4,8 @@ {$DEFINE SDL_VIDEO_DRIVER_WINDOWS} {$ENDIF} -{$IF DEFINED (LINUX) OR DEFINED(UNIX) AND NOT DEFINED(ANDROID)} - {$IFNDEF DARWIN} +{$IF DEFINED (LINUX) OR DEFINED(UNIX)} + {$IF NOT (DEFINED(DARWIN) OR DEFINED(ANDROID))} {$DEFINE SDL_VIDEO_DRIVER_X11} {$ENDIF} {$IFEND} @@ -19,7 +19,7 @@ {$ENDIF} {$IFDEF VIVANTE} - {$DEFINE SDL_VIDEO_DRIVER_VIVANTE} + {$DEFINE SDL_VIDEO_DRIVER_VIVANTE} {$ENDIF} @@ -41,9 +41,8 @@ Type SDL_SYSWM_VIVANTE // Since SDL 2.0.5 ); -/// sdl_syswm.h uses anonymous structs, declared right in SDL_SysWMmsg. -/// Since Pascal does not allow this, we workaround by introducing named types -/// before the proper TSDL_SysWMmsg definition. +/// sdl_syswm.h uses anonymous structs, declared right in SDL_SysWMmsg and SDL_SysWMinfo. +/// Since Pascal does not allow this, we workaround by introducing named types. {$IFDEF SDL_VIDEO_DRIVER_WINDOWS} __SYSWM_WINDOWS = record hwnd: HWND; {**< The window for the message } @@ -51,36 +50,96 @@ Type wParam: WPARAM; {**< WORD message parameter *} lParam: LPARAM; {**< WORD message parameter *} end; + __WMINFO_WINDOWS = record + window: HWND; {**< The window handle *} + hdc: HDC; {**< The window device context *} + end; {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_X11} __SYSWM_X11 = record event: {$IFDEF FPC} TXEvent {$ELSE} XEvent {$ENDIF}; end; + __WMINFO_X11 = record + display: PDisplay; {**< The X11 display *} + window: TWindow; {**< The X11 window *} + end; {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_DIRECTFB} __SYSWM_DIRECTFB = record event: DFBEvent; end; + __WMINFO_DIRECTFB = record + dfb: IDirectFB; {**< The directfb main interface *} + window: IDirectFBWindow; {**< The directfb window handle *} + surface: IDirectFBSurface; {**< The directfb client surface *} + end; {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_COCOA} __SYSWM_COCOA = record (* No Cocoa window events yet *) dummy: integer; end; + __WMINFO_COCOA = record + window: NSWindow; {* The Cocoa window *} + end; {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_UIKIT} __SYSWM_UIKIT = record (* No UIKit window events yet *) dummy: integer; end; + __WMINFO_UIKIT = record + window: UIWindow; {* The UIKit window *} + framebuffer: GLuint; {* The GL view's Framebuffer Object. It must be bound when rendering to the screen using GL. *} + colorbuffer: GLuint; {* The GL view's color Renderbuffer Object. It must be bound when SDL_GL_SwapWindow is called. *} + resolveFramebuffer: GLuint; {* The Framebuffer Object which holds the resolve color Renderbuffer, when MSAA is used. *} + end; {$ENDIF} + +{$IFDEF SDL_VIDEO_DRIVER_WAYLAND} + __WMINFO_WAYLAND = record + display: wl_display; {**< Wayland display *} + surface: wl_surface; {**< Wayland surface *} + shell_surface: wl_shell_surface; {**< Wayland shell_surface (window manager handle) *} + end; +{$ENDIF} + +{$IFDEF SDL_VIDEO_DRIVER_MIR} + __WMINFO_MIR = record + connection: PMirConnection; {**< Mir display server connection *} + surface: PMirSurface; {**< Mir surface *} + end; +{$ENDIF} + +{$IFDEF SDL_VIDEO_DRIVER_WINRT} + __WMINFO_WINRT = record + window: IInspectable; {**< The WinRT CoreWindow *} + end; +{$ENDIF} + +{$IFDEF SDL_VIDEO_DRIVER_ANDROID} + __WMINFO_ANDROID = record + window: Pointer; // PANativeWindow; + surface: Pointer; // PEGLSurface; + end; +{$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_VIVANTE} __SYSWM_VIVANTE = record (* No Vivante window events yet *) dummy: integer; end; + __WMINFO_VIVANTE = record + display: EGLNativeDisplayType; + window: EGLNativeWindowType; + end; {$ENDIF} + {** * The custom event structure. *} @@ -109,71 +168,6 @@ Type SDL_SYSWM_UNKNOWN: (dummy: integer); end; -/// Once again, sdl_syswm.h uses anonymous structs, declared right in SDL_SysWMinfo. -/// We workaround by introducing named types before the proper TSDL_SysWMinfo definition. -{$IFDEF SDL_VIDEO_DRIVER_WINDOWS} - __WMINFO_WINDOWS = record - window: HWND; {**< The window handle *} - hdc: HDC; {**< The window device context *} - end; -{$ENDIF} -{$IFDEF SDL_VIDEO_DRIVER_WINRT} // Since SDL 2.0.3 - __WMINFO_WINRT = record - window: IInspectable; {**< The WinRT CoreWindow *} - end; -{$ENDIF} -{$IFDEF SDL_VIDEO_DRIVER_X11} - __WMINFO_X11 = record - display: PDisplay; {**< The X11 display *} - window: TWindow; {**< The X11 window *} - end; -{$ENDIF} -{$IFDEF SDL_VIDEO_DRIVER_DIRECTFB} - __WMINFO_DFB = record - dfb: IDirectFB; {**< The directfb main interface *} - window: IDirectFBWindow; {**< The directfb window handle *} - surface: IDirectFBSurface; {**< The directfb client surface *} - end; -{$ENDIF} -{$IFDEF SDL_VIDEO_DRIVER_COCOA} - __WMINFO_COCOA = record - window: NSWindow; {* The Cocoa window *} - end; -{$ENDIF} -{$IFDEF SDL_VIDEO_DRIVER_UIKIT} - __WMINFO_UIKIT = record - window: UIWindow; {* The UIKit window *} - framebuffer: GLuint; {* The GL view's Framebuffer Object. It must be bound when rendering to the screen using GL. *} - colorbuffer: GLuint; {* The GL view's color Renderbuffer Object. It must be bound when SDL_GL_SwapWindow is called. *} - resolveFramebuffer: GLuint; {* The Framebuffer Object which holds the resolve color Renderbuffer, when MSAA is used. *} - end; -{$ENDIF} -{$IFDEF SDL_VIDEO_DRIVER_WAYLAND} // Since SDL 2.0.2 - __WMINFO_WAYLAND = record - display: wl_display; {**< Wayland display *} - surface: wl_surface; {**< Wayland surface *} - shell_surface: wl_shell_surface; {**< Wayland shell_surface (window manager handle) *} - end; -{$ENDIF} -{$IFDEF SDL_VIDEO_DRIVER_MIR} // Since SDL 2.0.2 - __WMINFO_MIR = record - connection: PMirConnection; {**< Mir display server connection *} - surface: PMirSurface; {**< Mir surface *} - end; -{$ENDIF} -{$IFDEF SDL_VIDEO_DRIVER_ANDROID} - __WMINFO_ANDROID = record - window: Pointer; // PANativeWindow; - surface: Pointer; // PEGLSurface; - end; -{$ENDIF} -{$IFDEF SDL_VIDEO_DRIVER_VIVANTE} - __WMINFO_VIVANTE = record - display: EGLNativeDisplayType; - window: EGLNativeWindowType; - end; -{$ENDIF} - {** * The custom window manager information structure. * @@ -194,7 +188,7 @@ Type SDL_SYSWM_X11: (x11 : __WMINFO_X11); {$ENDIF} {$IFDEF SDL_VIDEO_DRIVER_DIRECTFB} - SDL_SYSWM_DIRECTFB: (dfb : __WMINFO_DFB); + SDL_SYSWM_DIRECTFB: (dfb : __WMINFO_DIRECTFB); {$ENDIF} {$IFDEF SDL_VIDEO_DRIVER_COCOA} SDL_SYSWM_COCOA: (cocoa : __WMINFO_COCOA); From 5dcd77e6d2f0135a67388bd8bc58c37a6b45c251 Mon Sep 17 00:00:00 2001 From: suve Date: Fri, 27 Aug 2021 14:14:39 +0200 Subject: [PATCH 4/5] Add OS/2 and Haiku-related definitions to sdlsyswm.inc --- sdlsyswm.inc | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/sdlsyswm.inc b/sdlsyswm.inc index 0cd4fd7c..d46a8d6f 100644 --- a/sdlsyswm.inc +++ b/sdlsyswm.inc @@ -22,6 +22,14 @@ {$DEFINE SDL_VIDEO_DRIVER_VIVANTE} {$ENDIF} +{$IFDEF OS2} + {$DEFINE SDL_VIDEO_DRIVER_OS2} +{$ENDIF} + +{$IFDEF HAIKU} + {$DEFINE SDL_VIDEO_DRIVER_HAIKU} +{$ENDIF} + {** * These are the various supported windowing subsystems @@ -34,11 +42,13 @@ Type SDL_SYSWM_DIRECTFB, SDL_SYSWM_COCOA, SDL_SYSWM_UIKIT, - SDL_SYSWM_WAYLAND, // Since SDL 2.0.2 + SDL_SYSWM_WAYLAND, // Since SDL 2.0.2 - REMOVED in SDL 2.0.10! SDL_SYSWM_MIR, // Since SDL 2.0.2 SDL_SYSWM_WINRT, // Since SDL 2.0.3 SDL_SYSWM_ANDROID, // Since SDL 2.0.4 - SDL_SYSWM_VIVANTE // Since SDL 2.0.5 + SDL_SYSWM_VIVANTE, // Since SDL 2.0.5 + SDL_SYSWM_OS2, // Since SDL 2.0.6 + SDL_SYSWM_HAIKU // Since SDL 2.0.12 ); /// sdl_syswm.h uses anonymous structs, declared right in SDL_SysWMmsg and SDL_SysWMinfo. @@ -46,7 +56,7 @@ Type {$IFDEF SDL_VIDEO_DRIVER_WINDOWS} __SYSWM_WINDOWS = record hwnd: HWND; {**< The window for the message } - msg: uInt; {**< The type of message *} + msg: uInt; {**< The type of message *} wParam: WPARAM; {**< WORD message parameter *} lParam: LPARAM; {**< WORD message parameter *} end; @@ -139,6 +149,20 @@ Type end; {$ENDIF} +{$IFDEF SDL_VIDEO_DRIVER_OS2} + __SYSWM_OS2 = record + fFrame: Boolean; {**< TRUE if hwnd is a frame window *} + hwnd: HWND; {**< The window receiving the message *} + msg: uInt; {**< The message identifier *} + mp1: MPARAM; {**< The first first message parameter *} + mp2: MPARAM; {**< The second first message parameter *} + end; + __WMINFO_OS2 = record + hwnd: HWND; {**< The window handle *} + hwndFrame: HWND; {**< The frame window handle *} + end; +{$ENDIF} + {** * The custom event structure. @@ -165,6 +189,9 @@ Type {$IFDEF SDL_VIDEO_DRIVER_VIVANTE} SDL_SYSWM_VIVANTE: (vivante: __SYSWM_VIVANTE); {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_OS2} + SDL_SYSWM_OS2: (os2: __SYSWM_OS2); + {$ENDIF} SDL_SYSWM_UNKNOWN: (dummy: integer); end; @@ -208,6 +235,9 @@ Type {$IFDEF SDL_VIDEO_DRIVER_VIVANTE} SDL_SYSWM_VIVANTE: (vivante: __WMINFO_VIVANTE); {$ENDIF} + {$IFDEF SDL_VIDEO_DRIVER_OS2} + SDL_SYSWM_OS2: (os2: __WMINFO_OS2); + {$ENDIF} (* Ensure this union is always 64 bytes (8 64-bit pointers) *) SDL_SYSWM_UNKNOWN: (dummy: array[0..63] of Byte); end; From aeb47f9ef3e56ebd1774de496f610569e1578290 Mon Sep 17 00:00:00 2001 From: suve Date: Fri, 27 Aug 2021 14:33:39 +0200 Subject: [PATCH 5/5] Add some comments regarding SDL_VIDEO_DRIVERS Explain why some drivers are disabled by default. --- sdlsyswm.inc | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/sdlsyswm.inc b/sdlsyswm.inc index d46a8d6f..b1d08f2f 100644 --- a/sdlsyswm.inc +++ b/sdlsyswm.inc @@ -10,17 +10,50 @@ {$ENDIF} {$IFEND} +(* + * Disabled because FPC does not ship a DirectFB unit. + * If you have some working DirectDB bindings, feel welcome to enable this and check if it breaks anything. + *) +{$UNDEFINE SDL_VIDEO_DRIVER_DIRECTFB} + {$IFDEF DARWIN} {$DEFINE SDL_VIDEO_DRIVER_COCOA} {$ENDIF} +(* + * Disabled because it's a Mac-specific video driver and we have no means of testing it. + * If you own a Mac, feel welcome to enable this and check if it actually compiles and doesn't break anything. + *) +{$UNDEFINE SDL_VIDEO_DRIVER_UIKIT} + +(* + * Disabled because FPC does not ship a Wayland unit. + * If you have some working Wayland bindings, feel welcome to enable this, + * check if it actually compiles and doesn't break anything. + *) +{$UNDEFINE SDL_VIDEO_DRIVER_WAYLAND} + +(* + * Disabled because FPC does not ship a Mir unit. + * Also, support for Mir has been removed in SDL 2.0.10. + *) +{$UNDEFINE SDL_VIDEO_DRIVER_MIR} + +(* + * Disabled because FPC does not support WinRT. + *) +{$UNDEFINE SDL_VIDEO_DRIVER_WINRT} + {$IFDEF ANDROID} {$DEFINE SDL_VIDEO_DRIVER_ANDROID} {$ENDIF} -{$IFDEF VIVANTE} - {$DEFINE SDL_VIDEO_DRIVER_VIVANTE} -{$ENDIF} +(* + * Disabled because this is an embedded platform and we have no means of testing this. + * If you're actually working with Vivante, feel welcome to enable this + * and check if it compiles and works properly. + *) +{$UNDEFINE SDL_VIDEO_DRIVER_VIVANTE} {$IFDEF OS2} {$DEFINE SDL_VIDEO_DRIVER_OS2}