|
|
@@ -15,14 +15,6 @@
|
|
|
|
|
|
#include <boost/stacktrace.hpp>
|
|
|
|
|
|
-VCMI_LIB_NAMESPACE_BEGIN
|
|
|
-
|
|
|
-std::mutex CConsoleHandler::smx;
|
|
|
-
|
|
|
-DLL_LINKAGE CConsoleHandler * console = nullptr;
|
|
|
-
|
|
|
-VCMI_LIB_NAMESPACE_END
|
|
|
-
|
|
|
#if defined(NDEBUG) && !defined(VCMI_ANDROID)
|
|
|
#define USE_ON_TERMINATE
|
|
|
#endif
|
|
|
@@ -33,37 +25,31 @@ VCMI_LIB_NAMESPACE_END
|
|
|
#endif
|
|
|
|
|
|
#ifndef VCMI_WINDOWS
|
|
|
- using TColor = std::string;
|
|
|
- #define CONSOLE_GREEN "\x1b[1;32m"
|
|
|
- #define CONSOLE_RED "\x1b[1;31m"
|
|
|
- #define CONSOLE_MAGENTA "\x1b[1;35m"
|
|
|
- #define CONSOLE_YELLOW "\x1b[1;33m"
|
|
|
- #define CONSOLE_WHITE "\x1b[1;37m"
|
|
|
- #define CONSOLE_GRAY "\x1b[1;30m"
|
|
|
- #define CONSOLE_TEAL "\x1b[1;36m"
|
|
|
+constexpr const char * CONSOLE_GREEN = "\x1b[1;32m";
|
|
|
+constexpr const char * CONSOLE_RED = "\x1b[1;31m";
|
|
|
+constexpr const char * CONSOLE_MAGENTA = "\x1b[1;35m";
|
|
|
+constexpr const char * CONSOLE_YELLOW = "\x1b[1;33m";
|
|
|
+constexpr const char * CONSOLE_WHITE = "\x1b[1;37m";
|
|
|
+constexpr const char * CONSOLE_GRAY = "\x1b[1;30m";
|
|
|
+constexpr const char * CONSOLE_TEAL = "\x1b[1;36m";
|
|
|
#else
|
|
|
- #include <windows.h>
|
|
|
- #include <dbghelp.h>
|
|
|
+#include <windows.h>
|
|
|
+#include <dbghelp.h>
|
|
|
#ifndef __MINGW32__
|
|
|
#pragma comment(lib, "dbghelp.lib")
|
|
|
#endif
|
|
|
- typedef WORD TColor;
|
|
|
- HANDLE handleIn;
|
|
|
- HANDLE handleOut;
|
|
|
- HANDLE handleErr;
|
|
|
- #define CONSOLE_GREEN FOREGROUND_GREEN | FOREGROUND_INTENSITY
|
|
|
- #define CONSOLE_RED FOREGROUND_RED | FOREGROUND_INTENSITY
|
|
|
- #define CONSOLE_MAGENTA FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY
|
|
|
- #define CONSOLE_YELLOW FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY
|
|
|
- #define CONSOLE_WHITE FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY
|
|
|
- #define CONSOLE_GRAY FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
|
|
|
- #define CONSOLE_TEAL FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY
|
|
|
-
|
|
|
- static TColor defErrColor;
|
|
|
+HANDLE handleIn;
|
|
|
+HANDLE handleOut;
|
|
|
+HANDLE handleErr;
|
|
|
+constexpr int32_t CONSOLE_GREEN = FOREGROUND_GREEN | FOREGROUND_INTENSITY;
|
|
|
+constexpr int32_t CONSOLE_RED = FOREGROUND_RED | FOREGROUND_INTENSITY;
|
|
|
+constexpr int32_t CONSOLE_MAGENTA = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
|
|
|
+constexpr int32_t CONSOLE_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
|
|
|
+constexpr int32_t CONSOLE_WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
|
|
|
+constexpr int32_t CONSOLE_GRAY = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
|
|
|
+constexpr int32_t CONSOLE_TEAL = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
|
|
|
#endif
|
|
|
|
|
|
-static TColor defColor;
|
|
|
-
|
|
|
VCMI_LIB_NAMESPACE_BEGIN
|
|
|
|
|
|
#ifdef CREATE_MEMORY_DUMP
|
|
|
@@ -202,7 +188,7 @@ LONG WINAPI onUnhandledException(EXCEPTION_POINTERS* exception)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-void CConsoleHandler::setColor(EConsoleTextColor::EConsoleTextColor color)
|
|
|
+void CConsoleHandler::setColor(EConsoleTextColor color)
|
|
|
{
|
|
|
TColor colorCode;
|
|
|
switch(color)
|
|
|
@@ -245,12 +231,12 @@ void CConsoleHandler::setColor(EConsoleTextColor::EConsoleTextColor color)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-int CConsoleHandler::run() const
|
|
|
+int CConsoleHandler::run()
|
|
|
{
|
|
|
setThreadName("consoleHandler");
|
|
|
//disabling sync to make in_avail() work (othervice always returns 0)
|
|
|
{
|
|
|
- TLockGuard _(smx);
|
|
|
+ std::lock_guard guard(smx);
|
|
|
std::ios::sync_with_stdio(false);
|
|
|
}
|
|
|
std::string buffer;
|
|
|
@@ -262,8 +248,8 @@ int CConsoleHandler::run() const
|
|
|
if (std::cin.rdbuf()->in_avail())
|
|
|
{
|
|
|
if ( getline(std::cin, buffer).good() )
|
|
|
- if ( cb && *cb )
|
|
|
- (*cb)(buffer, false);
|
|
|
+ if ( cb )
|
|
|
+ cb(buffer, false);
|
|
|
}
|
|
|
else
|
|
|
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
|
|
|
@@ -271,15 +257,19 @@ int CConsoleHandler::run() const
|
|
|
boost::this_thread::interruption_point();
|
|
|
#else
|
|
|
std::getline(std::cin, buffer);
|
|
|
- if ( cb && *cb )
|
|
|
- (*cb)(buffer, false);
|
|
|
+ if ( cb )
|
|
|
+ cb(buffer, false);
|
|
|
#endif
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
|
-CConsoleHandler::CConsoleHandler():
|
|
|
- cb(new std::function<void(const std::string &, bool)>),
|
|
|
- thread(nullptr)
|
|
|
+
|
|
|
+CConsoleHandler::CConsoleHandler()
|
|
|
+ :CConsoleHandler(std::function<void(const std::string &, bool)>{})
|
|
|
+{}
|
|
|
+
|
|
|
+CConsoleHandler::CConsoleHandler(const std::function<void(const std::string &, bool)> & callback)
|
|
|
+ :cb(callback)
|
|
|
{
|
|
|
#ifdef VCMI_WINDOWS
|
|
|
handleIn = GetStdHandle(STD_INPUT_HANDLE);
|
|
|
@@ -309,27 +299,24 @@ CConsoleHandler::~CConsoleHandler()
|
|
|
{
|
|
|
logGlobal->info("Killing console...");
|
|
|
end();
|
|
|
- delete cb;
|
|
|
logGlobal->info("Killing console... done!");
|
|
|
}
|
|
|
void CConsoleHandler::end()
|
|
|
{
|
|
|
- if (thread)
|
|
|
+ if (thread.joinable())
|
|
|
{
|
|
|
#ifndef VCMI_WINDOWS
|
|
|
- thread->interrupt();
|
|
|
+ thread.interrupt();
|
|
|
#else
|
|
|
- TerminateThread(thread->native_handle(),0);
|
|
|
+ TerminateThread(thread.native_handle(),0);
|
|
|
#endif
|
|
|
- thread->join();
|
|
|
- delete thread;
|
|
|
- thread = nullptr;
|
|
|
+ thread.join();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void CConsoleHandler::start()
|
|
|
{
|
|
|
- thread = new boost::thread(std::bind(&CConsoleHandler::run,console));
|
|
|
+ thread = boost::thread(std::bind(&CConsoleHandler::run, this));
|
|
|
}
|
|
|
|
|
|
VCMI_LIB_NAMESPACE_END
|