Fix Android build, but there is a remaining linking issue in guiConfirmRegistration
[oweals/minetest.git] / src / chat.cpp
index fd0718707ef54d8c37026b18ff4b5ad27a68371c..38c0332bf753c78c928ce7d69bce0bd09c9420d1 100644 (file)
@@ -18,11 +18,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "chat.h"
-#include "debug.h"
-#include "config.h"
-#include "util/strfnd.h"
+
+#include <algorithm>
 #include <cctype>
 #include <sstream>
+
+#include "config.h"
+#include "debug.h"
+#include "util/strfnd.h"
 #include "util/string.h"
 #include "util/numeric.h"
 
@@ -369,6 +372,12 @@ s32 ChatBuffer::getBottomScrollPos() const
        return formatted_count - rows;
 }
 
+void ChatBuffer::resize(u32 scrollback)
+{
+       m_scrollback = scrollback;
+       if (m_unformatted.size() > m_scrollback)
+               deleteOldest(m_unformatted.size() - m_scrollback);
+}
 
 
 ChatPrompt::ChatPrompt(const std::wstring &prompt, u32 history_limit):
@@ -397,8 +406,14 @@ void ChatPrompt::input(const std::wstring &str)
 
 void ChatPrompt::addToHistory(std::wstring line)
 {
-       if (!line.empty())
+       if (!line.empty() &&
+                       (m_history.size() == 0 || m_history.back() != line)) {
+               // Remove all duplicates
+               m_history.erase(std::remove(m_history.begin(), m_history.end(),
+                       line), m_history.end());
+               // Push unique line
                m_history.push_back(line);
+       }
        if (m_history.size() > m_history_limit)
                m_history.erase(m_history.begin());
        m_history_index = m_history.size();
@@ -693,11 +708,10 @@ ChatBuffer& ChatBackend::getRecentBuffer()
        return m_recent_buffer;
 }
 
-EnrichedString ChatBackend::getRecentChat()
+EnrichedString ChatBackend::getRecentChat() const
 {
        EnrichedString result;
-       for (u32 i = 0; i < m_recent_buffer.getLineCount(); ++i)
-       {
+       for (u32 i = 0; i < m_recent_buffer.getLineCount(); ++i) {
                const ChatLine& line = m_recent_buffer.getLine(i);
                if (i != 0)
                        result += L"\n";
@@ -731,6 +745,14 @@ void ChatBackend::clearRecentChat()
        m_recent_buffer.clear();
 }
 
+
+void ChatBackend::applySettings()
+{
+       u32 recent_lines = g_settings->getU32("recent_chat_messages");
+       recent_lines = rangelim(recent_lines, 2, 20);
+       m_recent_buffer.resize(recent_lines);
+}
+
 void ChatBackend::step(float dtime)
 {
        m_recent_buffer.step(dtime);