diff --git a/include/SDL_syswm.h b/include/SDL_syswm.h index 4f2afa673..e0b999c4d 100644 --- a/include/SDL_syswm.h +++ b/include/SDL_syswm.h @@ -54,8 +54,12 @@ extern "C" { struct SDL_SysWMinfo; #else +#if defined(SDL_VIDEO_DRIVER_WIN32) +#define WIN32_LEAN_AND_MEAN +#include +#endif + /* This is the structure for custom window manager events */ -#if defined(SDL_VIDEO_DRIVER_X11) || defined(SDL_VIDEO_DRIVER_DIRECTFB) #if defined(SDL_VIDEO_DRIVER_X11) #if defined(__APPLE__) && defined(__MACH__) /* conflicts with Quickdraw.h */ @@ -75,21 +79,29 @@ struct SDL_SysWMinfo; #if defined(SDL_VIDEO_DRIVER_DIRECTFB) #include #endif + +#if defined(SDL_VIDEO_DRIVER_COCOA) +#ifdef __OBJC__ +#include +#else +typedef struct _NSWindow NSWindow; +#endif +#endif + /** - * These are the various supported subsystems under UNIX. + * These are the various supported windowing subsystems */ typedef enum { -#if defined(SDL_VIDEO_DRIVER_X11) + SDL_SYSWM_UNKNOWN, + SDL_SYSWM_WINDOWS, SDL_SYSWM_X11, -#endif -#if defined(SDL_VIDEO_DRIVER_DIRECTFB) SDL_SYSWM_DIRECTFB, -#endif + SDL_SYSWM_COCOA, } SDL_SYSWM_TYPE; /** - * The UNIX custom event structure. + * The custom event structure. */ struct SDL_SysWMmsg { @@ -97,17 +109,35 @@ struct SDL_SysWMmsg SDL_SYSWM_TYPE subsystem; union { +#if defined(SDL_VIDEO_DRIVER_WIN32) + struct { + HWND hwnd; /**< The window for the message */ + UINT msg; /**< The type of message */ + WPARAM wParam; /**< WORD message parameter */ + LPARAM lParam; /**< LONG message parameter */ + } win; +#endif #if defined(SDL_VIDEO_DRIVER_X11) - XEvent xevent; + struct { + XEvent event; + } x11; #endif #if defined(SDL_VIDEO_DRIVER_DIRECTFB) - DFBEvent dfb_event; + struct { + DFBEvent event; + } dfb; #endif - } event; +#if defined(SDL_VIDEO_DRIVER_COCOA) + struct + { + /* No Cocoa window events yet */ + } cocoa; +#endif + } msg; }; /** - * The UNIX custom window manager information structure. + * The custom window manager information structure. * * When this structure is returned, it holds information about which * low level system it is using, and will be one of SDL_SYSWM_TYPE. @@ -118,11 +148,17 @@ struct SDL_SysWMinfo SDL_SYSWM_TYPE subsystem; union { +#if defined(SDL_VIDEO_DRIVER_WIN32) + struct + { + HWND window; /**< The Win32 display window */ + } win; +#endif #if defined(SDL_VIDEO_DRIVER_X11) struct { - Display *display; /**< The X11 display */ - Window window; /**< The X11 display window */ + Display *display; /**< The X11 display */ + Window window; /**< The X11 display window */ } x11; #endif #if defined(SDL_VIDEO_DRIVER_DIRECTFB) @@ -131,106 +167,17 @@ struct SDL_SysWMinfo IDirectFB *dfb; /**< The directfb main interface */ IDirectFBWindow *window; /**< The directfb window handle */ IDirectFBSurface *surface; /**< The directfb client surface */ - } directfb; + } dfb; +#endif +#if defined(SDL_VIDEO_DRIVER_COCOA) + struct + { + NSWindow *window; + } cocoa; #endif } info; }; -#elif defined(SDL_VIDEO_DRIVER_WIN32) -#define WIN32_LEAN_AND_MEAN -#include - -/** - * The windows custom event structure. - */ -struct SDL_SysWMmsg -{ - SDL_version version; - HWND hwnd; /**< The window for the message */ - UINT msg; /**< The type of message */ - WPARAM wParam; /**< WORD message parameter */ - LPARAM lParam; /**< LONG message parameter */ -}; - -/** - * The windows custom window manager information structure. - */ -struct SDL_SysWMinfo -{ - SDL_version version; - HWND window; /**< The Win32 display window */ -}; - -#elif defined(SDL_VIDEO_DRIVER_RISCOS) - -/** - * RISC OS custom event structure. - */ -struct SDL_SysWMmsg -{ - SDL_version version; - int eventCode; /**< The window for the message */ - int pollBlock[64]; -}; - -/** - * The RISC OS custom window manager information structure. - */ -struct SDL_SysWMinfo -{ - SDL_version version; - int wimpVersion; /**< Wimp version running under */ - int taskHandle; /**< The RISC OS task handle */ - int window; /**< The RISC OS display window */ -}; - -#elif defined(SDL_VIDEO_DRIVER_PHOTON) || defined(SDL_VIDEO_DRIVER_QNXGF) -#include -#if defined(SDL_VIDEO_OPENGL_ES) -#include -#endif /* SDL_VIDEO_OPENGL_ES */ -#include - -/** - * The QNX custom event structure. - */ -struct SDL_SysWMmsg -{ - SDL_version version; - int data; -}; - -/** - * The QNX Photon custom window manager information structure. - */ -struct SDL_SysWMinfo -{ - SDL_version version; - int data; -}; - -#else - -/** - * The generic custom event structure. - */ -struct SDL_SysWMmsg -{ - SDL_version version; - int data; -}; - -/** - * The generic custom window manager information structure. - */ -struct SDL_SysWMinfo -{ - SDL_version version; - int data; -}; - -#endif /* video driver type */ - #endif /* SDL_PROTOTYPES_ONLY */ typedef struct SDL_SysWMinfo SDL_SysWMinfo; diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index e0dd19ad6..b9d1d923e 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -40,12 +40,14 @@ #if SDL_VIDEO_OPENGL #include "SDL_opengl.h" +#endif /* SDL_VIDEO_OPENGL */ + +#include "SDL_syswm.h" /* On Windows, windows.h defines CreateWindow */ #ifdef CreateWindow #undef CreateWindow #endif -#endif /* SDL_VIDEO_OPENGL */ /* Available video drivers */ static VideoBootStrap *bootstrap[] = { @@ -3384,6 +3386,11 @@ SDL_GetWindowWMInfo(SDL_Window * window, struct SDL_SysWMinfo *info) { CHECK_WINDOW_MAGIC(window, SDL_FALSE); + if (!info) { + return SDL_FALSE; + } + info->subsystem = SDL_SYSWM_UNKNOWN; + if (!_this->GetWindowWMInfo) { return SDL_FALSE; } diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 7e0e63140..38f2aeda9 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -704,10 +704,11 @@ Cocoa_DestroyWindow(_THIS, SDL_Window * window) SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) { - //NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow; + NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow; if (info->version.major <= SDL_MAJOR_VERSION) { - //info->window = nswindow; + info->subsystem = SDL_SYSWM_COCOA; + info->info.cocoa.window = nswindow; return SDL_TRUE; } else { SDL_SetError("Application not compiled with SDL %d.%d\n", diff --git a/src/video/win32/SDL_win32events.c b/src/video/win32/SDL_win32events.c index ca924f31c..a34380216 100644 --- a/src/video/win32/SDL_win32events.c +++ b/src/video/win32/SDL_win32events.c @@ -113,10 +113,11 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) SDL_SysWMmsg wmmsg; SDL_VERSION(&wmmsg.version); - wmmsg.hwnd = hwnd; - wmmsg.msg = msg; - wmmsg.wParam = wParam; - wmmsg.lParam = lParam; + wmmsg.subsystem = SDL_SYSWM_WINDOWS; + wmmsg.msg.win.hwnd = hwnd; + wmmsg.msg.win.msg = msg; + wmmsg.msg.win.wParam = wParam; + wmmsg.msg.win.lParam = lParam; SDL_SendSysWMEvent(&wmmsg); } diff --git a/src/video/win32/SDL_win32window.c b/src/video/win32/SDL_win32window.c index 9a9a52df1..2c6720a39 100644 --- a/src/video/win32/SDL_win32window.c +++ b/src/video/win32/SDL_win32window.c @@ -551,7 +551,8 @@ WIN_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) { HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd; if (info->version.major <= SDL_MAJOR_VERSION) { - info->window = hwnd; + info->subsystem = SDL_SYSWM_WINDOWS; + info->info.win.window = hwnd; return SDL_TRUE; } else { SDL_SetError("Application not compiled with SDL %d.%d\n", diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 7d8530d9e..f2471dc7c 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -90,7 +90,7 @@ X11_DispatchEvent(_THIS) SDL_VERSION(&wmmsg.version); wmmsg.subsystem = SDL_SYSWM_X11; - wmmsg.event.xevent = xevent; + wmmsg.msg.x11.event = xevent; SDL_SendSysWMEvent(&wmmsg); }