From 2cdf674b972bd2e3826845ade752cab36ba18c8c Mon Sep 17 00:00:00 2001 From: Francesco Abbate Date: Thu, 31 Dec 2020 11:25:12 +0100 Subject: [PATCH] Keep memory of window's size and position and restore them on start Fix also a problem with directory path on windows. --- data/core/init.lua | 49 +++++++++++++++++++++++++++++++--------------- src/api/system.c | 25 +++++++++++++++++++++++ 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/data/core/init.lua b/data/core/init.lua index e1937c3f..53c784d5 100644 --- a/data/core/init.lua +++ b/data/core/init.lua @@ -11,11 +11,28 @@ local Doc local core = {} -local function load_projects() - local ok, t = pcall(dofile, USERDIR .. "/recent_projects.lua") - core.recent_projects = (ok and t or {}) +core.project_files_empty = {} + +local function load_session() + local ok, t = pcall(dofile, USERDIR .. "/session.lua") + if ok then + return t.recents, t.window + end + return {} end + +local function save_session() + local fp = io.open(USERDIR .. "/session.lua", "w") + if fp then + fp:write("return {recents=", common.serialize(core.recent_projects), + ", window=", common.serialize(table.pack(system.get_window_size())), + "}\n") + fp:close() + end +end + + local function add_project_to_recents(dirname) dirname = system.absolute_path(dirname) if not dirname then return end @@ -30,14 +47,6 @@ local function add_project_to_recents(dirname) table.insert(recents, 1, dirname) end -local function save_projects() - local fp = io.open(USERDIR .. "/recent_projects.lua", "w") - if fp then - fp:write("return ", common.serialize(core.recent_projects), "\n") - fp:close() - end -end - function core.reschedule_project_scan() if core.project_scan_thread_id then @@ -46,8 +55,10 @@ function core.reschedule_project_scan() end -core.project_files_empty = {} - +local function normalize_path(s) + local drive, path = s:match("^([a-z]):([/\\].*)") + return drive and drive:upper() .. ":" .. path or s +end function core.set_project_dir(new_dir) core.project_dir = new_dir @@ -67,7 +78,6 @@ function core.open_folder_project(dirname) core.on_quit_project() core.root_view:close_all_docviews() add_project_to_recents(dirname) - save_projects() core.set_project_dir(dirname) core.on_enter_project(dirname) end @@ -290,6 +300,7 @@ function core.add_project_directory(path) -- top directories has a file-like "item" but the item.filename -- will be simply the name of the directory, without its path. -- The field item.topdir will identify it as a top level directory. + path = normalize_path(path) table.insert(core.project_directories, { name = path, item = {filename = path:match("[^\\/]+$"), type = "dir", topdir = true}, @@ -317,7 +328,13 @@ function core.init() CommandView = require "core.commandview" Doc = require "core.doc" - load_projects() + do + local recent_projects, window_position = load_session() + if window_position then + system.set_window_size(table.unpack(window_position)) + end + core.recent_projects = recent_projects + end local project_dir = core.recent_projects[1] or "." local files = {} @@ -328,7 +345,6 @@ function core.init() elseif info.type == "dir" then project_dir = ARGS[i] add_project_to_recents(project_dir) - save_projects() end end @@ -425,6 +441,7 @@ local function quit_with_function(quit_fn, force) if force then delete_temp_files() core.on_quit_project() + save_session() quit_fn() else if core.confirm_close_all() then diff --git a/src/api/system.c b/src/api/system.c index 3d6de1ea..3f43dca0 100644 --- a/src/api/system.c +++ b/src/api/system.c @@ -201,6 +201,29 @@ static int f_set_window_mode(lua_State *L) { } +static int f_get_window_size(lua_State *L) { + int x, y, w, h; + SDL_GetWindowSize(window, &w, &h); + SDL_GetWindowPosition(window, &x, &y); + lua_pushnumber(L, w); + lua_pushnumber(L, h); + lua_pushnumber(L, x); + lua_pushnumber(L, y); + return 4; +} + + +static int f_set_window_size(lua_State *L) { + double w = luaL_checknumber(L, 1); + double h = luaL_checknumber(L, 2); + double x = luaL_checknumber(L, 3); + double y = luaL_checknumber(L, 4); + SDL_SetWindowSize(window, w, h); + SDL_SetWindowPosition(window, x, y); + return 0; +} + + static int f_window_has_focus(lua_State *L) { unsigned flags = SDL_GetWindowFlags(window); lua_pushboolean(L, flags & SDL_WINDOW_INPUT_FOCUS); @@ -414,6 +437,8 @@ static const luaL_Reg lib[] = { { "set_cursor", f_set_cursor }, { "set_window_title", f_set_window_title }, { "set_window_mode", f_set_window_mode }, + { "get_window_size", f_get_window_size }, + { "set_window_size", f_set_window_size }, { "window_has_focus", f_window_has_focus }, { "show_confirm_dialog", f_show_confirm_dialog }, { "chdir", f_chdir },