WinRT: made the device's screen size be retrieve-able via SDL_GetDisplayMode()
authorDavid Ludwig <dludwig@pobox.com>
Sun, 28 Oct 2012 18:45:33 -0400
changeset 8329 c3047b88e35b
parent 8328 88b08ad81bf7
child 8330 d976f30d38e9
WinRT: made the device's screen size be retrieve-able via SDL_GetDisplayMode()
VisualC/SDL/SDL_VS2012_WinRT.vcxproj
src/video/windowsrt/SDL_WinRTApp.cpp
src/video/windowsrt/SDL_WinRTApp.h
src/video/windowsrt/SDL_winrtevents.c
src/video/windowsrt/SDL_winrtevents.cpp
src/video/windowsrt/SDL_winrtframebuffer.c
src/video/windowsrt/SDL_winrtframebuffer.cpp
src/video/windowsrt/SDL_winrtvideo.c
src/video/windowsrt/SDL_winrtvideo.cpp
src/video/windowsrt/SDL_winrtvideo.h
src/video/windowsrt/SDLmain_WinRT_common.h
--- a/VisualC/SDL/SDL_VS2012_WinRT.vcxproj	Sat Oct 27 22:57:07 2012 -0400
+++ b/VisualC/SDL/SDL_VS2012_WinRT.vcxproj	Sun Oct 28 18:45:33 2012 -0400
@@ -125,9 +125,16 @@
       <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</CompileAsWinRT>
       <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</CompileAsWinRT>
     </ClCompile>
-    <ClCompile Include="..\..\src\video\windowsrt\SDL_winrtevents.c" />
-    <ClCompile Include="..\..\src\video\windowsrt\SDL_winrtframebuffer.c" />
-    <ClCompile Include="..\..\src\video\windowsrt\SDL_winrtvideo.c" />
+    <ClCompile Include="..\..\src\video\windowsrt\SDL_winrtevents.cpp" />
+    <ClCompile Include="..\..\src\video\windowsrt\SDL_winrtframebuffer.cpp" />
+    <ClCompile Include="..\..\src\video\windowsrt\SDL_winrtvideo.cpp">
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</CompileAsWinRT>
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</CompileAsWinRT>
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</CompileAsWinRT>
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</CompileAsWinRT>
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</CompileAsWinRT>
+      <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</CompileAsWinRT>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\include\begin_code.h" />
--- a/src/video/windowsrt/SDL_WinRTApp.cpp	Sat Oct 27 22:57:07 2012 -0400
+++ b/src/video/windowsrt/SDL_WinRTApp.cpp	Sun Oct 28 18:45:33 2012 -0400
@@ -2,12 +2,27 @@
 #include "SDL_WinRTApp.h"
 #include "BasicTimer.h"
 
+extern "C" {
+#include "SDL_assert.h"
+#include "SDL_stdinc.h"
+#include "../SDL_sysvideo.h"
+}
+
 // HACK, DLudwig: The C-style main() will get loaded via the app's
 // WinRT-styled main(), which is part of SDLmain_for_WinRT.cpp.
 // This seems wrong on some level, but does seem to work.
 typedef int (*SDL_WinRT_MainFunction)(int, char **);
 static SDL_WinRT_MainFunction SDL_WinRT_main = nullptr;
 
+// HACK, DLudwig: record a reference to the global, Windows RT 'app'/view.
+// SDL/WinRT will use this throughout its code.
+//
+// TODO, WinRT: consider replacing SDL_WinRTGlobalApp with something
+// non-global, such as something created inside
+// SDL_InitSubSystem(SDL_INIT_VIDEO), or something inside
+// SDL_CreateWindow().
+SDL_WinRTApp ^ SDL_WinRTGlobalApp = nullptr;
+
 
 using namespace Windows::ApplicationModel;
 using namespace Windows::ApplicationModel::Core;
@@ -151,9 +166,30 @@
 	// does not occur if the app was previously terminated.
 }
 
+SDL_DisplayMode SDL_WinRTApp::GetMainDisplayMode()
+{
+    SDL_DisplayMode mode;
+    SDL_zero(mode);
+    mode.format = SDL_PIXELFORMAT_RGB888;
+    mode.w = (int) CoreWindow::GetForCurrentThread()->Bounds.Width;
+    mode.h = (int) CoreWindow::GetForCurrentThread()->Bounds.Height;
+    mode.refresh_rate = 0;  // TODO, WinRT: see if refresh rate data is available, or relevant (for WinRT apps)
+    mode.driverdata = NULL;
+    return mode;
+}
+
 IFrameworkView^ Direct3DApplicationSource::CreateView()
 {
-    return ref new SDL_WinRTApp();
+    // TODO, WinRT: see if this function (CreateView) can ever get called
+    // more than once.  For now, just prevent it from ever assigning
+    // SDL_WinRTGlobalApp more than once.
+    SDL_assert(!SDL_WinRTGlobalApp);
+    SDL_WinRTApp ^ app = ref new SDL_WinRTApp();
+    if (!SDL_WinRTGlobalApp)
+    {
+        SDL_WinRTGlobalApp = app;
+    }
+    return app;
 }
 
 __declspec(dllexport) int SDL_WinRT_RunApplication(SDL_WinRT_MainFunction mainFunction)
--- a/src/video/windowsrt/SDL_WinRTApp.h	Sat Oct 27 22:57:07 2012 -0400
+++ b/src/video/windowsrt/SDL_WinRTApp.h	Sun Oct 28 18:45:33 2012 -0400
@@ -2,6 +2,9 @@
 
 #include "SDLmain_WinRT_common.h"
 #include "CubeRenderer.h"
+#include <vector>
+
+using namespace Windows::UI::Core;
 
 ref class SDL_WinRTApp sealed : public Windows::ApplicationModel::Core::IFrameworkView
 {
@@ -15,6 +18,10 @@
 	virtual void Run();
 	virtual void Uninitialize();
 
+internal:
+    // SDL-specific methods
+    SDL_DisplayMode GetMainDisplayMode();
+
 protected:
 	// Event Handlers.
 	void OnWindowSizeChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ args);
--- a/src/video/windowsrt/SDL_winrtevents.c	Sat Oct 27 22:57:07 2012 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*
-  Simple DirectMedia Layer
-  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-*/
-#include "SDL_config.h"
-
-#if SDL_VIDEO_DRIVER_WINRT
-
-/* Being a null driver, there's no event stream. We just define stubs for
-   most of the API. */
-
-#include "../../events/SDL_events_c.h"
-
-#include "SDL_winrtvideo.h"
-#include "SDL_winrtevents_c.h"
-
-void
-WINRT_PumpEvents(_THIS)
-{
-    /* do nothing. */
-}
-
-#endif /* SDL_VIDEO_DRIVER_WINRT */
-
-/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windowsrt/SDL_winrtevents.cpp	Sun Oct 28 18:45:33 2012 -0400
@@ -0,0 +1,41 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+#if SDL_VIDEO_DRIVER_WINRT
+
+/* Being a null driver, there's no event stream. We just define stubs for
+   most of the API. */
+
+#include "../../events/SDL_events_c.h"
+
+#include "SDL_winrtvideo.h"
+#include "SDL_winrtevents_c.h"
+
+void
+WINRT_PumpEvents(_THIS)
+{
+    /* do nothing. */
+}
+
+#endif /* SDL_VIDEO_DRIVER_WINRT */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/windowsrt/SDL_winrtframebuffer.c	Sat Oct 27 22:57:07 2012 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-/*
-  Simple DirectMedia Layer
-  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-*/
-#include "SDL_config.h"
-
-#if SDL_VIDEO_DRIVER_WINRT
-
-#include "../SDL_sysvideo.h"
-#include "SDL_winrtframebuffer_c.h"
-
-
-#define WINRT_SURFACE   "_SDL_WinRTSurface"
-
-int SDL_WINRT_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch)
-{
-    SDL_Surface *surface;
-    const Uint32 surface_format = SDL_PIXELFORMAT_RGB888;
-    int w, h;
-    int bpp;
-    Uint32 Rmask, Gmask, Bmask, Amask;
-
-    /* Free the old framebuffer surface */
-    surface = (SDL_Surface *) SDL_GetWindowData(window, WINRT_SURFACE);
-    if (surface) {
-        SDL_FreeSurface(surface);
-    }
-
-    /* Create a new one */
-    SDL_PixelFormatEnumToMasks(surface_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask);
-    SDL_GetWindowSize(window, &w, &h);
-    surface = SDL_CreateRGBSurface(0, w, h, bpp, Rmask, Gmask, Bmask, Amask);
-    if (!surface) {
-        return -1;
-    }
-
-    /* Save the info and return! */
-    SDL_SetWindowData(window, WINRT_SURFACE, surface);
-    *format = surface_format;
-    *pixels = surface->pixels;
-    *pitch = surface->pitch;
-    return 0;
-}
-
-int SDL_WINRT_UpdateWindowFramebuffer(_THIS, SDL_Window * window, SDL_Rect * rects, int numrects)
-{
-    static int frame_number;
-    SDL_Surface *surface;
-
-    surface = (SDL_Surface *) SDL_GetWindowData(window, WINRT_SURFACE);
-    if (!surface) {
-        SDL_SetError("Couldn't find WinRT surface for window");
-        return -1;
-    }
-
-    /* Send the data to the display */
-    if (SDL_getenv("SDL_VIDEO_WINRT_SAVE_FRAMES")) {
-        char file[128];
-        SDL_snprintf(file, sizeof(file), "SDL_window%d-%8.8d.bmp",
-                     SDL_GetWindowID(window), ++frame_number);
-        SDL_SaveBMP(surface, file);
-    }
-    return 0;
-}
-
-void SDL_WINRT_DestroyWindowFramebuffer(_THIS, SDL_Window * window)
-{
-    SDL_Surface *surface;
-
-    surface = (SDL_Surface *) SDL_SetWindowData(window, WINRT_SURFACE, NULL);
-    if (surface) {
-        SDL_FreeSurface(surface);
-    }
-}
-
-#endif /* SDL_VIDEO_DRIVER_WINRT */
-
-/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windowsrt/SDL_winrtframebuffer.cpp	Sun Oct 28 18:45:33 2012 -0400
@@ -0,0 +1,94 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+#if SDL_VIDEO_DRIVER_WINRT
+
+#include "../SDL_sysvideo.h"
+#include "SDL_winrtframebuffer_c.h"
+
+
+#define WINRT_SURFACE   "_SDL_WinRTSurface"
+
+int SDL_WINRT_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch)
+{
+    SDL_Surface *surface;
+    const Uint32 surface_format = SDL_PIXELFORMAT_RGB888;
+    int w, h;
+    int bpp;
+    Uint32 Rmask, Gmask, Bmask, Amask;
+
+    /* Free the old framebuffer surface */
+    surface = (SDL_Surface *) SDL_GetWindowData(window, WINRT_SURFACE);
+    if (surface) {
+        SDL_FreeSurface(surface);
+    }
+
+    /* Create a new one */
+    SDL_PixelFormatEnumToMasks(surface_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask);
+    SDL_GetWindowSize(window, &w, &h);
+    surface = SDL_CreateRGBSurface(0, w, h, bpp, Rmask, Gmask, Bmask, Amask);
+    if (!surface) {
+        return -1;
+    }
+
+    /* Save the info and return! */
+    SDL_SetWindowData(window, WINRT_SURFACE, surface);
+    *format = surface_format;
+    *pixels = surface->pixels;
+    *pitch = surface->pitch;
+    return 0;
+}
+
+int SDL_WINRT_UpdateWindowFramebuffer(_THIS, SDL_Window * window, SDL_Rect * rects, int numrects)
+{
+    static int frame_number;
+    SDL_Surface *surface;
+
+    surface = (SDL_Surface *) SDL_GetWindowData(window, WINRT_SURFACE);
+    if (!surface) {
+        SDL_SetError("Couldn't find WinRT surface for window");
+        return -1;
+    }
+
+    /* Send the data to the display */
+    if (SDL_getenv("SDL_VIDEO_WINRT_SAVE_FRAMES")) {
+        char file[128];
+        SDL_snprintf(file, sizeof(file), "SDL_window%d-%8.8d.bmp",
+                     SDL_GetWindowID(window), ++frame_number);
+        SDL_SaveBMP(surface, file);
+    }
+    return 0;
+}
+
+void SDL_WINRT_DestroyWindowFramebuffer(_THIS, SDL_Window * window)
+{
+    SDL_Surface *surface;
+
+    surface = (SDL_Surface *) SDL_SetWindowData(window, WINRT_SURFACE, NULL);
+    if (surface) {
+        SDL_FreeSurface(surface);
+    }
+}
+
+#endif /* SDL_VIDEO_DRIVER_WINRT */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/windowsrt/SDL_winrtvideo.c	Sat Oct 27 22:57:07 2012 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-/*
-  Simple DirectMedia Layer
-  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-*/
-#include "SDL_config.h"
-
-#if SDL_VIDEO_DRIVER_WINRT
-
-/* WinRT SDL video driver implementation
-
-   Initial work on this was done by David Ludwig (dludwig@pobox.com), and
-   was based off of SDL's "dummy" video driver.
- */
-
-#include "SDL_video.h"
-#include "SDL_mouse.h"
-#include "../SDL_sysvideo.h"
-#include "../SDL_pixels_c.h"
-#include "../../events/SDL_events_c.h"
-
-#include "SDL_winrtvideo.h"
-#include "SDL_winrtevents_c.h"
-#include "SDL_winrtframebuffer_c.h"
-
-#define WINRTVID_DRIVER_NAME "dummy"
-
-/* Initialization/Query functions */
-static int WINRT_VideoInit(_THIS);
-static int WINRT_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
-static void WINRT_VideoQuit(_THIS);
-
-/* WinRT driver bootstrap functions */
-
-static int
-WINRT_Available(void)
-{
-    return (1);
-}
-
-static void
-WINRT_DeleteDevice(SDL_VideoDevice * device)
-{
-    SDL_free(device);
-}
-
-static SDL_VideoDevice *
-WINRT_CreateDevice(int devindex)
-{
-    SDL_VideoDevice *device;
-
-    /* Initialize all variables that we clean on shutdown */
-    device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
-    if (!device) {
-        SDL_OutOfMemory();
-        if (device) {
-            SDL_free(device);
-        }
-        return (0);
-    }
-
-    /* Set the function pointers */
-    device->VideoInit = WINRT_VideoInit;
-    device->VideoQuit = WINRT_VideoQuit;
-    device->SetDisplayMode = WINRT_SetDisplayMode;
-    device->PumpEvents = WINRT_PumpEvents;
-    device->CreateWindowFramebuffer = SDL_WINRT_CreateWindowFramebuffer;
-    device->UpdateWindowFramebuffer = SDL_WINRT_UpdateWindowFramebuffer;
-    device->DestroyWindowFramebuffer = SDL_WINRT_DestroyWindowFramebuffer;
-
-    device->free = WINRT_DeleteDevice;
-
-    return device;
-}
-
-VideoBootStrap WINRT_bootstrap = {
-    WINRTVID_DRIVER_NAME, "SDL Windows RT video driver",
-    WINRT_Available, WINRT_CreateDevice
-};
-
-
-int
-WINRT_VideoInit(_THIS)
-{
-    SDL_DisplayMode mode;
-
-    /* Use a fake 32-bpp desktop mode */
-    mode.format = SDL_PIXELFORMAT_RGB888;
-    mode.w = 1024;
-    mode.h = 768;
-    mode.refresh_rate = 0;
-    mode.driverdata = NULL;
-    if (SDL_AddBasicVideoDisplay(&mode) < 0) {
-        return -1;
-    }
-
-    SDL_zero(mode);
-    SDL_AddDisplayMode(&_this->displays[0], &mode);
-
-    /* We're done! */
-    return 0;
-}
-
-static int
-WINRT_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
-{
-    return 0;
-}
-
-void
-WINRT_VideoQuit(_THIS)
-{
-}
-
-#endif /* SDL_VIDEO_DRIVER_WINRT */
-
-/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windowsrt/SDL_winrtvideo.cpp	Sun Oct 28 18:45:33 2012 -0400
@@ -0,0 +1,128 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+#if SDL_VIDEO_DRIVER_WINRT
+
+/* WinRT SDL video driver implementation
+
+   Initial work on this was done by David Ludwig (dludwig@pobox.com), and
+   was based off of SDL's "dummy" video driver.
+ */
+
+extern "C" {
+#include "SDL_video.h"
+#include "SDL_mouse.h"
+#include "../SDL_sysvideo.h"
+#include "../SDL_pixels_c.h"
+#include "../../events/SDL_events_c.h"
+}
+
+#include "SDL_WinRTApp.h"
+#include "SDL_winrtvideo.h"
+#include "SDL_winrtevents_c.h"
+#include "SDL_winrtframebuffer_c.h"
+
+#define WINRTVID_DRIVER_NAME "dummy"
+
+/* Initialization/Query functions */
+static int WINRT_VideoInit(_THIS);
+static int WINRT_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
+static void WINRT_VideoQuit(_THIS);
+
+/* WinRT driver bootstrap functions */
+
+static int
+WINRT_Available(void)
+{
+    return (1);
+}
+
+static void
+WINRT_DeleteDevice(SDL_VideoDevice * device)
+{
+    SDL_free(device);
+}
+
+static SDL_VideoDevice *
+WINRT_CreateDevice(int devindex)
+{
+    SDL_VideoDevice *device;
+
+    /* Initialize all variables that we clean on shutdown */
+    device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
+    if (!device) {
+        SDL_OutOfMemory();
+        if (device) {
+            SDL_free(device);
+        }
+        return (0);
+    }
+
+    /* Set the function pointers */
+    device->VideoInit = WINRT_VideoInit;
+    device->VideoQuit = WINRT_VideoQuit;
+    device->SetDisplayMode = WINRT_SetDisplayMode;
+    device->PumpEvents = WINRT_PumpEvents;
+    device->CreateWindowFramebuffer = SDL_WINRT_CreateWindowFramebuffer;
+    device->UpdateWindowFramebuffer = SDL_WINRT_UpdateWindowFramebuffer;
+    device->DestroyWindowFramebuffer = SDL_WINRT_DestroyWindowFramebuffer;
+
+    device->free = WINRT_DeleteDevice;
+
+    return device;
+}
+
+VideoBootStrap WINRT_bootstrap = {
+    WINRTVID_DRIVER_NAME, "SDL Windows RT video driver",
+    WINRT_Available, WINRT_CreateDevice
+};
+
+extern SDL_WinRTApp ^ SDL_WinRTGlobalApp;
+
+int
+WINRT_VideoInit(_THIS)
+{
+    SDL_DisplayMode mode = SDL_WinRTGlobalApp->GetMainDisplayMode();
+    if (SDL_AddBasicVideoDisplay(&mode) < 0) {
+        return -1;
+    }
+
+    SDL_AddDisplayMode(&_this->displays[0], &mode);
+
+    /* We're done! */
+    return 0;
+}
+
+static int
+WINRT_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
+{
+    return 0;
+}
+
+void
+WINRT_VideoQuit(_THIS)
+{
+}
+
+#endif /* SDL_VIDEO_DRIVER_WINRT */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/windowsrt/SDL_winrtvideo.h	Sat Oct 27 22:57:07 2012 -0400
+++ b/src/video/windowsrt/SDL_winrtvideo.h	Sun Oct 28 18:45:33 2012 -0400
@@ -23,8 +23,16 @@
 #ifndef _SDL_winrtvideo_h
 #define _SDL_winrtvideo_h
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "../SDL_sysvideo.h"
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* _SDL_winrtvideo_h */
 
 /* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/windowsrt/SDLmain_WinRT_common.h	Sat Oct 27 22:57:07 2012 -0400
+++ b/src/video/windowsrt/SDLmain_WinRT_common.h	Sun Oct 28 18:45:33 2012 -0400
@@ -4,4 +4,9 @@
 #include <d3d11_1.h>
 #include <DirectXMath.h>
 #include <memory>
-#include <agile.h>
\ No newline at end of file
+#include <agile.h>
+#include <vector>
+
+extern "C" {
+#include "../SDL_sysvideo.h"
+}