From 110ff7ed7ec9d4cd9d7b6a55638f606362e150a8 Mon Sep 17 00:00:00 2001 From: lejulien Date: Tue, 21 Apr 2026 13:21:46 +0200 Subject: [PATCH] win_compat: Fix backend & file management This ensure the project builds on windows --- .gitignore | 3 +- CMakeLists.txt | 3 +- README.md | 17 +++++++- src/main.cpp | 97 +++++++++++++++++++++++++++++++++++++++++++- src/paterns_menu.cpp | 6 +++ 5 files changed, 121 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 26ad3d1..94eff49 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,9 @@ build +build_linux +build_win enc_temp_folder out _deps CMakeSettings.json .vs .cache -build-win-x86_64 diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f37716..bcc7d20 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,8 @@ set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if(WIN32) - set(IMGUI_BACKEND "imgui_impl_dx11.cpp") # DirectX 11 for Windows + #set(IMGUI_BACKEND "imgui_impl_dx11.cpp") # DirectX 11 for Windows + set(IMGUI_BACKEND "imgui_impl_opengl3.cpp") # OpenGL for Linux elseif(APPLE) set(IMGUI_BACKEND "imgui_impl_metal.mm") # Metal for macOS elseif(UNIX) diff --git a/README.md b/README.md index 4d2e6cc..b8f08bd 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ This is a simple Game Of Life editor written in C++ with raylib & dearImGUI ## How to compile the project +### Linux + Ensure you have g++, cmake and the dependencies of raylib ```shell @@ -19,4 +21,17 @@ cmake .. make ``` -> The windows version might exist one day +### Windows + +If you're compiling for windows on linux, you can use mingw-w64 + +```shell +sudo apt install mingw-w64 +mkdir build +cd build +cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-ming-w64-x86_64.cmake +make +``` +If you're compiling for windows on windows, use your usual cmake workflow + + diff --git a/src/main.cpp b/src/main.cpp index ed1e923..74c61b3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,11 +6,84 @@ * ------ */ +#if defined(_WIN32) +// Prevent windows.h from defining many symbols that clash with raylib +#define NOGDICAPMASKS +#define NOVIRTUALKEYCODES +#define NOWINMESSAGES +#define NOWINSTYLES +#define NOSYSMETRICS +#define NOMENUS +#define NOICONS +#define NOKEYSTATES +#define NOSYSCOMMANDS +#define NORASTEROPS +#define NOSHOWWINDOW +#define OEMRESOURCE +#define NOATOM +#define NOCLIPBOARD +#define NOCOLOR +#define NOCTLMGR +#define NODRAWTEXT +#define NOGDI +#define NOKERNEL +#define NOUSER +#define NOMB +#define NOMEMMGR +#define NOMETAFILE +#define NOMINMAX +#define NOMSG +#define NOOPENFILE +#define NOSCROLL +#define NOSERVICE +#define NOSOUND +#define NOTEXTMETRIC +#define NOWH +#define NOWINOFFSETS +#define NOCOMM +#define NOKANJI +#define NOHELP +#define NOPROFILER +#define NODEFERWINDOWPOS +#define NOMCX + +// Some code expects LPMSG; provide minimal typedef before windows.h +typedef struct tagMSG *LPMSG; + +#include + +#undef PlaySound +// Define a minimal BITMAPINFOHEADER if needed by downstream code +typedef struct tagBITMAPINFOHEADER { + DWORD biSize; + LONG biWidth; + LONG biHeight; + WORD biPlanes; + WORD biBitCount; + DWORD biCompression; + DWORD biSizeImage; + LONG biXPelsPerMeter; + LONG biYPelsPerMeter; + DWORD biClrUsed; + DWORD biClrImportant; +} BITMAPINFOHEADER, *PBITMAPINFOHEADER; + +#include +#include +#include + +#if defined(_MSC_VER) || defined(__TINYC__) +#include "propidl.h" +#endif + +#else +#include +#endif + #include #include -#include -#include +#include #include #include #include @@ -86,11 +159,31 @@ int main(int ac, char **av) { // Get program directory char path_buf[1024]; +#if defined(_WIN32) + std::wstring wbuf; + DWORD size = MAX_PATH; + for (;;) { + wbuf.resize(size); + DWORD result = GetModuleFileNameW(NULL, wbuf.data(), size); + if (result == 0) { + std::cerr << "Failed to determine program directory" << std::endl; + return 1; + } + if (result < size) { + wbuf.resize(result); + break; + } + size *= 2; + } + path_buf[0] = '\0'; + WideCharToMultiByte(CP_UTF8, 0, wbuf.c_str(), -1, path_buf, sizeof(path_buf), NULL, NULL); +#else ssize_t len = readlink("/proc/self/exe", path_buf, sizeof(path_buf)-1); if (len == -1) { std::cerr << "Failed to determine program directory" << std::endl; return 1; } +#endif context->program_dir = std::filesystem::path(path_buf).parent_path(); InitWindow(context->config_json["screen_width"], context->config_json["screen_height"], diff --git a/src/paterns_menu.cpp b/src/paterns_menu.cpp index 1bcee0e..5a340fd 100644 --- a/src/paterns_menu.cpp +++ b/src/paterns_menu.cpp @@ -35,8 +35,14 @@ void PaternsMenu::refresh() { std::filesystem::directory_iterator(paterns_path)) { if (!std::filesystem::is_directory(entry) && entry.path().has_filename()) { +#if defined(_WIN32) + paterns_paths_list_[entry.path().filename().string()] = + entry.path().string(); + paterns_name_list_.push_back(entry.path().filename().string()); +#else paterns_paths_list_[entry.path().filename()] = entry.path(); paterns_name_list_.push_back(entry.path().filename()); +#endif } } }