Add more UWP support (nw)

This commit is contained in:
Miodrag Milanovic 2016-11-09 15:44:44 +01:00
parent f9f30e95ef
commit cddd8bbe7a
6 changed files with 54 additions and 12 deletions

View File

@ -233,8 +233,12 @@ if (STANDALONE~=true) then
links { links {
ext_lib("lua"), ext_lib("lua"),
"lualibs", "lualibs",
}
if (_OPTIONS["osd"] ~= "uwp") then
links {
"linenoise-ng", "linenoise-ng",
} }
end
end end
links { links {
ext_lib("zlib"), ext_lib("zlib"),

View File

@ -13,10 +13,10 @@
#if (USE_OPENGL) #if (USE_OPENGL)
#include "render/drawogl.h" #include "render/drawogl.h"
#endif #endif
#ifdef OSD_WINDOWS #if defined(OSD_WINDOWS)
#include "render/drawgdi.h" #include "render/drawgdi.h"
#include "render/drawd3d.h" #include "render/drawd3d.h"
#else #elif defined(OSD_SDL)
#include "render/draw13.h" #include "render/draw13.h"
#include "render/drawsdl.h" #include "render/drawsdl.h"
#endif #endif
@ -30,7 +30,7 @@ std::unique_ptr<osd_renderer> osd_renderer::make_for_type(int mode, std::shared_
{ {
switch(mode) switch(mode)
{ {
#ifdef OSD_WINDOWS #if defined(OSD_WINDOWS) || defined(OSD_UWP)
case VIDEO_MODE_NONE: case VIDEO_MODE_NONE:
return std::make_unique<renderer_none>(window); return std::make_unique<renderer_none>(window);
#endif #endif
@ -40,12 +40,12 @@ std::unique_ptr<osd_renderer> osd_renderer::make_for_type(int mode, std::shared_
case VIDEO_MODE_OPENGL: case VIDEO_MODE_OPENGL:
return std::make_unique<renderer_ogl>(window); return std::make_unique<renderer_ogl>(window);
#endif #endif
#ifdef OSD_WINDOWS #if defined(OSD_WINDOWS)
case VIDEO_MODE_GDI: case VIDEO_MODE_GDI:
return std::make_unique<renderer_gdi>(window); return std::make_unique<renderer_gdi>(window);
case VIDEO_MODE_D3D: case VIDEO_MODE_D3D:
return std::make_unique<renderer_d3d9>(window); return std::make_unique<renderer_d3d9>(window);
#else #elif defined(OSD_SDL)
case VIDEO_MODE_SDL2ACCEL: case VIDEO_MODE_SDL2ACCEL:
return std::make_unique<renderer_sdl2>(window, extra_flags); return std::make_unique<renderer_sdl2>(window, extra_flags);
case VIDEO_MODE_SOFT: case VIDEO_MODE_SOFT:

View File

@ -21,13 +21,15 @@
#include <windowsx.h> #include <windowsx.h>
#include <mmsystem.h> #include <mmsystem.h>
#endif #endif
#undef min
#undef max
#ifdef OSD_SDL #ifdef OSD_SDL
// forward declaration // forward declaration
struct SDL_Window; struct SDL_Window;
#elif defined(OSD_UWP)
#include <Agile.h>
#endif #endif
#undef min
#undef max
//============================================================ //============================================================
// TYPE DEFINITIONS // TYPE DEFINITIONS
@ -71,7 +73,7 @@ class osd_window : public std::enable_shared_from_this<osd_window>
public: public:
osd_window(const osd_window_config &config) osd_window(const osd_window_config &config)
: :
#ifndef OSD_SDL #ifdef OSD_WINDOW
m_dc(nullptr), m_resize_state(0), m_dc(nullptr), m_resize_state(0),
#endif #endif
m_primlist(nullptr), m_primlist(nullptr),
@ -136,14 +138,16 @@ public:
virtual void update() = 0; virtual void update() = 0;
virtual void destroy() = 0; virtual void destroy() = 0;
#ifndef OSD_SDL #ifdef OSD_WINDOWS
virtual bool win_has_menu() = 0; virtual bool win_has_menu() = 0;
HDC m_dc; // only used by GDI renderer! HDC m_dc; // only used by GDI renderer!
int m_resize_state; int m_resize_state;
#elif OSD_UWP
virtual bool win_has_menu() = 0;
Platform::Agile<Windows::UI::Core::CoreWindow^> m_window;
#endif #endif
render_primitive_list *m_primlist; render_primitive_list *m_primlist;
osd_window_config m_win_config; osd_window_config m_win_config;
int m_index; int m_index;

View File

@ -5,7 +5,7 @@
// drawbgfx.cpp - BGFX renderer // drawbgfx.cpp - BGFX renderer
// //
//============================================================ //============================================================
#if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) #if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) || defined(OSD_UWP)
// standard windows headers // standard windows headers
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
@ -133,7 +133,7 @@ inline void winSetHwnd(::HWND _window)
pd.backBufferDS = NULL; pd.backBufferDS = NULL;
bgfx::setPlatformData(pd); bgfx::setPlatformData(pd);
} }
#else #elif defined(OSD_SDL)
static void* sdlNativeWindowHandle(SDL_Window* _window) static void* sdlNativeWindowHandle(SDL_Window* _window)
{ {
SDL_SysWMinfo wmi; SDL_SysWMinfo wmi;
@ -186,6 +186,22 @@ inline bool sdlSetWindow(SDL_Window* _window)
return true; return true;
} }
#elif defined(OSD_UWP)
inline void winrtSetWindow(::IUnknown* _window)
{
bgfx::PlatformData pd;
pd.ndt = NULL;
pd.nwh = _window;
pd.context = NULL;
pd.backBuffer = NULL;
pd.backBufferDS = NULL;
bgfx::setPlatformData(pd);
}
IInspectable* AsInspectable(Platform::Object^ o)
{
return reinterpret_cast<IInspectable*>(o);
}
#endif #endif
int renderer_bgfx::create() int renderer_bgfx::create()
@ -211,6 +227,8 @@ int renderer_bgfx::create()
} }
#ifdef OSD_WINDOWS #ifdef OSD_WINDOWS
winSetHwnd(win->platform_window<HWND>()); winSetHwnd(win->platform_window<HWND>());
#elif defined(OSD_UWP)
winrtSetWindow(AsInspectable(win->m_window.Get()));
#else #else
sdlSetWindow(win->platform_window<SDL_Window*>()); sdlSetWindow(win->platform_window<SDL_Window*>());
#endif #endif
@ -260,6 +278,8 @@ int renderer_bgfx::create()
{ {
#ifdef OSD_WINDOWS #ifdef OSD_WINDOWS
m_framebuffer = m_targets->create_backbuffer(win->platform_window<HWND>(), m_width[win->m_index], m_height[win->m_index]); m_framebuffer = m_targets->create_backbuffer(win->platform_window<HWND>(), m_width[win->m_index], m_height[win->m_index]);
#elif defined(OSD_UWP)
m_framebuffer = m_targets->create_backbuffer(&win->m_window, m_width[win->m_index], m_height[win->m_index]);
#else #else
m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(win->platform_window<SDL_Window*>()), m_width[win->m_index], m_height[win->m_index]); m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(win->platform_window<SDL_Window*>()), m_width[win->m_index], m_height[win->m_index]);
#endif #endif
@ -899,6 +919,8 @@ bool renderer_bgfx::update_dimensions()
delete m_framebuffer; delete m_framebuffer;
#ifdef OSD_WINDOWS #ifdef OSD_WINDOWS
m_framebuffer = m_targets->create_backbuffer(win->platform_window<HWND>(), width, height); m_framebuffer = m_targets->create_backbuffer(win->platform_window<HWND>(), width, height);
#elif defined(OSD_UWP)
m_framebuffer = m_targets->create_backbuffer(&win->m_window, width, height);
#else #else
m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(win->platform_window<SDL_Window*>()), width, height); m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(win->platform_window<SDL_Window*>()), width, height);
#endif #endif

View File

@ -26,7 +26,15 @@ render_primitive_list *renderer_none::get_primitives()
return nullptr; return nullptr;
RECT client; RECT client;
#if defined(OSD_WINDOWS)
GetClientRect(win->platform_window<HWND>(), &client); GetClientRect(win->platform_window<HWND>(), &client);
#elif defined(OSD_UWP)
auto bounds = win->m_window->Bounds;
client.left = bounds.Left;
client.right = bounds.Right;
client.top = bounds.Top;
client.bottom = bounds.Bottom;
#endif
win->target()->set_bounds(rect_width(&client), rect_height(&client), win->pixel_aspect()); win->target()->set_bounds(rect_width(&client), rect_height(&client), win->pixel_aspect());
return &win->target()->get_primitives(); return &win->target()->get_primitives();
} }

View File

@ -107,7 +107,11 @@ void osd_subst_env(std::string &dst, const std::string &src)
TCHAR buffer[MAX_PATH]; TCHAR buffer[MAX_PATH];
osd::text::tstring t_src = osd::text::to_tstring(src); osd::text::tstring t_src = osd::text::to_tstring(src);
#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
ExpandEnvironmentStrings(t_src.c_str(), buffer, ARRAY_LENGTH(buffer)); ExpandEnvironmentStrings(t_src.c_str(), buffer, ARRAY_LENGTH(buffer));
#else
wcsncpy(buffer, t_src.c_str(), ARRAY_LENGTH(buffer));
#endif
osd::text::from_tstring(dst, buffer); osd::text::from_tstring(dst, buffer);
} }