From c4725847cc45b69254ffa3efbd3ece7f57d01093 Mon Sep 17 00:00:00 2001 From: lejulien Date: Tue, 13 Jan 2026 15:30:30 +0100 Subject: [PATCH] context: Add program directory's path --- includes/context.hpp | 1 + src/main.cpp | 9 +++++++ src/selection_menu.cpp | 56 ++++++++++++++++++++---------------------- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/includes/context.hpp b/includes/context.hpp index 40f8704..7e3c99d 100644 --- a/includes/context.hpp +++ b/includes/context.hpp @@ -33,6 +33,7 @@ typedef struct ctx { std::shared_ptr selection = nullptr; std::shared_ptr paterns_menu = nullptr; nlohmann::json config_json; + std::filesystem::path program_dir; } ctx; } // namespace gol diff --git a/src/main.cpp b/src/main.cpp index 6f7ebb2..1c64630 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -82,6 +82,15 @@ int main(int ac, char **av) { context->config_json["fps"] = 800; } + // Get program directory + char path_buf[1024]; + 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; + } + context->program_dir = std::filesystem::path(path_buf).parent_path(); + InitWindow(context->config_json["screen_width"], context->config_json["screen_height"], &av[0][2]); diff --git a/src/selection_menu.cpp b/src/selection_menu.cpp index de9f56d..17b6879 100644 --- a/src/selection_menu.cpp +++ b/src/selection_menu.cpp @@ -62,41 +62,37 @@ void SelectionMenu::display() { rlImGuiImageSize(&selectionTexture_.texture, 200, 200); ImGui::InputText("patern_name", patern_name_, 255); if (ImGui::Button("Save")) { - char path_buf[1024]; - ssize_t len = readlink("/proc/self/exe", path_buf, sizeof(path_buf)-1); - if (len != -1) { - // Create paterns dir if not present - std::filesystem::path paterns_dir = std::filesystem::path(path_buf).parent_path() / "paterns"; - if (!std::filesystem::exists(paterns_dir) && !std::filesystem::create_directory(paterns_dir)) { - std::cerr << "Failed to create paterns directory" << std::endl; - } else { // Could be optimized by early returning in a function - std::ofstream patern_file; - paterns_dir += '/'; - paterns_dir += patern_name_; - patern_file.open(paterns_dir); - if (!patern_file) { - std::cerr << "Failed to create the patern file" << std::endl; - } else { - auto sel_it = sel_data_.begin(); - sel_it += 2; // skip dimensions - patern_file << sel_data_[0]; - patern_file << "|"; // Separator needed to split as ascii values - patern_file << sel_data_[1]; - patern_file << "|"; // Separator needed to split as ascii values - for (int j = 0; j < sel_data_[1]; j++) { - for (int i = 0; i < sel_data_[0]; i++) { - patern_file << std::to_string(*sel_it); - if (*sel_it == 1) { - } - sel_it++; + // Create paterns dir if not present + std::filesystem::path paterns_dir = context_->program_dir / "paterns"; + if (!std::filesystem::exists(paterns_dir) && !std::filesystem::create_directory(paterns_dir)) { + std::cerr << "Failed to create paterns directory" << std::endl; + } else { // Could be optimized by early returning in a function + std::ofstream patern_file; + paterns_dir += '/'; + paterns_dir += patern_name_; + patern_file.open(paterns_dir); + if (!patern_file) { + std::cerr << "Failed to create the patern file" << std::endl; + } else { + auto sel_it = sel_data_.begin(); + sel_it += 2; // skip dimensions + patern_file << sel_data_[0]; + patern_file << "|"; // Separator needed to split as ascii values + patern_file << sel_data_[1]; + patern_file << "|"; // Separator needed to split as ascii values + for (int j = 0; j < sel_data_[1]; j++) { + for (int i = 0; i < sel_data_[0]; i++) { + patern_file << std::to_string(*sel_it); + if (*sel_it == 1) { } + sel_it++; } - patern_file << std::flush; - patern_file.close(); } + patern_file << std::flush; + patern_file.close(); } - sel_ctrl_ = false; } + sel_ctrl_ = false; } ImGui::SameLine(); if (ImGui::Button("Discard")) {