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 */ 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_DRIVER_ANDROID) 102 typedef struct ANativeWindow ANativeWindow; 103 typedef 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) 117 struct 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 124 extern "C" { 125 #endif 126 127 #if !defined(SDL_PROTOTYPES_ONLY) 128 /** 129 * These are the various supported windowing subsystems 130 */ 131 typedef 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 */ 152 struct 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 */ 221 struct 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 void *shell_surface; /**< DEPRECATED Wayland shell_surface (window manager handle) */ 293 struct wl_egl_window *egl_window; /**< Wayland EGL window (native window) */ 294 struct xdg_surface *xdg_surface; /**< Wayland xdg surface (window manager handle) */ 295 } wl; 296 #endif 297 #if defined(SDL_VIDEO_DRIVER_MIR) /* no longer available, left for API/ABI compatibility. Remove in 2.1! */ 298 struct 299 { 300 void *connection; /**< Mir display server connection */ 301 void *surface; /**< Mir surface */ 302 } mir; 303 #endif 304 305 #if defined(SDL_VIDEO_DRIVER_ANDROID) 306 struct 307 { 308 ANativeWindow *window; 309 EGLSurface surface; 310 } android; 311 #endif 312 313 #if defined(SDL_VIDEO_DRIVER_OS2) 314 struct 315 { 316 HWND hwnd; /**< The window handle */ 317 HWND hwndFrame; /**< The frame window handle */ 318 } os2; 319 #endif 320 321 #if defined(SDL_VIDEO_DRIVER_VIVANTE) 322 struct 323 { 324 EGLNativeDisplayType display; 325 EGLNativeWindowType window; 326 } vivante; 327 #endif 328 329 #if defined(SDL_VIDEO_DRIVER_KMSDRM) 330 struct 331 { 332 int dev_index; /**< Device index (ex: the X in /dev/dri/cardX) */ 333 int drm_fd; /**< DRM FD (unavailable on Vulkan windows) */ 334 struct gbm_device *gbm_dev; /**< GBM device (unavailable on Vulkan windows) */ 335 } kmsdrm; 336 #endif 337 338 /* Make sure this union is always 64 bytes (8 64-bit pointers). */ 339 /* Be careful not to overflow this if you add a new target! */ 340 Uint8 dummy[64]; 341 } info; 342 }; 343 344 #endif /* SDL_PROTOTYPES_ONLY */ 345 346 typedef struct SDL_SysWMinfo SDL_SysWMinfo; 347 348 349 /** 350 * Get driver-specific information about a window. 351 * 352 * You must include SDL_syswm.h for the declaration of SDL_SysWMinfo. 353 * 354 * The caller must initialize the `info` structure's version by using 355 * `SDL_VERSION(&info.version)`, and then this function will fill in the rest 356 * of the structure with information about the given window. 357 * 358 * \param window the window about which information is being requested 359 * \param info an SDL_SysWMinfo structure filled in with window information 360 * \returns SDL_TRUE if the function is implemented and the `version` member 361 * of the `info` struct is valid, or SDL_FALSE if the information 362 * could not be retrieved; call SDL_GetError() for more information. 363 * 364 * \since This function is available since SDL 2.0.0. 365 */ 366 extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_Window * window, 367 SDL_SysWMinfo * info); 368 369 370 /* Ends C function definitions when using C++ */ 371 #ifdef __cplusplus 372 } 373 #endif 374 #include "close_code.h" 375 376 #endif /* SDL_syswm_h_ */ 377 378 /* vi: set ts=4 sw=4 expandtab: */ 379