diff options
-rw-r--r-- | source/frontend/StarClientCommandProcessor.cpp | 6 | ||||
-rw-r--r-- | source/frontend/StarClientCommandProcessor.hpp | 2 | ||||
-rw-r--r-- | source/frontend/StarClipboardLuaBindings.cpp | 2 | ||||
-rw-r--r-- | source/frontend/StarMainInterface.cpp | 2 | ||||
-rw-r--r-- | source/game/StarInput.cpp | 20 | ||||
-rw-r--r-- | source/game/StarInput.hpp | 16 |
6 files changed, 41 insertions, 7 deletions
diff --git a/source/frontend/StarClientCommandProcessor.cpp b/source/frontend/StarClientCommandProcessor.cpp index ec8d743..d0afb0c 100644 --- a/source/frontend/StarClientCommandProcessor.cpp +++ b/source/frontend/StarClientCommandProcessor.cpp @@ -11,6 +11,7 @@ #include "StarQuestInterface.hpp" #include "StarStatistics.hpp" #include "StarInterfaceLuaBindings.hpp" +#include "StarInput.hpp" namespace Star { @@ -74,7 +75,10 @@ String ClientCommandProcessor::previewQuestPane(StringList const& arguments, fun return "No such quest"; } -StringList ClientCommandProcessor::handleCommand(String const& commandLine) { +StringList ClientCommandProcessor::handleCommand(String const& commandLine, bool userInput) { + Maybe<Input::ClipboardUnlock> unlock; + if (userInput) // allow clipboard usage during this code + unlock = Input::singleton().unlockClipboard(); try { if (!commandLine.beginsWith("/")) throw StarException("ClientCommandProcessor expected command, does not start with '/'"); diff --git a/source/frontend/StarClientCommandProcessor.hpp b/source/frontend/StarClientCommandProcessor.hpp index df60b96..b8bb7e5 100644 --- a/source/frontend/StarClientCommandProcessor.hpp +++ b/source/frontend/StarClientCommandProcessor.hpp @@ -15,7 +15,7 @@ public: ClientCommandProcessor(UniverseClientPtr universeClient, CinematicPtr cinematicOverlay, MainInterfacePaneManager* paneManager, StringMap<StringList> macroCommands); - StringList handleCommand(String const& commandLine); + StringList handleCommand(String const& commandLine, bool userInput = false); bool debugDisplayEnabled() const; bool debugHudEnabled() const; diff --git a/source/frontend/StarClipboardLuaBindings.cpp b/source/frontend/StarClipboardLuaBindings.cpp index bfd461a..2c623e1 100644 --- a/source/frontend/StarClipboardLuaBindings.cpp +++ b/source/frontend/StarClipboardLuaBindings.cpp @@ -7,7 +7,7 @@ namespace Star { LuaCallbacks LuaBindings::makeClipboardCallbacks(ApplicationControllerPtr appController, bool alwaysAllow) { LuaCallbacks callbacks; - auto available = [=]() { return alwaysAllow || (appController->isFocused() && Input::singleton().getTag("clipboard") > 0); }; + auto available = [=]() { return alwaysAllow || (appController->isFocused() && Input::singleton().clipboardAllowed()); }; callbacks.registerCallback("available", [=]() -> bool { return available(); diff --git a/source/frontend/StarMainInterface.cpp b/source/frontend/StarMainInterface.cpp index e3b1860..572b39f 100644 --- a/source/frontend/StarMainInterface.cpp +++ b/source/frontend/StarMainInterface.cpp @@ -878,7 +878,7 @@ void MainInterface::doChat(String const& chat, bool addToHistory) { if (chat.beginsWith("/")) { m_lastCommand = chat; - for (auto const& result : m_clientCommandProcessor->handleCommand(chat)) + for (auto const& result : m_clientCommandProcessor->handleCommand(chat, true)) m_chat->addLine(result); } else { m_client->sendChat(chat, m_chat->sendMode()); diff --git a/source/game/StarInput.cpp b/source/game/StarInput.cpp index 7577936..d47045d 100644 --- a/source/game/StarInput.cpp +++ b/source/game/StarInput.cpp @@ -678,8 +678,24 @@ void Input::setBinds(String const& categoryId, String const& bindId, Json const& entry.updated(); } -unsigned Input::getTag(String const& tag) { - return m_activeTags.maybe(tag).value(0); +unsigned Input::getTag(String const& tagName) const { + if (auto tag = m_activeTags.ptr(tagName)) + return *tag; + else + return 0; +} + +Input::ClipboardUnlock::ClipboardUnlock(Input& input) + : m_input(&input) { ++m_input->m_clipboardAllowed; }; + +Input::ClipboardUnlock::~ClipboardUnlock() { --m_input->m_clipboardAllowed; }; + +Input::ClipboardUnlock Input::unlockClipboard() { + return Input::ClipboardUnlock(*this); +} + +bool Input::clipboardAllowed() const { + return m_clipboardAllowed > 0 ? true : getTag("clipboard") > 0; } }
\ No newline at end of file diff --git a/source/game/StarInput.hpp b/source/game/StarInput.hpp index f13885c..1746739 100644 --- a/source/game/StarInput.hpp +++ b/source/game/StarInput.hpp @@ -178,8 +178,20 @@ public: void setBinds(String const& categoryId, String const& bindId, Json const& binds); Json getDefaultBinds(String const& categoryId, String const& bindId); Json getBinds(String const& categoryId, String const& bindId); - unsigned getTag(String const& tag); + unsigned getTag(String const& tagName) const; + + class ClipboardUnlock { + public: + ClipboardUnlock(Input& input); + ~ClipboardUnlock(); + + private: + Input* m_input; + }; + + ClipboardUnlock unlockClipboard(); + bool clipboardAllowed() const; private: List<BindEntry*> filterBindEntries(List<BindRef> const& binds, KeyMod mods) const; @@ -214,6 +226,8 @@ private: KeyMod m_pressedMods; bool m_textInputActive; Vec2I m_mousePosition; + + unsigned m_clipboardAllowed = 0; }; } |