Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/frontend/StarClientCommandProcessor.cpp6
-rw-r--r--source/frontend/StarClientCommandProcessor.hpp2
-rw-r--r--source/frontend/StarClipboardLuaBindings.cpp2
-rw-r--r--source/frontend/StarMainInterface.cpp2
-rw-r--r--source/game/StarInput.cpp20
-rw-r--r--source/game/StarInput.hpp16
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;
};
}