feat(app): add windows app

This commit is contained in:
fallenoak 2023-01-03 00:45:25 -06:00 committed by GitHub
parent 6bebfe5e2f
commit 655d795a9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 176 additions and 66 deletions

View File

@ -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:

View File

@ -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:

View File

@ -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)

View File

@ -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")

11
src/app/win/Whoa.cpp Normal file
View File

@ -0,0 +1,11 @@
#include "client/Client.hpp"
int main(int argc, char* argv[]) {
// TODO
CommonMain();
// TODO
return 0;
}

View File

@ -9,6 +9,10 @@
#include <tempest/Rect.hpp>
#include <tempest/Vector.hpp>
#if defined(WHOA_SYSTEM_WIN)
#include <windows.h>
#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<float>(clientx) / static_cast<float>(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)

View File

@ -134,7 +134,7 @@ void IEvtSchedulerProcess() {
#if defined(WHOA_SYSTEM_WIN)
Event::s_startEvent.Set();
SchedulerThreadProc(1);
SchedulerThreadProc(reinterpret_cast<void*>(1));
Event::s_mainThread = 0;
#endif

View File

@ -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);

View File

@ -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<CGxPushedRenderState> m_pushedStates;

View File

@ -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;

View File

@ -3,6 +3,10 @@
#include <cstdint>
#if defined(WHOA_SYSTEM_WIN)
#include <windows.h>
#endif
#if defined(WHOA_SYSTEM_MAC)
#include <ApplicationServices/ApplicationServices.h>
#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();

View File

@ -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) {

View File

@ -17,3 +17,11 @@ target_link_libraries(net
common
storm
)
if(WHOA_SYSTEM_WIN)
target_link_libraries(net
PUBLIC
ws2_32
wsock32
)
endif()

View File

@ -21,6 +21,7 @@
#if defined(WHOA_SYSTEM_WIN)
#include <winsock2.h>
#include <ws2tcpip.h>
#endif
uint64_t WowConnection::s_countTotalBytes;
@ -108,7 +109,11 @@ void WowConnection::CheckAccept() {
getpeername(sock, reinterpret_cast<sockaddr*>(&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<sockaddr_in*>(&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<char*>(&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<char*>(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

View File

@ -10,8 +10,10 @@
#include <atomic>
#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::Thread::ThreadRecord*, Blizzard::Thread::ThreadRecord*>* 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

View File

@ -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

View File

@ -2,6 +2,7 @@
#include <cstring>
#include <limits>
#include <storm/Memory.hpp>
#include <storm/String.hpp>
// 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] = '/';
}

View File

@ -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")

View File

@ -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")

View File

@ -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")