diff options
| author | Aldrik Ramaekers <aldrik@mailbox.org> | 2025-12-26 09:41:24 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik@mailbox.org> | 2025-12-26 09:41:24 +0100 |
| commit | 178e8c135a60e9f206dcfbad8bab7bb868e6a294 (patch) | |
| tree | 05aa6ad4e9e3f68aea29c1ff8b1c1f445f6c0a3f | |
| parent | 6abbea56a6bfa69cb5e576223301f0c992b646fa (diff) | |
linux port
| -rw-r--r-- | libs/ImGuiDatePicker/ImGuiDatePicker.cpp | 5 | ||||
| -rw-r--r-- | libs/xml.c/src/xml.c | 20 | ||||
| -rw-r--r-- | libs/xml.c/src/xml.h | 1 | ||||
| -rw-r--r-- | libs/zip/src/miniz.h | 6 | ||||
| -rwxr-xr-x | run_linux64.sh | 55 | ||||
| -rw-r--r-- | run_win64.bat (renamed from run.bat) | 0 | ||||
| -rw-r--r-- | src/main_linux.cpp | 142 | ||||
| -rw-r--r-- | src/main_windows.cpp (renamed from src/main.cpp) | 6 | ||||
| -rw-r--r-- | src/ui/ui_tax.cpp | 2 |
9 files changed, 225 insertions, 12 deletions
diff --git a/libs/ImGuiDatePicker/ImGuiDatePicker.cpp b/libs/ImGuiDatePicker/ImGuiDatePicker.cpp index 207a902..c69c8ba 100644 --- a/libs/ImGuiDatePicker/ImGuiDatePicker.cpp +++ b/libs/ImGuiDatePicker/ImGuiDatePicker.cpp @@ -4,6 +4,7 @@ #include <chrono> #include <vector> #include <unordered_map> +#include <time.h> #define GET_DAY(timePoint) int(timePoint.tm_mday) @@ -152,7 +153,11 @@ namespace ImGui std::time_t currentTime = std::chrono::system_clock::to_time_t(now); tm res; + #ifdef win64 gmtime_s(&res, ¤tTime); + #else + gmtime_r(¤tTime, &res); + #endif return res; } diff --git a/libs/xml.c/src/xml.c b/libs/xml.c/src/xml.c index 6d14213..0b435cd 100644 --- a/libs/xml.c/src/xml.c +++ b/libs/xml.c/src/xml.c @@ -320,11 +320,11 @@ static void xml_parser_error(struct xml_parser* parser, enum xml_parser_offset o int row = 0; int column = 0; - //#define min(X,Y) ((X) < (Y) ? (X) : (Y)) - //#define max(X,Y) ((X) > (Y) ? (X) : (Y)) + #define min(X,Y) ((X) < (Y) ? (X) : (Y)) + #define max(X,Y) ((X) > (Y) ? (X) : (Y)) size_t character = max(0, min(parser->length, parser->position + offset)); - //#undef min - //#undef max + #undef min + #undef max size_t position = 0; for (; position < character; ++position) { column++; @@ -1140,9 +1140,9 @@ void xml_string_copy(struct xml_string* string, uint8_t* buffer, size_t length) return; } - //#define min(X,Y) ((X) < (Y) ? (X) : (Y)) + #define min(X,Y) ((X) < (Y) ? (X) : (Y)) length = min(length, string->length); - //#undef min + #undef min memcpy(buffer, string->buffer, length); } @@ -1328,5 +1328,11 @@ time_t xml_get_date_x(struct xml_node* root, char* child_name, ...) time_t result = mktime(&tm_info); if (result == -1) return 0; - else return result - _timezone; + else { + #ifdef win64 + return result - _timezone; + #else + return result - timezone; + #endif + } }
\ No newline at end of file diff --git a/libs/xml.c/src/xml.h b/libs/xml.c/src/xml.h index ef8d55c..43e7f0f 100644 --- a/libs/xml.c/src/xml.h +++ b/libs/xml.c/src/xml.h @@ -31,6 +31,7 @@ #include <stdint.h> #include <stdio.h> #include <string.h> +#include <time.h> #ifdef __cplusplus extern "C" { diff --git a/libs/zip/src/miniz.h b/libs/zip/src/miniz.h index b3c3237..ac7f4d3 100644 --- a/libs/zip/src/miniz.h +++ b/libs/zip/src/miniz.h @@ -1,8 +1,8 @@ #ifndef MINIZ_EXPORT #define MINIZ_EXPORT -__pragma(warning(push)) -__pragma(warning(disable:4127)) +//__pragma(warning(push)) +//__pragma(warning(disable:4127)) #endif /* miniz.c 3.0.2 - public domain deflate/inflate, zlib-subset, ZIP @@ -10204,7 +10204,7 @@ mz_bool mz_zip_end(mz_zip_archive *pZip) { return MZ_FALSE; } -__pragma(warning(pop)) +//__pragma(warning(pop)) #ifdef __cplusplus } diff --git a/run_linux64.sh b/run_linux64.sh new file mode 100755 index 0000000..719e1d7 --- /dev/null +++ b/run_linux64.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +# Function to print errors and exit +function error_exit { + echo "$1" + exit 1 +} + +# Set environment variables +OUT_DIR="build" +OUT_EXE="accounting" +LIB_SOURCES="libs/imgui-1.92.1/backends/imgui_impl_glfw.cpp \ +libs/imgui-1.92.1/backends/imgui_impl_opengl2.cpp \ +libs/imgui-1.92.1/imgui*.cpp \ +libs/simclist-1.5/simclist.c \ +libs/ImGuiDatePicker/*.cpp \ +libs/zip/src/*.c \ +libs/xml.c/src/*.c \ +libs/timer_lib/*.c \ +libs/tinyfiledialogs/tinyfiledialogs.c" +SOURCES="src/*.cpp src/ui/*.cpp src/locales/*.cpp src/ai_providers/*.cpp" +LIBS="-lstdc++ -lglfw -lGL -lm -lssl -lcrypto" +FLAGS="--no-warnings -g" +INCLUDE_DIRS="-Ilibs/imgui-1.92.1 \ +-Ilibs/imgui-1.92.1/backends \ +-Ilibs/openssl-3.6.0-beta1/x64/include \ +-Ilibs/cpp-httplib \ +-Ilibs/timer_lib \ +-Ilibs/greatest \ +-Ilibs/simclist-1.5 \ +-Ilibs/tinyfiledialogs \ +-Ilibs/zip/src \ +-Ilibs/xml.c/src \ +-Ilibs/ \ +-Iinclude" +DEFINITIONS="-D_PLATFORM_=\"linux64\"" + +# Check for test flag +if [ "$1" == "-t" ]; then + SOURCES="tests/main_linux.cpp src/administration.cpp src/administration_writer.cpp src/administration_reader.cpp src/strops.cpp src/logger.cpp src/locales.cpp src/locales/*.cpp src/ai_providers/*.cpp src/importer.cpp src/memops.cpp src/countries.cpp" + OUT_EXE="accounting_tests" + DEFINITIONS="-D_PLATFORM_=\"linux64\" -D_TESTING_MODE_" +fi + +# Compilation command +gcc $FLAGS $INCLUDE_DIRS $DEFINITIONS $SOURCES $LIB_SOURCES -o $OUT_DIR/$OUT_EXE $LIBS + +# Run commands based on input arguments +if [ "$1" == "-r" ]; then + "$OUT_DIR/$OUT_EXE" "/path/to/example.openbook" +elif [ "$1" == "-t" ]; then + "$OUT_DIR/$OUT_EXE" -v +elif [ "$1" == "-d" ]; then + gdb "$OUT_DIR/$OUT_EXE" +fi
\ No newline at end of file diff --git a/src/main_linux.cpp b/src/main_linux.cpp new file mode 100644 index 0000000..f30f063 --- /dev/null +++ b/src/main_linux.cpp @@ -0,0 +1,142 @@ +// Dear ImGui: standalone example application for GLFW + OpenGL2, using legacy fixed pipeline +// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp + +// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** +// **Prefer using the code in the example_glfw_opengl2/ folder** +// See imgui_impl_glfw.cpp for details. + +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_opengl2.h" +#include <stdio.h> +#ifdef __APPLE__ +#define GL_SILENCE_DEPRECATION +#endif +#include <GLFW/glfw3.h> + +#include "timer.h" +#include "ui.hpp" +#include "administration.hpp" +#include "administration_writer.hpp" +#include "administration_reader.hpp" + +// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers. +// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma. +// Your own project should not be affected, as you are likely to link with a newer binary of GLFW that is adequate for your version of Visual Studio. +#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#pragma comment(lib, "legacy_stdio_definitions") +#endif + +static void glfw_error_callback(int error, const char* description) +{ + fprintf(stderr, "GLFW Error %d: %s\n", error, description); +} + +// Main code +int main(int argc, char** argv) +{ + glfwSetErrorCallback(glfw_error_callback); + if (!glfwInit()) + return 1; + + // Create window with graphics context + float main_scale = ImGui_ImplGlfw_GetContentScaleForMonitor(glfwGetPrimaryMonitor()); // Valid on GLFW 3.3+ only + GLFWwindow* window = glfwCreateWindow((int)(1280 * main_scale), (int)(800 * main_scale), "OpenBooks", nullptr, nullptr); + if (window == nullptr) + return 1; + glfwMakeContextCurrent(window); + glfwSwapInterval(1); // Enable vsync + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup scaling + ImGuiStyle& style = ImGui::GetStyle(); + style.ScaleAllSizes(main_scale); // Bake a fixed style scale. (until we have a solution for dynamic style scaling, changing this requires resetting Style + calling this again) + style.FontScaleDpi = main_scale; // Set initial font scale. (using io.ConfigDpiScaleFonts=true makes this unnecessary. We leave both here for documentation purpose) + + // Setup Platform/Renderer backends + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplOpenGL2_Init(); + + style.FontSizeBase = 18.0f; + io.Fonts->AddFontFromFileTTF("build/Segoe UI.ttf"); + ui::fontBold = io.Fonts->AddFontFromFileTTF("build/Segoe UI Bold.ttf"); + ui::fontBig = io.Fonts->AddFontFromFileTTF("build/Segoe UI Bold.ttf", 30); + + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + timer_lib_initialize(); + administration_writer::create(); + + if (argc < 2) { + administration::create_default(""); + } + else { + administration_reader::open_existing(argv[1]); + } + + while (!glfwWindowShouldClose(window)) + { + glfwPollEvents(); + if (glfwGetWindowAttrib(window, GLFW_ICONIFIED) != 0) + { + ImGui_ImplGlfw_Sleep(10); + continue; + } + + // Start the Dear ImGui frame + ImGui_ImplOpenGL2_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + ui::draw_main(); + + // Rendering + ImGui::Render(); + int display_w, display_h; + glfwGetFramebufferSize(window, &display_w, &display_h); + glViewport(0, 0, display_w, display_h); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + + // If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!), + // you may need to backup/reset/restore other state, e.g. for current shader using the commented lines below. + //GLint last_program; + //glGetIntegerv(GL_CURRENT_PROGRAM, &last_program); + //glUseProgram(0); + ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); + //glUseProgram(last_program); + + glfwMakeContextCurrent(window); + glfwSwapBuffers(window); + } + + administration_writer::destroy(); + timer_lib_shutdown(); + administration::destroy(); + + // Cleanup + ImGui_ImplOpenGL2_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + + glfwDestroyWindow(window); + glfwTerminate(); + + return 0; +} diff --git a/src/main.cpp b/src/main_windows.cpp index ffdeb03..974949b 100644 --- a/src/main.cpp +++ b/src/main_windows.cpp @@ -14,6 +14,8 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef win64 + #include "imgui.h" #include "imgui_impl_win32.h" #include "imgui_impl_dx11.h" @@ -312,4 +314,6 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) return 0; } return ::DefWindowProcW(hWnd, msg, wParam, lParam); -}
\ No newline at end of file +} + +#endif
\ No newline at end of file diff --git a/src/ui/ui_tax.cpp b/src/ui/ui_tax.cpp index 8a119e4..af05cd7 100644 --- a/src/ui/ui_tax.cpp +++ b/src/ui/ui_tax.cpp @@ -22,7 +22,7 @@ #include "locales.hpp" #include "administration.hpp" -tax_statement* statement = 0; +static tax_statement* statement = 0; void ui::setup_tax_report() { |
