Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
272 changes: 170 additions & 102 deletions sdlsyswm.inc
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,63 @@
{$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}

(*
* 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}
(*
* 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}
{$ENDIF}

{$IFDEF HAIKU}
{$DEFINE SDL_VIDEO_DRIVER_HAIKU}
{$ENDIF}


Expand All @@ -34,143 +75,159 @@ 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.
/// 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 }
msg: uInt; {**< The type of message *}
msg: uInt; {**< The type of message *}
wParam: WPARAM; {**< WORD message parameter *}
lParam: LPARAM; {**< WORD message parameter *}
end;
{$ENDIF}
{$IFDEF SDL_VIDEO_DRIVER_X11}
__SYSWM_X11 = record
event: {$IFDEF FPC} TXEvent {$ELSE} XEvent {$ENDIF};
end;
{$ENDIF}
{$IFDEF SDL_VIDEO_DRIVER_DIRECTFB}
__SYSWM_DIRECTFB = record
event: DFBEvent;
end;
{$ENDIF}
{$IFDEF SDL_VIDEO_DRIVER_COCOA}
__SYSWM_COCOA = record
(* No Cocoa window events yet *)
dummy: integer;
end;
{$ENDIF}
{$IFDEF SDL_VIDEO_DRIVER_UIKIT}
__SYSWM_UIKIT = record
(* No UIKit window events yet *)
dummy: integer;
end;
{$ENDIF}
{$IFDEF SDL_VIDEO_DRIVER_VIVANTE}
__SYSWM_VIVANTE = record
(* No Vivante window events yet *)
dummy: integer;
end;
{$ENDIF}

{**
* The custom event structure.
*}
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}
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}
__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}
__WMINFO_DFB = record
__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 *}
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} // Since SDL 2.0.2

{$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} // Since SDL 2.0.2

{$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}

{$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.
*}
PSDL_SysWMmsg = ^TSDL_SysWMmsg;
TSDL_SysWMmsg = record
version: TSDL_version;
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}
{$IFDEF SDL_VIDEO_DRIVER_OS2}
SDL_SYSWM_OS2: (os2: __SYSWM_OS2);
{$ENDIF}
SDL_SYSWM_UNKNOWN: (dummy: integer);
end;

{**
* The custom window manager information structure.
*
Expand All @@ -180,31 +237,42 @@ 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_DIRECTFB);
{$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}
{$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;

{* Function prototypes *}
Expand Down