mirror of
https://github.com/AxioDL/logvisor.git
synced 2025-05-17 04:41:29 +00:00
support for conemu ANSI terminal on windows
This commit is contained in:
parent
7be764c387
commit
d133a8cdd4
147
lib/LogVisor.cpp
147
lib/LogVisor.cpp
@ -3,6 +3,10 @@
|
|||||||
#define WIN32_LEAN_AND_MEAN 1
|
#define WIN32_LEAN_AND_MEAN 1
|
||||||
#endif
|
#endif
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -63,6 +67,23 @@ static inline std::chrono::steady_clock::duration CurrentUptime()
|
|||||||
{return MonoClock.now() - GlobalStart;}
|
{return MonoClock.now() - GlobalStart;}
|
||||||
std::atomic_uint_fast64_t FrameIndex(0);
|
std::atomic_uint_fast64_t FrameIndex(0);
|
||||||
|
|
||||||
|
static inline int ConsoleWidth()
|
||||||
|
{
|
||||||
|
int retval = 80;
|
||||||
|
#if _WIN32
|
||||||
|
CONSOLE_SCREEN_BUFFER_INFO info;
|
||||||
|
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
|
||||||
|
retval = info.dwSize.X;
|
||||||
|
#else
|
||||||
|
struct winsize w;
|
||||||
|
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1)
|
||||||
|
retval = w.ws_col;
|
||||||
|
#endif
|
||||||
|
if (retval < 10)
|
||||||
|
return 10;
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
static HANDLE Term = 0;
|
static HANDLE Term = 0;
|
||||||
#else
|
#else
|
||||||
@ -75,6 +96,9 @@ struct ConsoleLogger : public ILogger
|
|||||||
ConsoleLogger()
|
ConsoleLogger()
|
||||||
{
|
{
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
|
const char* conemuANSI = getenv("ConEmuANSI");
|
||||||
|
if (conemuANSI && !strcmp(conemuANSI, "ON"))
|
||||||
|
XtermColor = true;
|
||||||
if (!Term)
|
if (!Term)
|
||||||
Term = GetStdHandle(STD_ERROR_HANDLE);
|
Term = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
#else
|
#else
|
||||||
@ -92,6 +116,13 @@ struct ConsoleLogger : public ILogger
|
|||||||
|
|
||||||
static void _reportHead(const char* modName, const char* sourceInfo, Level severity)
|
static void _reportHead(const char* modName, const char* sourceInfo, Level severity)
|
||||||
{
|
{
|
||||||
|
/* Clear current line out */
|
||||||
|
int width = ConsoleWidth();
|
||||||
|
fprintf(stderr, "\r");
|
||||||
|
for (int w=0 ; w<width ; ++w)
|
||||||
|
fprintf(stderr, " ");
|
||||||
|
fprintf(stderr, "\r");
|
||||||
|
|
||||||
std::chrono::steady_clock::duration tm = CurrentUptime();
|
std::chrono::steady_clock::duration tm = CurrentUptime();
|
||||||
double tmd = tm.count() *
|
double tmd = tm.count() *
|
||||||
std::chrono::steady_clock::duration::period::num /
|
std::chrono::steady_clock::duration::period::num /
|
||||||
@ -101,70 +132,29 @@ struct ConsoleLogger : public ILogger
|
|||||||
if (ThreadMap.find(thrId) != ThreadMap.end())
|
if (ThreadMap.find(thrId) != ThreadMap.end())
|
||||||
thrName = ThreadMap[thrId];
|
thrName = ThreadMap[thrId];
|
||||||
|
|
||||||
#if _WIN32
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_WHITE);
|
|
||||||
fprintf(stderr, "[");
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
|
|
||||||
fprintf(stderr, "%5.4f ", tmd);
|
|
||||||
uint64_t fi = FrameIndex.load();
|
|
||||||
if (fi)
|
|
||||||
fprintf(stderr, "(%" PRIu64 ") ", fi);
|
|
||||||
switch (severity)
|
|
||||||
{
|
|
||||||
case Info:
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);
|
|
||||||
fprintf(stderr, "INFO");
|
|
||||||
break;
|
|
||||||
case Warning:
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
|
|
||||||
fprintf(stderr, "WARNING");
|
|
||||||
break;
|
|
||||||
case Error:
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_RED);
|
|
||||||
fprintf(stderr, "ERROR");
|
|
||||||
break;
|
|
||||||
case FatalError:
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_RED);
|
|
||||||
fprintf(stderr, "FATAL ERROR");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_WHITE);
|
|
||||||
fprintf(stderr, " %s", modName);
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
|
|
||||||
if (sourceInfo)
|
|
||||||
fprintf(stderr, " {%s}", sourceInfo);
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);
|
|
||||||
if (thrName)
|
|
||||||
fprintf(stderr, " (%s)", thrName);
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_WHITE);
|
|
||||||
fprintf(stderr, "] ");
|
|
||||||
SetConsoleTextAttribute(Term, FOREGROUND_WHITE);
|
|
||||||
#else
|
|
||||||
if (XtermColor)
|
if (XtermColor)
|
||||||
{
|
{
|
||||||
fprintf(stderr, BOLD "[");
|
fprintf(stderr, BOLD "[");
|
||||||
fprintf(stderr, GREEN "%5.4f ", tmd);
|
fprintf(stderr, GREEN "%5.4f ", tmd);
|
||||||
uint_fast64_t fIdx = FrameIndex.load();
|
uint_fast64_t fIdx = FrameIndex.load();
|
||||||
if (fIdx)
|
if (fIdx)
|
||||||
fprintf(stderr, "(%lu) ", fIdx);
|
fprintf(stderr, "(%" PRIu64 ") ", fIdx);
|
||||||
switch (severity)
|
switch (severity)
|
||||||
{
|
{
|
||||||
case Info:
|
case Info:
|
||||||
fprintf(stderr, BOLD CYAN "INFO");
|
fprintf(stderr, BOLD CYAN "INFO");
|
||||||
break;
|
break;
|
||||||
case Warning:
|
case Warning:
|
||||||
fprintf(stderr, BOLD YELLOW "WARNING");
|
fprintf(stderr, BOLD YELLOW "WARNING");
|
||||||
break;
|
break;
|
||||||
case Error:
|
case Error:
|
||||||
fprintf(stderr, RED BOLD "ERROR");
|
fprintf(stderr, RED BOLD "ERROR");
|
||||||
break;
|
break;
|
||||||
case FatalError:
|
case FatalError:
|
||||||
fprintf(stderr, BOLD RED "FATAL ERROR");
|
fprintf(stderr, BOLD RED "FATAL ERROR");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
fprintf(stderr, NORMAL BOLD " %s", modName);
|
fprintf(stderr, NORMAL BOLD " %s", modName);
|
||||||
if (sourceInfo)
|
if (sourceInfo)
|
||||||
@ -175,11 +165,52 @@ struct ConsoleLogger : public ILogger
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#if _WIN32
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_WHITE);
|
||||||
|
fprintf(stderr, "[");
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
|
||||||
|
fprintf(stderr, "%5.4f ", tmd);
|
||||||
|
uint64_t fi = FrameIndex.load();
|
||||||
|
if (fi)
|
||||||
|
fprintf(stderr, "(%" PRIu64 ") ", fi);
|
||||||
|
switch (severity)
|
||||||
|
{
|
||||||
|
case Info:
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);
|
||||||
|
fprintf(stderr, "INFO");
|
||||||
|
break;
|
||||||
|
case Warning:
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
|
||||||
|
fprintf(stderr, "WARNING");
|
||||||
|
break;
|
||||||
|
case Error:
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_RED);
|
||||||
|
fprintf(stderr, "ERROR");
|
||||||
|
break;
|
||||||
|
case FatalError:
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_RED);
|
||||||
|
fprintf(stderr, "FATAL ERROR");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_WHITE);
|
||||||
|
fprintf(stderr, " %s", modName);
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
|
||||||
|
if (sourceInfo)
|
||||||
|
fprintf(stderr, " {%s}", sourceInfo);
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);
|
||||||
|
if (thrName)
|
||||||
|
fprintf(stderr, " (%s)", thrName);
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_INTENSITY | FOREGROUND_WHITE);
|
||||||
|
fprintf(stderr, "] ");
|
||||||
|
SetConsoleTextAttribute(Term, FOREGROUND_WHITE);
|
||||||
|
#else
|
||||||
fprintf(stderr, "[");
|
fprintf(stderr, "[");
|
||||||
fprintf(stderr, "%5.4f ", tmd);
|
fprintf(stderr, "%5.4f ", tmd);
|
||||||
uint_fast64_t fIdx = FrameIndex.load();
|
uint_fast64_t fIdx = FrameIndex.load();
|
||||||
if (fIdx)
|
if (fIdx)
|
||||||
fprintf(stderr, "(%lu) ", fIdx);
|
fprintf(stderr, "(%" PRIu64 ") ", fIdx);
|
||||||
switch (severity)
|
switch (severity)
|
||||||
{
|
{
|
||||||
case Info:
|
case Info:
|
||||||
@ -203,8 +234,8 @@ struct ConsoleLogger : public ILogger
|
|||||||
if (thrName)
|
if (thrName)
|
||||||
fprintf(stderr, " (%s)", thrName);
|
fprintf(stderr, " (%s)", thrName);
|
||||||
fprintf(stderr, "] ");
|
fprintf(stderr, "] ");
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void report(const char* modName, Level severity,
|
void report(const char* modName, Level severity,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user