aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancesco Abbate <francesco.bbt@gmail.com>2021-12-20 14:42:48 +0100
committerFrancesco Abbate <francesco.bbt@gmail.com>2021-12-20 14:42:48 +0100
commit3109263c5d5ca0009c604ad8de1f51ac9d38bb78 (patch)
treee736a8bcd558b767f18f8cd3a82304a0034ff278
parent29318be9c71e1be290e7507e9f8b1c9445aad1b0 (diff)
downloadlite-xl-3109263c5d5ca0009c604ad8de1f51ac9d38bb78.tar.gz
lite-xl-3109263c5d5ca0009c604ad8de1f51ac9d38bb78.zip
Call dmon_unwatch when changing project
Fix a conspicuous omission to call the dmon_unwatch function when changing project directory. This uncovered a bug or a quirk of the dmon library where the watch_ids can change as a result of calling dmon_unwatch because they are just indexes on a contiguous array. Use a workaround to always unwatch the first valid watch_id N times.
-rw-r--r--data/core/commands/core.lua5
-rw-r--r--data/core/init.lua16
-rw-r--r--src/api/system.c8
3 files changed, 28 insertions, 1 deletions
diff --git a/data/core/commands/core.lua b/data/core/commands/core.lua
index ad0d4b10..16b371f3 100644
--- a/data/core/commands/core.lua
+++ b/data/core/commands/core.lua
@@ -164,7 +164,10 @@ command.add(nil, {
core.error("Cannot open folder %q", text)
return
end
- core.confirm_close_docs(core.docs, core.open_folder_project, text)
+ core.confirm_close_docs(core.docs, function(dirpath)
+ core.close_current_project()
+ core.open_folder_project(dirpath)
+ end, text)
end, suggest_directory)
end,
diff --git a/data/core/init.lua b/data/core/init.lua
index 9e4676f0..928df227 100644
--- a/data/core/init.lua
+++ b/data/core/init.lua
@@ -64,6 +64,22 @@ function core.set_project_dir(new_dir, change_project_fn)
return false
end
+function core.close_current_project()
+ -- When using system.unwatch_dir we need to pass the watch_id provided by dmon.
+ -- In reality when unwatching a directory the dmon library shifts the other watch_id
+ -- values so the actual watch_id changes. To workaround this problem we assume the
+ -- first watch_id is always 1 and the watch_id are continguous and we unwatch the
+ -- first watch_id repeateadly up to the number of watch_ids.
+ local watch_id_max = 0
+ for _, project_dir in ipairs(core.project_directories) do
+ if project_dir.watch_id and project_dir.watch_id > watch_id_max then
+ watch_id_max = project_dir.watch_id
+ end
+ end
+ for i = 1, watch_id_max do
+ system.unwatch_dir(1)
+ end
+end
function core.open_folder_project(dir_path_abs)
if core.set_project_dir(dir_path_abs, core.on_quit_project) then
diff --git a/src/api/system.c b/src/api/system.c
index 0ebf78f1..4c14843b 100644
--- a/src/api/system.c
+++ b/src/api/system.c
@@ -723,6 +723,13 @@ static int f_watch_dir(lua_State *L) {
return 1;
}
+static int f_unwatch_dir(lua_State *L) {
+ dmon_watch_id watch_id;
+ watch_id.id = luaL_checkinteger(L, 1);
+ dmon_unwatch(watch_id);
+ return 0;
+}
+
#if __linux__
static int f_watch_dir_add(lua_State *L) {
dmon_watch_id watch_id;
@@ -826,6 +833,7 @@ static const luaL_Reg lib[] = {
{ "fuzzy_match", f_fuzzy_match },
{ "set_window_opacity", f_set_window_opacity },
{ "watch_dir", f_watch_dir },
+ { "unwatch_dir", f_unwatch_dir },
{ "path_compare", f_path_compare },
#if __linux__
{ "watch_dir_add", f_watch_dir_add },