diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 2a5ad2d18d..afbe56be58 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -63,7 +63,7 @@ add_openmw_dir (mwlua context menuscripts globalscripts localscripts playerscripts luabindings objectbindings cellbindings coremwscriptbindings mwscriptbindings camerabindings vfsbindings uibindings soundbindings inputbindings nearbybindings dialoguebindings postprocessingbindings stats recordstore debugbindings corebindings worldbindings worker landbindings magicbindings factionbindings - classbindings itemdata inputprocessor animationbindings birthsignbindings racebindings markupbindings weatherbindings + classbindings itemdata inputprocessor animationbindings birthsignbindings racebindings markupbindings weatherbindings clipboardbindings types/types types/door types/item types/actor types/container types/lockable types/weapon types/npc types/creature types/player types/activator types/book types/lockpick types/probe types/apparatus types/potion types/ingredient types/misc types/repair types/armor types/light types/static diff --git a/apps/openmw/mwlua/clipboardbindings.cpp b/apps/openmw/mwlua/clipboardbindings.cpp new file mode 100644 index 0000000000..e9aba10e46 --- /dev/null +++ b/apps/openmw/mwlua/clipboardbindings.cpp @@ -0,0 +1,41 @@ +#include "clipboardbindings.hpp" + +#include +#include + +#include + +#include "context.hpp" + +namespace MWLua +{ + sol::table initClipboardPackage(const Context& context) + { + sol::state_view lua = context.sol(); + sol::table api(lua, sol::create); + + api["get"] = []() { + std::string text; + + char* raw = SDL_GetClipboardText(); + text = raw; + + SDL_free(raw); + + return text; + }; + + auto set = [](const char* data) { + if (SDL_SetClipboardText(data) != 0) + { + Log(Debug::Error) << "Failed to set clipboard content: " << SDL_GetError(); + } + }; + + api["set"] = [set](const std::string_view text) { set(text.data()); }; + + api["clear"] = [set]() { set(nullptr); }; + + return LuaUtil::makeReadOnly(api); + } +} diff --git a/apps/openmw/mwlua/clipboardbindings.hpp b/apps/openmw/mwlua/clipboardbindings.hpp new file mode 100644 index 0000000000..570a8e4218 --- /dev/null +++ b/apps/openmw/mwlua/clipboardbindings.hpp @@ -0,0 +1,13 @@ +#ifndef MWLUA_CLIPBOARD_H +#define MWLUA_CLIPBOARD_H + +#include + +namespace MWLua +{ + struct Context; + + sol::table initClipboardPackage(const Context&); +} + +#endif // MWLUA_CLIPBOARD_H diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index 0e9c56a482..d7df03ccf7 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -10,6 +10,7 @@ #include "animationbindings.hpp" #include "camerabindings.hpp" #include "cellbindings.hpp" +#include "clipboardbindings.hpp" #include "corebindings.hpp" #include "debugbindings.hpp" #include "inputbindings.hpp" @@ -62,6 +63,7 @@ namespace MWLua { "openmw.core", initCorePackage(context) }, { "openmw.types", initTypesPackage(context) }, { "openmw.nearby", initNearbyPackage(context) }, + { "openmw.clipboard", initClipboardPackage(context) }, }; } @@ -85,6 +87,7 @@ namespace MWLua { "openmw.ui", initUserInterfacePackage(context) }, { "openmw.menu", initMenuPackage(context) }, { "openmw.input", initInputPackage(context) }, + { "openmw.clipboard", initClipboardPackage(context) }, }; } } diff --git a/docs/source/reference/lua-scripting/index_packages.rst b/docs/source/reference/lua-scripting/index_packages.rst index 53a836519f..cbd4a0541e 100644 --- a/docs/source/reference/lua-scripting/index_packages.rst +++ b/docs/source/reference/lua-scripting/index_packages.rst @@ -12,6 +12,7 @@ Packages async camera core + clipboard debug input markup diff --git a/docs/source/reference/lua-scripting/openmw_clipboard.rst b/docs/source/reference/lua-scripting/openmw_clipboard.rst new file mode 100644 index 0000000000..fef32c7446 --- /dev/null +++ b/docs/source/reference/lua-scripting/openmw_clipboard.rst @@ -0,0 +1,7 @@ +Package openmw.clipboard +======================== + +.. include:: version.rst + +.. raw:: html + :file: generated_html/openmw_clipboard.html diff --git a/docs/source/reference/lua-scripting/tables/packages.rst b/docs/source/reference/lua-scripting/tables/packages.rst index 2485f2c0cd..48e02c38a4 100644 --- a/docs/source/reference/lua-scripting/tables/packages.rst +++ b/docs/source/reference/lua-scripting/tables/packages.rst @@ -20,6 +20,9 @@ * - :doc:`core ` - |bdg-ctx-all| - Functions that are common for both global and local scripts + * - :doc:`clipboard ` + - |bdg-ctx-local| |bdg-ctx-menu| + - Read and write access to the systems clipboard * - :doc:`debug ` - |bdg-ctx-player| - Collection of debug utils. diff --git a/files/data/scripts/omw/console/local.lua b/files/data/scripts/omw/console/local.lua index 050535f6ef..972a41652b 100644 --- a/files/data/scripts/omw/console/local.lua +++ b/files/data/scripts/omw/console/local.lua @@ -23,6 +23,7 @@ local env = { util = require('openmw.util'), storage = require('openmw.storage'), core = require('openmw.core'), + clipboard = require('openmw.clipboard'), types = require('openmw.types'), vfs = require('openmw.vfs'), markup = require('openmw.markup'), diff --git a/files/data/scripts/omw/console/menu.lua b/files/data/scripts/omw/console/menu.lua index eacf7f8b6c..5e5e44b5bf 100644 --- a/files/data/scripts/omw/console/menu.lua +++ b/files/data/scripts/omw/console/menu.lua @@ -45,6 +45,7 @@ local env = { menu = require('openmw.menu'), util = require('openmw.util'), core = require('openmw.core'), + clipboard = require('openmw.clipboard'), storage = require('openmw.storage'), vfs = require('openmw.vfs'), markup = require('openmw.markup'), diff --git a/files/data/scripts/omw/console/player.lua b/files/data/scripts/omw/console/player.lua index fff9c6d4d3..fefe62e9d1 100644 --- a/files/data/scripts/omw/console/player.lua +++ b/files/data/scripts/omw/console/player.lua @@ -70,6 +70,7 @@ local env = { util = require('openmw.util'), storage = require('openmw.storage'), core = require('openmw.core'), + clipboard = require('openmw.clipboard'), types = require('openmw.types'), vfs = require('openmw.vfs'), markup = require('openmw.markup'), diff --git a/files/lua_api/openmw/clipboard.lua b/files/lua_api/openmw/clipboard.lua new file mode 100644 index 0000000000..0abab96f55 --- /dev/null +++ b/files/lua_api/openmw/clipboard.lua @@ -0,0 +1,20 @@ +--- +-- Provides an interface to the systems clipboard. +-- @context local|menu +-- @module clipboard +-- @usage local clipboard = require('openmw.clipboard') + +--- +-- Sets the clipboard from a UTF-8 encoded string +-- @function [parent=#clipboard] set() +-- @param #string text The text to set for the clipboard. + +--- +-- Gets the clipboard content as a UTF-8 encoded string +-- @function [parent=#clipboard] get() + +--- +-- Clears the systems clipboard +-- @function [parent=#clipboard] clear() + +return nil