From 655d795a9d3f84a18fc218d032c58a2f0016cb8a Mon Sep 17 00:00:00 2001 From: fallenoak Date: Tue, 3 Jan 2023 00:45:25 -0600 Subject: [PATCH] feat(app): add windows app --- .github/workflows/pr.yml | 7 +++++++ .github/workflows/push.yml | 7 +++++++ CMakeLists.txt | 24 ++++++++++++++++++---- src/app/CMakeLists.txt | 20 +++++++++++++++---- src/app/win/Whoa.cpp | 11 ++++++++++ src/event/Input.cpp | 13 ++++++++---- src/event/Scheduler.cpp | 2 +- src/gx/CGxDevice.cpp | 30 ++++++++++++++++++---------- src/gx/CGxDevice.hpp | 8 ++++++-- src/gx/Window.cpp | 2 +- src/gx/Window.hpp | 12 ++++++++--- src/gx/font/CGxString.cpp | 1 + src/net/CMakeLists.txt | 8 ++++++++ src/net/connection/WowConnection.cpp | 26 +++++++++++++++++------- src/util/BlizzardCore.cpp | 9 ++++++++- src/util/BlizzardCore.hpp | 30 +++++++++++++++------------- src/util/SFile.cpp | 17 ++++++++-------- test/CMakeLists.txt | 7 ++----- vendor/freetype-2.0.9/CMakeLists.txt | 4 +++- vendor/lua-5.1.3/CMakeLists.txt | 4 +++- 20 files changed, 176 insertions(+), 66 deletions(-) create mode 100644 src/app/win/Whoa.cpp diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 2e1609d..0b49682 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -25,6 +25,13 @@ jobs: cc: clang cxx: clang++ + - name: Windows Latest (MSVC) + os: windows-latest + build_type: Release + test_path: Release/WhoaTest + cc: cl + cxx: cl + steps: - uses: actions/checkout@v3 with: diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 451caa7..69fc1c2 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -28,6 +28,13 @@ jobs: cc: clang cxx: clang++ + - name: Windows Latest (MSVC) + os: windows-latest + build_type: Release + test_path: Release/WhoaTest + cc: cl + cxx: cl + steps: - uses: actions/checkout@v3 with: diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c2e992..4f87386 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,18 +26,34 @@ set(CMAKE_CXX_STANDARD 11) set(CMAKE_BUILD_TYPE Debug) +include(lib/system/cmake/system.cmake) + # Some templates abuse offsetof -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-invalid-offsetof") +if(WHOA_SYSTEM_LINUX OR WHOA_SYSTEM_MAC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-invalid-offsetof") +endif() # OS defines -if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") +if(WHOA_SYSTEM_WIN) + # Avoid win32 header hell + add_compile_definitions( + NOMINMAX + WIN32_LEAN_AND_MEAN + ) + + # Lua uses various "unsafe" C functions + add_definitions( + -D_CRT_SECURE_NO_WARNINGS + ) +endif() + +if(WHOA_SYSTEM_MAC) + # Suppress OpenGL deprecation warnings add_definitions( -DGL_SILENCE_DEPRECATION ) endif() -include(lib/system/cmake/system.cmake) - # Threads if(WHOA_SYSTEM_LINUX OR WHOA_SYSTEM_MAC) set(CMAKE_THREAD_PREFER_PTHREAD TRUE) diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index acc0c2a..ebcaf01 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -1,3 +1,18 @@ +if(WHOA_SYSTEM_WIN) + file(GLOB PRIVATE_SOURCES "win/*.cpp") + + add_executable(Whoa ${PRIVATE_SOURCES}) + + target_link_libraries(Whoa + PRIVATE + client + event + gx + net + util + ) +endif() + if(WHOA_SYSTEM_MAC) file(GLOB PRIVATE_SOURCES "mac/*.cpp" "mac/*.mm") @@ -42,7 +57,4 @@ target_include_directories(Whoa ${CMAKE_SOURCE_DIR}/src ) -# Windows executables yet to be done -if(WHOA_SYSTEM_MAC OR WHOA_SYSTEM_LINUX) - install(TARGETS Whoa DESTINATION "bin") -endif() +install(TARGETS Whoa DESTINATION "bin") diff --git a/src/app/win/Whoa.cpp b/src/app/win/Whoa.cpp new file mode 100644 index 0000000..0f49342 --- /dev/null +++ b/src/app/win/Whoa.cpp @@ -0,0 +1,11 @@ +#include "client/Client.hpp" + +int main(int argc, char* argv[]) { + // TODO + + CommonMain(); + + // TODO + + return 0; +} diff --git a/src/event/Input.cpp b/src/event/Input.cpp index decc02d..6ce998c 100644 --- a/src/event/Input.cpp +++ b/src/event/Input.cpp @@ -9,6 +9,10 @@ #include #include +#if defined(WHOA_SYSTEM_WIN) +#include +#endif + #if defined(WHOA_SYSTEM_MAC) #include "app/mac/MacClient.h" #endif @@ -327,7 +331,7 @@ void ConvertPosition(int32_t clientx, int32_t clienty, float* x, float* y) { } } - tagRECT windowDim; + RECT windowDim; OsGetDefaultWindowRect(&windowDim); *x = static_cast(clientx) / static_cast(windowDim.right - windowDim.left); @@ -565,6 +569,7 @@ const char* KeyCodeToString(KEY key) { int32_t OsInputGet(OSINPUT* id, int32_t* param0, int32_t* param1, int32_t* param2, int32_t* param3) { #if defined(WHOA_SYSTEM_WIN) // TODO + return 0; #endif #if defined(WHOA_SYSTEM_MAC) @@ -592,9 +597,9 @@ int32_t OsInputGet(OSINPUT* id, int32_t* param0, int32_t* param1, int32_t* param void OsInputInitialize() { #if defined(WHOA_SYSTEM_WIN) Input::s_numlockState = GetAsyncKeyState(144); - PVOID pvParam = 10; - SystemParametersInfoA(SPI_GETMOUSESPEED, 0, &pvParam, 0); - Input::s_savedMouseSpeed = pvParam; + int32_t mouseSpeed = 10; + SystemParametersInfoA(SPI_GETMOUSESPEED, 0, &mouseSpeed, 0); + Input::s_savedMouseSpeed = mouseSpeed; #endif #if defined(WHOA_SYSTEM_MAC) diff --git a/src/event/Scheduler.cpp b/src/event/Scheduler.cpp index 0fe2023..b3e461c 100644 --- a/src/event/Scheduler.cpp +++ b/src/event/Scheduler.cpp @@ -134,7 +134,7 @@ void IEvtSchedulerProcess() { #if defined(WHOA_SYSTEM_WIN) Event::s_startEvent.Set(); - SchedulerThreadProc(1); + SchedulerThreadProc(reinterpret_cast(1)); Event::s_mainThread = 0; #endif diff --git a/src/gx/CGxDevice.cpp b/src/gx/CGxDevice.cpp index 9adced0..510f4c3 100644 --- a/src/gx/CGxDevice.cpp +++ b/src/gx/CGxDevice.cpp @@ -70,18 +70,28 @@ uint32_t CGxDevice::s_texFormatBytesPerBlock[] = { 4 // GxTex_D24X8 }; -CGxDevice* CGxDevice::NewGLL() { - #if defined(WHOA_SYSTEM_MAC) - void* m = SMemAlloc(sizeof(CGxDeviceGLL), __FILE__, __LINE__, 0); - - if (m) { - return new (m) CGxDeviceGLL(); - } else { - return nullptr; - } - #endif +CGxDevice* CGxDevice::NewD3d() { + // TODO + return nullptr; } +CGxDevice* CGxDevice::NewD3d9Ex() { + // TODO + return nullptr; +} + +#if defined(WHOA_SYSTEM_MAC) +CGxDevice* CGxDevice::NewGLL() { + void* m = SMemAlloc(sizeof(CGxDeviceGLL), __FILE__, __LINE__, 0); + + if (m) { + return new (m) CGxDeviceGLL(); + } else { + return nullptr; + } +} +#endif + CGxDevice* CGxDevice::NewOpenGl() { // TODO // void* m = SMemAlloc(sizeof(CGxDeviceOpenGl), __FILE__, __LINE__, 0); diff --git a/src/gx/CGxDevice.hpp b/src/gx/CGxDevice.hpp index 8c31fa5..ba2fa63 100644 --- a/src/gx/CGxDevice.hpp +++ b/src/gx/CGxDevice.hpp @@ -46,8 +46,12 @@ class CGxDevice { static uint32_t s_texFormatBytesPerBlock[]; // Static functions - static CGxDevice* NewGLL(void); - static CGxDevice* NewOpenGl(void); + static CGxDevice* NewD3d(); + static CGxDevice* NewD3d9Ex(); +#if defined(WHOA_SYSTEM_MAC) + static CGxDevice* NewGLL(); +#endif + static CGxDevice* NewOpenGl(); // Member variables TSGrowableArray m_pushedStates; diff --git a/src/gx/Window.cpp b/src/gx/Window.cpp index b00f488..aa6c6b9 100644 --- a/src/gx/Window.cpp +++ b/src/gx/Window.cpp @@ -5,7 +5,7 @@ bool s_forceOnscreen; Rect s_savedWindowRect; Rect s_savedWindowZoomedRect; -int32_t OsGetDefaultWindowRect(tagRECT* rect) { +int32_t OsGetDefaultWindowRect(RECT* rect) { auto window = g_theGxDevicePtr->DeviceDefWindow(); rect->left = window.minX; diff --git a/src/gx/Window.hpp b/src/gx/Window.hpp index 0a188be..19a14e1 100644 --- a/src/gx/Window.hpp +++ b/src/gx/Window.hpp @@ -3,6 +3,10 @@ #include +#if defined(WHOA_SYSTEM_WIN) +#include +#endif + #if defined(WHOA_SYSTEM_MAC) #include #endif @@ -16,14 +20,16 @@ struct Rect { }; #endif -struct tagRECT { +#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) +typedef struct tagRECT { int32_t left; int32_t top; int32_t right; int32_t bottom; -}; +} RECT; +#endif -int32_t OsGetDefaultWindowRect(tagRECT* rect); +int32_t OsGetDefaultWindowRect(RECT* rect); Rect* GetSavedWindowBounds(); diff --git a/src/gx/font/CGxString.cpp b/src/gx/font/CGxString.cpp index 1e7a0a1..92f9ba0 100644 --- a/src/gx/font/CGxString.cpp +++ b/src/gx/font/CGxString.cpp @@ -602,6 +602,7 @@ void CGxString::SetColor(const CImVector& color) { int32_t CGxString::SetGradient(int32_t startCharacter, int32_t length) { // TODO + return 0; } void CGxString::SetStringPosition(const C3Vector& position) { diff --git a/src/net/CMakeLists.txt b/src/net/CMakeLists.txt index 7aba042..5b33077 100644 --- a/src/net/CMakeLists.txt +++ b/src/net/CMakeLists.txt @@ -17,3 +17,11 @@ target_link_libraries(net common storm ) + +if(WHOA_SYSTEM_WIN) + target_link_libraries(net + PUBLIC + ws2_32 + wsock32 + ) +endif() diff --git a/src/net/connection/WowConnection.cpp b/src/net/connection/WowConnection.cpp index 4a88f62..bc814ce 100644 --- a/src/net/connection/WowConnection.cpp +++ b/src/net/connection/WowConnection.cpp @@ -21,6 +21,7 @@ #if defined(WHOA_SYSTEM_WIN) #include +#include #endif uint64_t WowConnection::s_countTotalBytes; @@ -108,7 +109,11 @@ void WowConnection::CheckAccept() { getpeername(sock, reinterpret_cast(&verifyAddr), &verifyAddrLen); if (!WowConnection::s_verifyAddr(&verifyAddr)) { +#if defined(WHOA_SYSTEM_WIN) + closesocket(sock); +#elif defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) close(sock); +#endif continue; } } @@ -116,7 +121,12 @@ void WowConnection::CheckAccept() { // TODO // RegisterSocket(sock); +#if defined(WHOA_SYSTEM_WIN) + u_long mode = 1; + ioctlsocket(sock, FIONBIO, &mode); +#elif defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) fcntl(sock, F_SETFL, O_NONBLOCK); +#endif auto connMem = SMemAlloc(sizeof(WowConnection), __FILE__, __LINE__, 0x0); auto conn = new (connMem) WowConnection(sock, reinterpret_cast(&addr), this->m_response); @@ -147,7 +157,7 @@ void WowConnection::CheckAccept() { void WowConnection::CheckConnect() { int32_t err; socklen_t errLen = sizeof(err); - if (getsockopt(this->m_sock, SOL_SOCKET, SO_ERROR, &err, &errLen)) { + if (getsockopt(this->m_sock, SOL_SOCKET, SO_ERROR, reinterpret_cast(&err), &errLen)) { return; } @@ -193,9 +203,7 @@ void WowConnection::CheckConnect() { void WowConnection::CloseSocket(int32_t sock) { #if defined(WHOA_SYSTEM_WIN) closesocket(sock); -#endif - -#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) +#elif defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) close(sock); #endif @@ -334,11 +342,15 @@ void WowConnection::DoReads() { void WowConnection::DoStreamReads() { uint32_t startTime = OsGetAsyncTimeMsPrecise(); uint8_t buf[4096]; - uint32_t bytesRead; +#if defined(WHOA_SYSTEM_WIN) + int32_t bytesRead; +#elif defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) + ssize_t bytesRead; +#endif while (1) { while (1) { - bytesRead = recv(this->m_sock, buf, sizeof(buf), 0); + bytesRead = recv(this->m_sock, reinterpret_cast(buf), sizeof(buf), 0); if (bytesRead >= 0) { break; @@ -376,7 +388,7 @@ void WowConnection::DoStreamReads() { bool shouldDisconnect = false; #if defined(WHOA_SYSTEM_WIN) - shouldDisconnect = bytesRead >= 0 || WSAGetLastError() != WSAEAGAIN; + shouldDisconnect = bytesRead >= 0 || WSAGetLastError() != WSAEWOULDBLOCK; #elif defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) shouldDisconnect = bytesRead >= 0 || errno != EAGAIN; #endif diff --git a/src/util/BlizzardCore.cpp b/src/util/BlizzardCore.cpp index 8b8f3db..88c93f9 100644 --- a/src/util/BlizzardCore.cpp +++ b/src/util/BlizzardCore.cpp @@ -10,8 +10,10 @@ #include #endif -bool Blizzard::System_Thread::s_initialized; Blizzard::System_Debug::AssertCallback Blizzard::System_Debug::s_assertCallback = nullptr; + +#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) +bool Blizzard::System_Thread::s_initialized; Blizzard::Lock::DoOnceData Blizzard::System_Lock::s_initMutexAttrOnce; Blizzard::System_Lock::MutexAttr Blizzard::System_Lock::s_mutexattr; Blizzard::Thread::ThreadRecord* Blizzard::System_Thread::s_mainThread; @@ -22,6 +24,7 @@ Blizzard::Thread::TLSSlot Blizzard::System_Thread::s_threadRecordTLS; std::map* Blizzard::System_Thread::s_threadRegistry; Blizzard::Thread::TLSSlot* Blizzard::System_Thread::s_slotList[128]; int32_t Blizzard::System_Thread::s_slotListUsed; +#endif void Blizzard::Debug::Assert(const char* a1, const char* a2, uint32_t a3) { if (System_Debug::s_assertCallback) { @@ -103,14 +106,17 @@ void Blizzard::String::MemFill(void* a1, uint32_t a2, unsigned char a3) { } void Blizzard::Process::Sleep(uint32_t duration) { +#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) struct timespec request; request.tv_sec = 0; request.tv_nsec = duration * 1000000; nanosleep(&request, nullptr); +#endif } +#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) void Blizzard::Lock::DoOnce(DoOnceData& a1, void (*a2)(void*), void* a3) { if (!a1.done) { if (Blizzard::Lock::Atomic::Increment(&a1.atomic) == 1) { @@ -325,3 +331,4 @@ Blizzard::Thread::ThreadRecord* Blizzard::System_Thread::NewThread(uint32_t (*a1 bool Blizzard::System_Thread::TLSSlotIsAllocated(const Thread::TLSSlot* slot) { return slot->allocated; } +#endif diff --git a/src/util/BlizzardCore.hpp b/src/util/BlizzardCore.hpp index 4fd272c..1067e7d 100644 --- a/src/util/BlizzardCore.hpp +++ b/src/util/BlizzardCore.hpp @@ -34,6 +34,21 @@ namespace Blizzard { void Sleep(uint32_t); } + namespace System_Debug { + // Types + typedef void (*AssertCallback)(const char*, const char*, const char*, uint32_t); + + // Variables + extern AssertCallback s_assertCallback; + } + + namespace Debug { + // Functions + void Assert(const char*, const char*, uint32_t); + void SetAssertHandler(Blizzard::System_Debug::AssertCallback); + } + +#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) namespace Lock { // Types typedef pthread_mutex_t Mutex; @@ -54,20 +69,6 @@ namespace Blizzard { } } - namespace System_Debug { - // Types - typedef void (*AssertCallback)(const char*, const char*, const char*, uint32_t); - - // Variables - extern AssertCallback s_assertCallback; - } - - namespace Debug { - // Functions - void Assert(const char*, const char*, uint32_t); - void SetAssertHandler(Blizzard::System_Debug::AssertCallback); - } - namespace System_Lock { // Types typedef pthread_mutexattr_t MutexAttr; @@ -127,6 +128,7 @@ namespace Blizzard { Thread::ThreadRecord* NewThread(uint32_t (*)(void*), void*, const char*); bool TLSSlotIsAllocated(const Thread::TLSSlot*); }; +#endif }; #endif diff --git a/src/util/SFile.cpp b/src/util/SFile.cpp index 5e8bb64..91e5e98 100644 --- a/src/util/SFile.cpp +++ b/src/util/SFile.cpp @@ -2,6 +2,7 @@ #include #include #include +#include // TODO Proper implementation int32_t SFile::Close(SFile* file) { @@ -27,11 +28,11 @@ int32_t SFile::IsStreamingMode() { // TODO Proper implementation int32_t SFile::Load(SArchive* archive, const char* filename, void** buffer, size_t* bytes, size_t extraBytes, uint32_t flags, SOVERLAPPED* overlapped) { - size_t pathlen = strlen(filename); - char path[pathlen]; - strcpy(path, filename); + auto pathLen = SStrLen(filename); + char path[STORM_MAX_PATH]; + SStrCopy(path, filename, sizeof(path)); - for (int32_t i = 0; i < pathlen; ++i) { + for (int32_t i = 0; i < pathLen; ++i) { if (path[i] == '\\') { path[i] = '/'; } @@ -72,11 +73,11 @@ int32_t SFile::Open(const char* filename, SFile** file) { // TODO Proper implementation int32_t SFile::OpenEx(SArchive* archive, const char* filename, uint32_t flags, SFile** file) { - size_t pathlen = strlen(filename); - char path[pathlen]; - strcpy(path, filename); + auto pathLen = SStrLen(filename); + char path[STORM_MAX_PATH]; + SStrCopy(path, filename, sizeof(path)); - for (int32_t i = 0; i < pathlen; ++i) { + for (int32_t i = 0; i < pathLen; ++i) { if (path[i] == '\\') { path[i] = '/'; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 71b2e74..a8f0ab1 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -19,7 +19,7 @@ if(WHOA_SYSTEM_MAC) ) endif() -if(WHOA_SYSTEM_LINUX) +if(WHOA_SYSTEM_WIN OR WHOA_SYSTEM_LINUX) file(GLOB PRIVATE_SOURCES "Test.cpp" "gx/*.cpp" "util/*.cpp") add_executable(WhoaTest ${PRIVATE_SOURCES}) @@ -39,7 +39,4 @@ target_include_directories(WhoaTest ${CMAKE_SOURCE_DIR}/vendor/catch2-2.13.10 ) -# Windows executables yet to be done -if(WHOA_SYSTEM_MAC OR WHOA_SYSTEM_LINUX) - install(TARGETS WhoaTest DESTINATION "bin") -endif() +install(TARGETS WhoaTest DESTINATION "bin") diff --git a/vendor/freetype-2.0.9/CMakeLists.txt b/vendor/freetype-2.0.9/CMakeLists.txt index b3c9c9c..dcf2e94 100644 --- a/vendor/freetype-2.0.9/CMakeLists.txt +++ b/vendor/freetype-2.0.9/CMakeLists.txt @@ -1,4 +1,6 @@ -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations -Wno-empty-body") +if(WHOA_SYSTEM_MAC OR WHOA_SYSTEM_LINUX) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations -Wno-empty-body") +endif() set(FREETYPE_SRC_DIR "./src") set(FREETYPE_INCLUDE_DIR "./include") diff --git a/vendor/lua-5.1.3/CMakeLists.txt b/vendor/lua-5.1.3/CMakeLists.txt index f3ae3ba..9b56085 100644 --- a/vendor/lua-5.1.3/CMakeLists.txt +++ b/vendor/lua-5.1.3/CMakeLists.txt @@ -1,4 +1,6 @@ -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations -Wno-empty-body") +if(WHOA_SYSTEM_MAC OR WHOA_SYSTEM_LINUX) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations -Wno-empty-body") +endif() set(LUA_SRC_DIR "./src")