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 /src/main_linux.cpp | |
| parent | 6abbea56a6bfa69cb5e576223301f0c992b646fa (diff) | |
linux port
Diffstat (limited to 'src/main_linux.cpp')
| -rw-r--r-- | src/main_linux.cpp | 142 |
1 files changed, 142 insertions, 0 deletions
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; +} |
