From 25e13f4b6ffa53ec8c4d6c2292d1fb98c138de0d Mon Sep 17 00:00:00 2001
From: Lava Block <the@lava-block.com>
Date: Sun, 11 Oct 2020 14:32:59 +0200
Subject: [PATCH] remove lava::file dependency in lava::frame

---
 CMakeLists.txt               |   1 -
 liblava/app/app.cpp          | 100 +++++++++++++++++++++++++++++++++++
 liblava/app/app.hpp          |   8 +++
 liblava/core/types.hpp       |   1 +
 liblava/file/file_system.hpp |   2 -
 liblava/frame/frame.cpp      |  11 ----
 liblava/frame/frame.hpp      |   1 -
 liblava/frame/window.cpp     |  90 -------------------------------
 liblava/frame/window.hpp     |   8 ---
 9 files changed, 109 insertions(+), 113 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index a32145ae..9ec52c81 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -270,7 +270,6 @@ message("<<< glfw")
 
 target_link_libraries(lava.frame
         lava::base
-        lava::file
         glfw
         ${GLFW_LIBRARIES}
         )
diff --git a/liblava/app/app.cpp b/liblava/app/app.cpp
index e81aa235..04ceb020 100644
--- a/liblava/app/app.cpp
+++ b/liblava/app/app.cpp
@@ -94,6 +94,15 @@ namespace lava {
         if (!frame::ready())
             return false;
 
+        log()->debug("physfs {}", str(to_string(file_system::get_version())));
+
+        if (!file_system::instance().initialize(str(get_cmd_line()[0]), get_config().org, get_config().app, get_config().ext)) {
+            log()->error("init file system");
+            return false;
+        }
+
+        file_system::instance().mount_res();
+
         handle_config();
 
         auto& cmd_line = get_cmd_line();
@@ -145,6 +154,8 @@ namespace lava {
 
             config_file.save();
             config_file.remove(&config_callback);
+
+            file_system::instance().terminate();
         });
 
         add_run_once([&]() {
@@ -401,4 +412,93 @@ namespace lava {
             window.set_icon(icon.data, icon.size);
     }
 
+    void to_json(json& j, window::state const& w) {
+        j = json{ { _x_, w.x }, { _y_, w.y }, { _width_, w.width }, { _height_, w.height }, { _fullscreen_, w.fullscreen }, { _floating_, w.floating }, { _resizable_, w.resizable }, { _decorated_, w.decorated }, { _maximized_, w.maximized }, { _monitor_, w.monitor } };
+    }
+
+    void from_json(json const& j, window::state& w) {
+        if (j.count(_x_))
+            w.x = j.at(_x_).get<int>();
+        if (j.count(_y_))
+            w.y = j.at(_y_).get<int>();
+        if (j.count(_width_))
+            w.width = j.at(_width_).get<int>();
+        if (j.count(_height_))
+            w.height = j.at(_height_).get<int>();
+        if (j.count(_fullscreen_))
+            w.fullscreen = j.at(_fullscreen_).get<bool>();
+        if (j.count(_floating_))
+            w.floating = j.at(_floating_).get<bool>();
+        if (j.count(_resizable_))
+            w.resizable = j.at(_resizable_).get<bool>();
+        if (j.count(_decorated_))
+            w.decorated = j.at(_decorated_).get<bool>();
+        if (j.count(_maximized_))
+            w.maximized = j.at(_maximized_).get<bool>();
+        if (j.count(_monitor_))
+            w.monitor = j.at(_monitor_).get<int>();
+    }
+
 } // namespace lava
+
+bool lava::window_file() {
+    return file_system::exists(_window_file_);
+}
+
+lava::window::state::optional lava::load_window_state(name save_name) {
+    if (!window_file())
+        return {};
+
+    window::state window_state;
+    if (!load_window_file(window_state, save_name))
+        return {};
+
+    return window_state;
+}
+
+bool lava::load_window_file(window::state& state, name save_name) {
+    scope_data data;
+    if (!load_file_data(_window_file_, data))
+        return false;
+
+    auto j = json::parse(data.ptr, data.ptr + data.size);
+
+    if (!j.count(save_name))
+        return false;
+
+    log()->trace("load window {}", str(j.dump()));
+
+    state = j[save_name];
+    return true;
+}
+
+void lava::save_window_file(window::ref window) {
+    window::state state = window.get_state();
+    auto index = window.get_save_name();
+
+    json j;
+
+    scope_data data;
+    if (load_file_data(_window_file_, data)) {
+        j = json::parse(data.ptr, data.ptr + data.size);
+
+        json d;
+        d[index] = state;
+
+        j.merge_patch(d);
+    } else {
+        j[index] = state;
+    }
+
+    file file(str(_window_file_), true);
+    if (!file.opened()) {
+        log()->error("save window {}", str(j.dump()));
+        return;
+    }
+
+    auto jString = j.dump(4);
+
+    file.write(jString.data(), jString.size());
+
+    log()->trace("save window {}", str(j.dump()));
+}
diff --git a/liblava/app/app.hpp b/liblava/app/app.hpp
index 201458d4..d47b3c55 100644
--- a/liblava/app/app.hpp
+++ b/liblava/app/app.hpp
@@ -105,4 +105,12 @@ namespace lava {
         id block_command;
     };
 
+    bool window_file();
+
+    window::state::optional load_window_state(name save_name = _default_);
+
+    bool load_window_file(window::state& state, name save_name);
+
+    void save_window_file(window::ref window);
+
 } // namespace lava
diff --git a/liblava/core/types.hpp b/liblava/core/types.hpp
index 1a82ea56..e5e3e174 100644
--- a/liblava/core/types.hpp
+++ b/liblava/core/types.hpp
@@ -87,6 +87,7 @@ namespace lava {
 
     constexpr name _lava_ = "lava";
     constexpr name _liblava_ = "liblava";
+    constexpr name _zip_ = "zip";
 
     inline name str(string_ref value) {
         return value.c_str();
diff --git a/liblava/file/file_system.hpp b/liblava/file/file_system.hpp
index 5e5a8032..319b80ef 100644
--- a/liblava/file/file_system.hpp
+++ b/liblava/file/file_system.hpp
@@ -9,8 +9,6 @@
 
 namespace lava {
 
-    constexpr name _zip_ = "zip";
-
     namespace fs = std::filesystem;
 
     struct file_system : no_copy_no_move {
diff --git a/liblava/frame/frame.cpp b/liblava/frame/frame.cpp
index b7b373de..d893ed17 100644
--- a/liblava/frame/frame.cpp
+++ b/liblava/frame/frame.cpp
@@ -161,15 +161,6 @@ namespace lava {
             return false;
         }
 
-        log()->debug("physfs {}", str(to_string(file_system::get_version())));
-
-        if (!file_system::instance().initialize(str(cmd_line[0]), config.org, config.app, config.ext)) {
-            log()->error("init file system");
-            return false;
-        }
-
-        file_system::instance().mount_res();
-
         frame_initialized = true;
 
         log()->info("---");
@@ -192,8 +183,6 @@ namespace lava {
         log()->flush();
         spdlog::drop_all();
 
-        file_system::instance().terminate();
-
         frame_initialized = false;
     }
 
diff --git a/liblava/frame/frame.hpp b/liblava/frame/frame.hpp
index d8f2f64f..de04cb7f 100644
--- a/liblava/frame/frame.hpp
+++ b/liblava/frame/frame.hpp
@@ -7,7 +7,6 @@
 #include <argh.h>
 #include <liblava/base/device.hpp>
 #include <liblava/base/instance.hpp>
-#include <liblava/file.hpp>
 
 namespace lava {
 
diff --git a/liblava/frame/window.cpp b/liblava/frame/window.cpp
index dd663010..d5cfa86c 100644
--- a/liblava/frame/window.cpp
+++ b/liblava/frame/window.cpp
@@ -4,7 +4,6 @@
 
 #include <liblava/base/device.hpp>
 #include <liblava/base/instance.hpp>
-#include <liblava/file.hpp>
 #include <liblava/frame/window.hpp>
 
 #define GLFW_INCLUDE_NONE
@@ -403,97 +402,8 @@ namespace lava {
         glfwSetWindowPos(handle, (mode->width - width) / 2, (mode->height - height) / 2);
     }
 
-    void to_json(json& j, window::state const& w) {
-        j = json{ { _x_, w.x }, { _y_, w.y }, { _width_, w.width }, { _height_, w.height }, { _fullscreen_, w.fullscreen }, { _floating_, w.floating }, { _resizable_, w.resizable }, { _decorated_, w.decorated }, { _maximized_, w.maximized }, { _monitor_, w.monitor } };
-    }
-
-    void from_json(json const& j, window::state& w) {
-        if (j.count(_x_))
-            w.x = j.at(_x_).get<int>();
-        if (j.count(_y_))
-            w.y = j.at(_y_).get<int>();
-        if (j.count(_width_))
-            w.width = j.at(_width_).get<int>();
-        if (j.count(_height_))
-            w.height = j.at(_height_).get<int>();
-        if (j.count(_fullscreen_))
-            w.fullscreen = j.at(_fullscreen_).get<bool>();
-        if (j.count(_floating_))
-            w.floating = j.at(_floating_).get<bool>();
-        if (j.count(_resizable_))
-            w.resizable = j.at(_resizable_).get<bool>();
-        if (j.count(_decorated_))
-            w.decorated = j.at(_decorated_).get<bool>();
-        if (j.count(_maximized_))
-            w.maximized = j.at(_maximized_).get<bool>();
-        if (j.count(_monitor_))
-            w.monitor = j.at(_monitor_).get<int>();
-    }
-
 } // namespace lava
 
-bool lava::window_file() {
-    return file_system::exists(_window_file_);
-}
-
-lava::window::state::optional lava::load_window_state(name save_name) {
-    if (!window_file())
-        return {};
-
-    window::state window_state;
-    if (!load_window_file(window_state, save_name))
-        return {};
-
-    return window_state;
-}
-
-bool lava::load_window_file(window::state& state, name save_name) {
-    scope_data data;
-    if (!load_file_data(_window_file_, data))
-        return false;
-
-    auto j = json::parse(data.ptr, data.ptr + data.size);
-
-    if (!j.count(save_name))
-        return false;
-
-    log()->trace("load window {}", str(j.dump()));
-
-    state = j[save_name];
-    return true;
-}
-
-void lava::save_window_file(window::ref window) {
-    window::state state = window.get_state();
-    auto index = window.get_save_name();
-
-    json j;
-
-    scope_data data;
-    if (load_file_data(_window_file_, data)) {
-        j = json::parse(data.ptr, data.ptr + data.size);
-
-        json d;
-        d[index] = state;
-
-        j.merge_patch(d);
-    } else {
-        j[index] = state;
-    }
-
-    file file(str(_window_file_), true);
-    if (!file.opened()) {
-        log()->error("save window {}", str(j.dump()));
-        return;
-    }
-
-    auto jString = j.dump(4);
-
-    file.write(jString.data(), jString.size());
-
-    log()->trace("save window {}", str(j.dump()));
-}
-
 VkSurfaceKHR lava::create_surface(GLFWwindow* window) {
     VkSurfaceKHR surface = 0;
     if (failed(glfwCreateWindowSurface(instance::get(), window, memory::alloc(), &surface)))
diff --git a/liblava/frame/window.hpp b/liblava/frame/window.hpp
index 3d9cf680..2cb703a2 100644
--- a/liblava/frame/window.hpp
+++ b/liblava/frame/window.hpp
@@ -205,14 +205,6 @@ namespace lava {
         ui32 height = 0;
     };
 
-    bool window_file();
-
-    window::state::optional load_window_state(name save_name = _default_);
-
-    bool load_window_file(window::state& state, name save_name);
-
-    void save_window_file(window::ref window);
-
     VkSurfaceKHR create_surface(GLFWwindow* window);
 
 } // namespace lava
-- 
GitLab