1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22/**
23 * \file SDL_syswm.h
24 *
25 * Include file for SDL custom system window manager hooks.
26 */
27
28#ifndef SDL_syswm_h_
29#define SDL_syswm_h_
30
31#include "SDL_stdinc.h"
32#include "SDL_error.h"
33#include "SDL_video.h"
34#include "SDL_version.h"
35
36/**
37 * \brief SDL_syswm.h
38 *
39 * Your application has access to a special type of event ::SDL_SYSWMEVENT,
40 * which contains window-manager specific information and arrives whenever
41 * an unhandled window event occurs. This event is ignored by default, but
42 * you can enable it with SDL_EventState().
43 */
44struct SDL_SysWMinfo;
45
46#if !defined(SDL_PROTOTYPES_ONLY)
47
48#if defined(SDL_VIDEO_DRIVER_WINDOWS)
49#ifndef WIN32_LEAN_AND_MEAN
50#define WIN32_LEAN_AND_MEAN
51#endif
52#ifndef NOMINMAX /* don't define min() and max(). */
53#define NOMINMAX
54#endif
55#include <windows.h>
56#endif
57
58#if defined(SDL_VIDEO_DRIVER_WINRT)
59#include <Inspectable.h>
60#endif
61
62/* This is the structure for custom window manager events */
63#if defined(SDL_VIDEO_DRIVER_X11)
64#if defined(__APPLE__) && defined(__MACH__)
65/* conflicts with Quickdraw.h */
66#define Cursor X11Cursor
67#endif
68
69#include <X11/Xlib.h>
70#include <X11/Xatom.h>
71
72#if defined(__APPLE__) && defined(__MACH__)
73/* matches the re-define above */
74#undef Cursor
75#endif
76
77#endif /* defined(SDL_VIDEO_DRIVER_X11) */
78
79#if defined(SDL_VIDEO_DRIVER_DIRECTFB)
80#include <directfb.h>
81#endif
82
83#if defined(SDL_VIDEO_DRIVER_COCOA)
84#ifdef __OBJC__
85@class NSWindow;
86#else
87typedef struct _NSWindow NSWindow;
88#endif
89#endif
90
91#if defined(SDL_VIDEO_DRIVER_UIKIT)
92#ifdef __OBJC__
93#include <UIKit/UIKit.h>
94#else
95typedef struct _UIWindow UIWindow;
96typedef struct _UIViewController UIViewController;
97#endif
98typedef Uint32 GLuint;
99#endif
100
101#if defined(SDL_VIDEO_DRIVER_ANDROID)
102typedef struct ANativeWindow ANativeWindow;
103typedef void *EGLSurface;
104#endif
105
106#if defined(SDL_VIDEO_DRIVER_VIVANTE)
107#include "SDL_egl.h"
108#endif
109
110#if defined(SDL_VIDEO_DRIVER_OS2)
111#define INCL_WIN
112#include <os2.h>
113#endif
114#endif /* SDL_PROTOTYPES_ONLY */
115
116#if defined(SDL_VIDEO_DRIVER_KMSDRM)
117struct gbm_device;
118#endif
119
120
121#include "begin_code.h"
122/* Set up for C function definitions, even when using C++ */
123#ifdef __cplusplus
124extern "C" {
125#endif
126
127#if !defined(SDL_PROTOTYPES_ONLY)
128/**
129 * These are the various supported windowing subsystems
130 */
131typedef enum
132{
133 SDL_SYSWM_UNKNOWN,
134 SDL_SYSWM_WINDOWS,
135 SDL_SYSWM_X11,
136 SDL_SYSWM_DIRECTFB,
137 SDL_SYSWM_COCOA,
138 SDL_SYSWM_UIKIT,
139 SDL_SYSWM_WAYLAND,
140 SDL_SYSWM_MIR, /* no longer available, left for API/ABI compatibility. Remove in 2.1! */
141 SDL_SYSWM_WINRT,
142 SDL_SYSWM_ANDROID,
143 SDL_SYSWM_VIVANTE,
144 SDL_SYSWM_OS2,
145 SDL_SYSWM_HAIKU,
146 SDL_SYSWM_KMSDRM
147} SDL_SYSWM_TYPE;
148
149/**
150 * The custom event structure.
151 */
152struct SDL_SysWMmsg
153{
154 SDL_version version;
155 SDL_SYSWM_TYPE subsystem;
156 union
157 {
158#if defined(SDL_VIDEO_DRIVER_WINDOWS)
159 struct {
160 HWND hwnd; /**< The window for the message */
161 UINT msg; /**< The type of message */
162 WPARAM wParam; /**< WORD message parameter */
163 LPARAM lParam; /**< LONG message parameter */
164 } win;
165#endif
166#if defined(SDL_VIDEO_DRIVER_X11)
167 struct {
168 XEvent event;
169 } x11;
170#endif
171#if defined(SDL_VIDEO_DRIVER_DIRECTFB)
172 struct {
173 DFBEvent event;
174 } dfb;
175#endif
176#if defined(SDL_VIDEO_DRIVER_COCOA)
177 struct
178 {
179 /* Latest version of Xcode clang complains about empty structs in C v. C++:
180 error: empty struct has size 0 in C, size 1 in C++
181 */
182 int dummy;
183 /* No Cocoa window events yet */
184 } cocoa;
185#endif
186#if defined(SDL_VIDEO_DRIVER_UIKIT)
187 struct
188 {
189 int dummy;
190 /* No UIKit window events yet */
191 } uikit;
192#endif
193#if defined(SDL_VIDEO_DRIVER_VIVANTE)
194 struct
195 {
196 int dummy;
197 /* No Vivante window events yet */
198 } vivante;
199#endif
200#if defined(SDL_VIDEO_DRIVER_OS2)
201 struct
202 {
203 BOOL fFrame; /**< TRUE if hwnd is a frame window */
204 HWND hwnd; /**< The window receiving the message */
205 ULONG msg; /**< The message identifier */
206 MPARAM mp1; /**< The first first message parameter */
207 MPARAM mp2; /**< The second first message parameter */
208 } os2;
209#endif
210 /* Can't have an empty union */
211 int dummy;
212 } msg;
213};
214
215/**
216 * The custom window manager information structure.
217 *
218 * When this structure is returned, it holds information about which
219 * low level system it is using, and will be one of SDL_SYSWM_TYPE.
220 */
221struct SDL_SysWMinfo
222{
223 SDL_version version;
224 SDL_SYSWM_TYPE subsystem;
225 union
226 {
227#if defined(SDL_VIDEO_DRIVER_WINDOWS)
228 struct
229 {
230 HWND window; /**< The window handle */
231 HDC hdc; /**< The window device context */
232 HINSTANCE hinstance; /**< The instance handle */
233 } win;
234#endif
235#if defined(SDL_VIDEO_DRIVER_WINRT)
236 struct
237 {
238 IInspectable * window; /**< The WinRT CoreWindow */
239 } winrt;
240#endif
241#if defined(SDL_VIDEO_DRIVER_X11)
242 struct
243 {
244 Display *display; /**< The X11 display */
245 Window window; /**< The X11 window */
246 } x11;
247#endif
248#if defined(SDL_VIDEO_DRIVER_DIRECTFB)
249 struct
250 {
251 IDirectFB *dfb; /**< The directfb main interface */
252 IDirectFBWindow *window; /**< The directfb window handle */
253 IDirectFBSurface *surface; /**< The directfb client surface */
254 } dfb;
255#endif
256#if defined(SDL_VIDEO_DRIVER_COCOA)
257 struct
258 {
259#if defined(__OBJC__) && defined(__has_feature)
260 #if __has_feature(objc_arc)
261 NSWindow __unsafe_unretained *window; /**< The Cocoa window */
262 #else
263 NSWindow *window; /**< The Cocoa window */
264 #endif
265#else
266 NSWindow *window; /**< The Cocoa window */
267#endif
268 } cocoa;
269#endif
270#if defined(SDL_VIDEO_DRIVER_UIKIT)
271 struct
272 {
273#if defined(__OBJC__) && defined(__has_feature)
274 #if __has_feature(objc_arc)
275 UIWindow __unsafe_unretained *window; /**< The UIKit window */
276 #else
277 UIWindow *window; /**< The UIKit window */
278 #endif
279#else
280 UIWindow *window; /**< The UIKit window */
281#endif
282 GLuint framebuffer; /**< The GL view's Framebuffer Object. It must be bound when rendering to the screen using GL. */
283 GLuint colorbuffer; /**< The GL view's color Renderbuffer Object. It must be bound when SDL_GL_SwapWindow is called. */
284 GLuint resolveFramebuffer; /**< The Framebuffer Object which holds the resolve color Renderbuffer, when MSAA is used. */
285 } uikit;
286#endif
287#if defined(SDL_VIDEO_DRIVER_WAYLAND)
288 struct
289 {
290 struct wl_display *display; /**< Wayland display */
291 struct wl_surface *surface; /**< Wayland surface */
292 struct wl_shell_surface *shell_surface; /**< Wayland shell_surface (window manager handle) */
293 struct wl_egl_window *egl_window; /**< Wayland EGL window (native window) */
294 } wl;
295#endif
296#if defined(SDL_VIDEO_DRIVER_MIR) /* no longer available, left for API/ABI compatibility. Remove in 2.1! */
297 struct
298 {
299 void *connection; /**< Mir display server connection */
300 void *surface; /**< Mir surface */
301 } mir;
302#endif
303
304#if defined(SDL_VIDEO_DRIVER_ANDROID)
305 struct
306 {
307 ANativeWindow *window;
308 EGLSurface surface;
309 } android;
310#endif
311
312#if defined(SDL_VIDEO_DRIVER_OS2)
313 struct
314 {
315 HWND hwnd; /**< The window handle */
316 HWND hwndFrame; /**< The frame window handle */
317 } os2;
318#endif
319
320#if defined(SDL_VIDEO_DRIVER_VIVANTE)
321 struct
322 {
323 EGLNativeDisplayType display;
324 EGLNativeWindowType window;
325 } vivante;
326#endif
327
328#if defined(SDL_VIDEO_DRIVER_KMSDRM)
329 struct
330 {
331 int dev_index; /**< Device index (ex: the X in /dev/dri/cardX) */
332 int drm_fd; /**< DRM FD (unavailable on Vulkan windows) */
333 struct gbm_device *gbm_dev; /**< GBM device (unavailable on Vulkan windows) */
334 } kmsdrm;
335#endif
336
337 /* Make sure this union is always 64 bytes (8 64-bit pointers). */
338 /* Be careful not to overflow this if you add a new target! */
339 Uint8 dummy[64];
340 } info;
341};
342
343#endif /* SDL_PROTOTYPES_ONLY */
344
345typedef struct SDL_SysWMinfo SDL_SysWMinfo;
346
347
348/**
349 * Get driver-specific information about a window.
350 *
351 * You must include SDL_syswm.h for the declaration of SDL_SysWMinfo.
352 *
353 * The caller must initialize the `info` structure's version by using
354 * `SDL_VERSION(&info.version)`, and then this function will fill in the
355 * rest of the structure with information about the given window.
356 *
357 * \param window the window about which information is being requested
358 * \param info an SDL_SysWMinfo structure filled in with window information
359 * \returns SDL_TRUE if the function is implemented and the `version` member
360 * of the `info` struct is valid, or SDL_FALSE if the information
361 * could not be retrieved; call SDL_GetError() for more information.
362 *
363 * \since This function is available since SDL 2.0.0.
364 */
365extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_Window * window,
366 SDL_SysWMinfo * info);
367
368
369/* Ends C function definitions when using C++ */
370#ifdef __cplusplus
371}
372#endif
373#include "close_code.h"
374
375#endif /* SDL_syswm_h_ */
376
377/* vi: set ts=4 sw=4 expandtab: */
378