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 43 struct 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 86 typedef 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 94 typedef struct _UIWindow UIWindow; 95 typedef struct _UIViewController UIViewController; 96 #endif 97 typedef 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) 105 typedef struct ANativeWindow ANativeWindow; 106 typedef 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) 120 struct 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 127 extern "C" { 128 #endif 129 130 #if !defined(SDL_PROTOTYPES_ONLY) 131 132 /** 133 * These are the various supported windowing subsystems 134 */ 135 typedef enum SDL_SYSWM_TYPE 136 { 137 SDL_SYSWM_UNKNOWN, 138 SDL_SYSWM_WINDOWS, 139 SDL_SYSWM_X11, 140 SDL_SYSWM_DIRECTFB, 141 SDL_SYSWM_COCOA, 142 SDL_SYSWM_UIKIT, 143 SDL_SYSWM_WAYLAND, 144 SDL_SYSWM_MIR, /* no longer available, left for API/ABI compatibility. Remove in 2.1! */ 145 SDL_SYSWM_WINRT, 146 SDL_SYSWM_ANDROID, 147 SDL_SYSWM_VIVANTE, 148 SDL_SYSWM_OS2, 149 SDL_SYSWM_HAIKU, 150 SDL_SYSWM_KMSDRM, 151 SDL_SYSWM_RISCOS 152 } SDL_SYSWM_TYPE; 153 154 /** 155 * The custom event structure. 156 */ 157 struct SDL_SysWMmsg 158 { 159 SDL_version version; 160 SDL_SYSWM_TYPE subsystem; 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 low level 224 * system it is using, and will be one of SDL_SYSWM_TYPE. 225 */ 226 struct SDL_SysWMinfo 227 { 228 SDL_version version; 229 SDL_SYSWM_TYPE subsystem; 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) */ 343 } kmsdrm; 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! */ 348 Uint8 dummy[64]; 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: */