SDL  2.0
SDL_syswm.h
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2022 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  */
44 struct 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
87 typedef 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
95 typedef struct _UIWindow UIWindow;
96 typedef struct _UIViewController UIViewController;
97 #endif
98 typedef Uint32 GLuint;
99 #endif
100 
101 #if defined(SDL_VIDEO_VULKAN) || defined(SDL_VIDEO_METAL)
102 #define SDL_METALVIEW_TAG 255
103 #endif
104 
105 #if defined(SDL_VIDEO_DRIVER_ANDROID)
106 typedef struct ANativeWindow ANativeWindow;
107 typedef void *EGLSurface;
108 #endif
109 
110 #if defined(SDL_VIDEO_DRIVER_VIVANTE)
111 #include "SDL_egl.h"
112 #endif
113 
114 #if defined(SDL_VIDEO_DRIVER_OS2)
115 #define INCL_WIN
116 #include <os2.h>
117 #endif
118 #endif /* SDL_PROTOTYPES_ONLY */
119 
120 #if defined(SDL_VIDEO_DRIVER_KMSDRM)
121 struct gbm_device;
122 #endif
123 
124 
125 #include "begin_code.h"
126 /* Set up for C function definitions, even when using C++ */
127 #ifdef __cplusplus
128 extern "C" {
129 #endif
130 
131 #if !defined(SDL_PROTOTYPES_ONLY)
132 /**
133  * These are the various supported windowing subsystems
134  */
135 typedef enum
136 {
144  SDL_SYSWM_MIR, /* no longer available, left for API/ABI compatibility. Remove in 2.1! */
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;
174  } x11;
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;
217  } msg;
218 };
219 
220 /**
221  * The custom window manager information structure.
222  *
223  * When this structure is returned, it holds information about which
224  * low level 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 */
251  } x11;
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! */
349  } info;
350 };
351 
352 #endif /* SDL_PROTOTYPES_ONLY */
353 
354 typedef 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  */
374 extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_Window * window,
375  SDL_SysWMinfo * info);
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:202
SDL_bool
Definition: SDL_stdinc.h:185
uint32_t Uint32
Definition: SDL_stdinc.h:226
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
The type used to identify a 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