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