From 781340db636247f189f9a29aeb1caf733992e0ab Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Sun, 28 Oct 2012 18:45:33 -0400 Subject: [PATCH] WinRT: made the device's screen size be retrieve-able via SDL_GetDisplayMode() --- VisualC/SDL/SDL_VS2012_WinRT.vcxproj | 13 +++++-- src/video/windowsrt/SDL_WinRTApp.cpp | 38 ++++++++++++++++++- src/video/windowsrt/SDL_WinRTApp.h | 7 ++++ ...{SDL_winrtevents.c => SDL_winrtevents.cpp} | 0 ...framebuffer.c => SDL_winrtframebuffer.cpp} | 0 .../{SDL_winrtvideo.c => SDL_winrtvideo.cpp} | 28 ++++++-------- src/video/windowsrt/SDL_winrtvideo.h | 8 ++++ src/video/windowsrt/SDLmain_WinRT_common.h | 7 +++- 8 files changed, 80 insertions(+), 21 deletions(-) rename src/video/windowsrt/{SDL_winrtevents.c => SDL_winrtevents.cpp} (100%) rename src/video/windowsrt/{SDL_winrtframebuffer.c => SDL_winrtframebuffer.cpp} (100%) rename src/video/windowsrt/{SDL_winrtvideo.c => SDL_winrtvideo.cpp} (93%) diff --git a/VisualC/SDL/SDL_VS2012_WinRT.vcxproj b/VisualC/SDL/SDL_VS2012_WinRT.vcxproj index e8cb1f0c8..350b25fc6 100644 --- a/VisualC/SDL/SDL_VS2012_WinRT.vcxproj +++ b/VisualC/SDL/SDL_VS2012_WinRT.vcxproj @@ -125,9 +125,16 @@ true true - - - + + + + true + true + true + true + true + true + diff --git a/src/video/windowsrt/SDL_WinRTApp.cpp b/src/video/windowsrt/SDL_WinRTApp.cpp index f02192242..343273611 100644 --- a/src/video/windowsrt/SDL_WinRTApp.cpp +++ b/src/video/windowsrt/SDL_WinRTApp.cpp @@ -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 @@ void SDL_WinRTApp::OnResuming(Platform::Object^ sender, Platform::Object^ args) // 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) diff --git a/src/video/windowsrt/SDL_WinRTApp.h b/src/video/windowsrt/SDL_WinRTApp.h index cf6e88957..866da4be6 100644 --- a/src/video/windowsrt/SDL_WinRTApp.h +++ b/src/video/windowsrt/SDL_WinRTApp.h @@ -2,6 +2,9 @@ #include "SDLmain_WinRT_common.h" #include "CubeRenderer.h" +#include + +using namespace Windows::UI::Core; ref class SDL_WinRTApp sealed : public Windows::ApplicationModel::Core::IFrameworkView { @@ -15,6 +18,10 @@ ref class SDL_WinRTApp sealed : public Windows::ApplicationModel::Core::IFramewo 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); diff --git a/src/video/windowsrt/SDL_winrtevents.c b/src/video/windowsrt/SDL_winrtevents.cpp similarity index 100% rename from src/video/windowsrt/SDL_winrtevents.c rename to src/video/windowsrt/SDL_winrtevents.cpp diff --git a/src/video/windowsrt/SDL_winrtframebuffer.c b/src/video/windowsrt/SDL_winrtframebuffer.cpp similarity index 100% rename from src/video/windowsrt/SDL_winrtframebuffer.c rename to src/video/windowsrt/SDL_winrtframebuffer.cpp diff --git a/src/video/windowsrt/SDL_winrtvideo.c b/src/video/windowsrt/SDL_winrtvideo.cpp similarity index 93% rename from src/video/windowsrt/SDL_winrtvideo.c rename to src/video/windowsrt/SDL_winrtvideo.cpp index 7fdcb64f7..f084cbfd5 100644 --- a/src/video/windowsrt/SDL_winrtvideo.c +++ b/src/video/windowsrt/SDL_winrtvideo.cpp @@ -28,12 +28,15 @@ 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" @@ -93,26 +96,19 @@ VideoBootStrap WINRT_bootstrap = { WINRT_Available, WINRT_CreateDevice }; +extern SDL_WinRTApp ^ SDL_WinRTGlobalApp; 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! */ + SDL_DisplayMode mode = SDL_WinRTGlobalApp->GetMainDisplayMode(); + if (SDL_AddBasicVideoDisplay(&mode) < 0) { + return -1; + } + + SDL_AddDisplayMode(&_this->displays[0], &mode); + + /* We're done! */ return 0; } diff --git a/src/video/windowsrt/SDL_winrtvideo.h b/src/video/windowsrt/SDL_winrtvideo.h index 6490b31e0..add24c234 100644 --- a/src/video/windowsrt/SDL_winrtvideo.h +++ b/src/video/windowsrt/SDL_winrtvideo.h @@ -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: */ diff --git a/src/video/windowsrt/SDLmain_WinRT_common.h b/src/video/windowsrt/SDLmain_WinRT_common.h index a07dd0cdd..5e50662ab 100644 --- a/src/video/windowsrt/SDLmain_WinRT_common.h +++ b/src/video/windowsrt/SDLmain_WinRT_common.h @@ -4,4 +4,9 @@ #include #include #include -#include \ No newline at end of file +#include +#include + +extern "C" { +#include "../SDL_sysvideo.h" +}