diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e3779b39749..8226d6be8d7 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -747,6 +747,7 @@ if(USE_LUA)
"lua/styles.c"
"lua/tags.c"
"lua/types.c"
+ "lua/util.c"
"lua/view.c"
"lua/widget/box.c"
"lua/widget/button.c"
diff --git a/src/lua/configuration.h b/src/lua/configuration.h
index 5e04dd79e8f..b324d93f60a 100644
--- a/src/lua/configuration.h
+++ b/src/lua/configuration.h
@@ -40,10 +40,11 @@
// 4.4.0 was 9.1.0 (added mimic and dt_lua_image_t changes)
// 4.6.0 was 9.2.0 (added change_timestamp to dt_image_t)
// 4.8.0 was 9.3.0 (added button and box widget enhancements)
+// 5.0.0 was 9.4.0 (added group events and uuid)
/* incompatible API change */
#define LUA_API_VERSION_MAJOR 9
/* backward compatible API change */
-#define LUA_API_VERSION_MINOR 3
+#define LUA_API_VERSION_MINOR 4
/* bugfixes that should not change anything to the API */
#define LUA_API_VERSION_PATCH 0
/* suffix for unstable version */
diff --git a/src/lua/init.c b/src/lua/init.c
index b3bf425e249..01086d46621 100644
--- a/src/lua/init.c
+++ b/src/lua/init.c
@@ -43,6 +43,7 @@
#include "lua/styles.h"
#include "lua/tags.h"
#include "lua/types.h"
+#include "lua/util.h"
#include "lua/view.h"
#include "lua/widget/widget.h"
@@ -138,7 +139,7 @@ static lua_CFunction init_funcs[]
dt_lua_init_luastorages, dt_lua_init_tags, dt_lua_init_film, dt_lua_init_call,
dt_lua_init_view, dt_lua_init_events, dt_lua_init_init, dt_lua_init_widget,
dt_lua_init_lualib, dt_lua_init_gettext, dt_lua_init_guides, dt_lua_init_cairo,
- dt_lua_init_password, NULL };
+ dt_lua_init_password, dt_lua_init_util, NULL };
void dt_lua_init(lua_State *L, const char *lua_command)
diff --git a/src/lua/util.c b/src/lua/util.c
new file mode 100644
index 00000000000..e463c3e32fb
--- /dev/null
+++ b/src/lua/util.c
@@ -0,0 +1,66 @@
+/*
+ This file is part of darktable,
+ Copyright (C) 2024 darktable developers.
+
+ darktable is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ darktable is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with darktable. If not, see .
+ */
+#include "lua/preferences.h"
+#include "lua/call.h"
+#include "lua/events.h"
+#include
+#include
+#include
+
+static int message(lua_State *L)
+{
+ const char *sender = luaL_checkstring(L, 1);
+ const char *receiver = luaL_checkstring(L, 2);
+ const char *message = luaL_checkstring(L, 3);
+
+ dt_lua_async_call_alien(dt_lua_event_trigger_wrapper,
+ 0, NULL, NULL,
+ LUA_ASYNC_TYPENAME, "const char*", "inter-script-communication",
+ LUA_ASYNC_TYPENAME, "const char*", sender,
+ LUA_ASYNC_TYPENAME, "const char*", receiver,
+ LUA_ASYNC_TYPENAME, "const char*", message,
+ LUA_ASYNC_DONE);
+
+ return 0;
+}
+
+
+int dt_lua_init_util(lua_State *L)
+{
+ dt_lua_push_darktable_lib(L);
+ dt_lua_goto_subtable(L, "util");
+
+ lua_pushcfunction(L, message);
+ lua_setfield(L, -2, "message");
+
+ lua_pop(L, 1);
+
+
+ lua_pushcfunction(L, dt_lua_event_multiinstance_register);
+ lua_pushcfunction(L, dt_lua_event_multiinstance_destroy);
+ lua_pushcfunction(L, dt_lua_event_multiinstance_trigger);
+ dt_lua_event_add(L, "inter-script-communication");
+
+ return 0;
+}
+// clang-format off
+// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
+// vim: shiftwidth=2 expandtab tabstop=2 cindent
+// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
+// clang-format on
+
diff --git a/src/lua/util.h b/src/lua/util.h
new file mode 100644
index 00000000000..2eb685bb810
--- /dev/null
+++ b/src/lua/util.h
@@ -0,0 +1,28 @@
+/*
+ This file is part of darktable,
+ Copyright (C) 2024 darktable developers.
+
+ darktable is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ darktable is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with darktable. If not, see .
+ */
+
+#pragma once
+
+int dt_lua_init_util(lua_State *L);
+
+// clang-format off
+// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
+// vim: shiftwidth=2 expandtab tabstop=2 cindent
+// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
+// clang-format on
+