summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@mailbox.org>2025-12-26 09:41:24 +0100
committerAldrik Ramaekers <aldrik@mailbox.org>2025-12-26 09:41:24 +0100
commit178e8c135a60e9f206dcfbad8bab7bb868e6a294 (patch)
tree05aa6ad4e9e3f68aea29c1ff8b1c1f445f6c0a3f
parent6abbea56a6bfa69cb5e576223301f0c992b646fa (diff)
linux port
-rw-r--r--libs/ImGuiDatePicker/ImGuiDatePicker.cpp5
-rw-r--r--libs/xml.c/src/xml.c20
-rw-r--r--libs/xml.c/src/xml.h1
-rw-r--r--libs/zip/src/miniz.h6
-rwxr-xr-xrun_linux64.sh55
-rw-r--r--run_win64.bat (renamed from run.bat)0
-rw-r--r--src/main_linux.cpp142
-rw-r--r--src/main_windows.cpp (renamed from src/main.cpp)6
-rw-r--r--src/ui/ui_tax.cpp2
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, &currentTime);
+ #else
+ gmtime_r(&currentTime, &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/run.bat b/run_win64.bat
index 1f13fcc..1f13fcc 100644
--- a/run.bat
+++ b/run_win64.bat
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()
{