Skip to content

Commit 109c112

Browse files
committed
winMain.h
1 parent cea08ec commit 109c112

File tree

4 files changed

+90
-6
lines changed

4 files changed

+90
-6
lines changed

sources/CMakeLists.txt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,6 @@ file(GLOB_RECURSE cage-engine-sources "libengine/*" "include/cage-engine/*")
7777
add_library(cage-engine SHARED ${cage-engine-sources})
7878
target_link_libraries(cage-engine PRIVATE cubeb glfw openxr_loader)
7979
target_link_libraries(cage-engine PUBLIC cage-core glad)
80-
if(WIN32)
81-
set_source_files_properties(libengine/virtualReality/platforms.cpp PROPERTIES COMPILE_DEFINITIONS "XR_USE_PLATFORM_WIN32")
82-
else()
83-
# todo
84-
endif()
8580
file(GLOB_RECURSE controller-bindings RELATIVE "${CMAKE_CURRENT_LIST_DIR}" "controller-bindings/*")
8681
set(index 0)
8782
foreach(cb IN ITEMS ${controller-bindings})
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#ifndef guard_winMain_h_jh4ser564uj
2+
#define guard_winMain_h_jh4ser564uj
3+
4+
#include <cage-engine/core.h>
5+
6+
#ifdef _WIN32
7+
8+
#ifndef VC_EXTRALEAN
9+
#define VC_EXTRALEAN
10+
#endif
11+
#ifndef NOMINMAX
12+
#define NOMINMAX
13+
#endif
14+
#include <windows.h>
15+
16+
namespace cage
17+
{
18+
namespace privat
19+
{
20+
CAGE_ENGINE_API std::pair<int, const char **> winMainParams();
21+
}
22+
}
23+
24+
int main(int argc, const char *args[]);
25+
26+
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
27+
{
28+
const auto cmd = ::cage::privat::winMainParams();
29+
return ::main(cmd.first, cmd.second);
30+
}
31+
#endif
32+
#endif

sources/libengine/virtualReality/platforms.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#endif
55
#include <Windows.h>
66
#pragma comment(lib, "opengl32") // wglGetCurrentDC
7+
#define XR_USE_PLATFORM_WIN32
78
#endif // CAGE_SYSTEM_WINDOWS
89

910
#define XR_USE_GRAPHICS_API_OPENGL
@@ -51,7 +52,7 @@ namespace cage
5152

5253
#else
5354

54-
CAGE_THROW_CRITICAL(Exception, "openxr currently works on windows only");
55+
CAGE_THROW_CRITICAL(Exception, "cage openxr currently works on windows only");
5556

5657
char binding[100] = {}; // dummy structure to allow compiling
5758
//XrGraphicsBindingOpenGLXlibKHR binding;

sources/libengine/winMain.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#ifdef _WIN32
2+
3+
#include <cage-engine/core.h>
4+
5+
#ifndef VC_EXTRALEAN
6+
#define VC_EXTRALEAN
7+
#endif
8+
#ifndef NOMINMAX
9+
#define NOMINMAX
10+
#endif
11+
#include <windows.h>
12+
13+
namespace cage
14+
{
15+
namespace privat
16+
{
17+
CAGE_API_EXPORT std::pair<int, const char **> winMainParams()
18+
{
19+
using namespace cage;
20+
21+
CAGE_LOG(SeverityEnum::Info, "cage-engine", "winMain parsing parameters");
22+
23+
static int consoleDummy = []()
24+
{
25+
AllocConsole(); // allocate new console for sub-programs
26+
ShowWindow(GetConsoleWindow(), SW_HIDE);
27+
return 0;
28+
}();
29+
(void)consoleDummy;
30+
31+
LPWSTR cmdLine = GetCommandLineW();
32+
int argc;
33+
LPWSTR *argvW = CommandLineToArgvW(cmdLine, &argc);
34+
35+
if (argvW == nullptr)
36+
{
37+
static_assert(sizeof(DWORD) == sizeof(uint32));
38+
CAGE_LOG_THROW(Stringizer() + "error code: " + (uint32)GetLastError());
39+
CAGE_THROW_CRITICAL(Exception, "failed to convert command line arguments to an array (CommandLineToArgvW)");
40+
}
41+
42+
// convert wide char to multibyte
43+
char **argv = new char *[argc];
44+
for (int i = 0; i < argc; i++)
45+
{
46+
size_t len = wcslen(argvW[i]) + 1;
47+
argv[i] = new char[len];
48+
wcstombs(argv[i], argvW[i], len);
49+
}
50+
51+
return { argc, (const char **)argv };
52+
}
53+
}
54+
}
55+
56+
#endif

0 commit comments

Comments
 (0)