changeset 4900:69d9db65f248

Merged the Windows custom window system hooks into the union used by X11. Added Cocoa custom window system hooks
author Sam Lantinga <slouken@libsdl.org>
date Mon, 27 Sep 2010 01:24:05 -0700
parents 5d529386db73
children deadc1219bea
files include/SDL_syswm.h src/video/SDL_video.c src/video/cocoa/SDL_cocoawindow.m src/video/win32/SDL_win32events.c src/video/win32/SDL_win32window.c src/video/x11/SDL_x11events.c
diffstat 6 files changed, 75 insertions(+), 118 deletions(-) [+]
line wrap: on
line diff
--- a/include/SDL_syswm.h	Mon Sep 27 00:50:46 2010 -0700
+++ b/include/SDL_syswm.h	Mon Sep 27 01:24:05 2010 -0700
@@ -54,8 +54,12 @@
 struct SDL_SysWMinfo;
 #else
 
+#if defined(SDL_VIDEO_DRIVER_WIN32)
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#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 @@
 #if defined(SDL_VIDEO_DRIVER_DIRECTFB)
 #include <directfb/directfb.h>
 #endif
+
+#if defined(SDL_VIDEO_DRIVER_COCOA)
+#ifdef __OBJC__
+#include <Cocoa/Cocoa.h>
+#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 @@
     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 @@
     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 @@
         	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 <windows.h>
-
-/**
- *  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 <sys/neutrino.h>
-#if defined(SDL_VIDEO_OPENGL_ES)
-#include <gf/gf.h>
-#endif /* SDL_VIDEO_OPENGL_ES */
-#include <Ph.h>
-
-/**
- * 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;
--- a/src/video/SDL_video.c	Mon Sep 27 00:50:46 2010 -0700
+++ b/src/video/SDL_video.c	Mon Sep 27 01:24:05 2010 -0700
@@ -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 @@
 {
     CHECK_WINDOW_MAGIC(window, SDL_FALSE);
 
+    if (!info) {
+        return SDL_FALSE;
+    }
+    info->subsystem = SDL_SYSWM_UNKNOWN;
+
     if (!_this->GetWindowWMInfo) {
         return SDL_FALSE;
     }
--- a/src/video/cocoa/SDL_cocoawindow.m	Mon Sep 27 00:50:46 2010 -0700
+++ b/src/video/cocoa/SDL_cocoawindow.m	Mon Sep 27 01:24:05 2010 -0700
@@ -704,10 +704,11 @@
 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",
--- a/src/video/win32/SDL_win32events.c	Mon Sep 27 00:50:46 2010 -0700
+++ b/src/video/win32/SDL_win32events.c	Mon Sep 27 01:24:05 2010 -0700
@@ -113,10 +113,11 @@
         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);
     }
 
--- a/src/video/win32/SDL_win32window.c	Mon Sep 27 00:50:46 2010 -0700
+++ b/src/video/win32/SDL_win32window.c	Mon Sep 27 01:24:05 2010 -0700
@@ -551,7 +551,8 @@
 {
     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",
--- a/src/video/x11/SDL_x11events.c	Mon Sep 27 00:50:46 2010 -0700
+++ b/src/video/x11/SDL_x11events.c	Mon Sep 27 01:24:05 2010 -0700
@@ -90,7 +90,7 @@
 
         SDL_VERSION(&wmmsg.version);
         wmmsg.subsystem = SDL_SYSWM_X11;
-        wmmsg.event.xevent = xevent;
+        wmmsg.msg.x11.event = xevent;
         SDL_SendSysWMEvent(&wmmsg);
     }