From 8fd67cf12a584835e74c1f7a292c30c793e843e1 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Fri, 9 Aug 2013 22:40:12 +0200 Subject: First attempt at Linux console colors Ref.: issue #41 --- source/MCLogger.cpp | 66 +++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 32 deletions(-) (limited to 'source/MCLogger.cpp') diff --git a/source/MCLogger.cpp b/source/MCLogger.cpp index b0ec4efd5..dd15051c2 100644 --- a/source/MCLogger.cpp +++ b/source/MCLogger.cpp @@ -87,71 +87,73 @@ void cMCLogger::LogSimple(const char* a_Text, int a_LogType /* = 0 */ ) -void cMCLogger::Log(const char* a_Format, va_list a_ArgList) +void cMCLogger::Log(const char * a_Format, va_list a_ArgList) { cCSLock Lock(m_CriticalSection); - SetColor( 0x7 ); // 0x7 is default grey color - m_Log->Log( a_Format, a_ArgList ); - SetColor(0x07); // revert color back + SetColor(csGrayOnBlack); + m_Log->Log(a_Format, a_ArgList); } -void cMCLogger::Info(const char* a_Format, va_list a_ArgList) +void cMCLogger::Info(const char * a_Format, va_list a_ArgList) { cCSLock Lock(m_CriticalSection); -// for( int i = 0; i < 16; i++) -// { -// for( int j = 0; j < 16; j++ ) -// { -// SetConsoleTextAttribute( hConsole, i | (j<<4) ); -// printf("0x%x", (i|j<<4)); -// } -// printf("\n"); -// } - - SetColor( 0xe ); // 0xe is yellow - m_Log->Log( a_Format, a_ArgList ); - SetColor(0x07); // revert color back + SetColor(csYellowOnBlack); + m_Log->Log(a_Format, a_ArgList); } -void cMCLogger::Warn(const char* a_Format, va_list a_ArgList) +void cMCLogger::Warn(const char * a_Format, va_list a_ArgList) { cCSLock Lock(m_CriticalSection); - SetColor( 0xc ); // 0xc is red - m_Log->Log( a_Format, a_ArgList ); - SetColor(0x07); // revert color back + SetColor(csRedOnBlack); + m_Log->Log(a_Format, a_ArgList); } -void cMCLogger::Error(const char* a_Format, va_list a_ArgList) +void cMCLogger::Error(const char * a_Format, va_list a_ArgList) { cCSLock Lock(m_CriticalSection); - SetColor( 0xc0 ); // 0xc0 is red bg and black text - m_Log->Log( a_Format, a_ArgList ); - SetColor(0x07); // revert color back + SetColor(csBlackOnRed); + m_Log->Log(a_Format, a_ArgList); } -void cMCLogger::SetColor( unsigned char a_Color ) +void cMCLogger::SetColor(eColorScheme a_Scheme) { -#ifdef _WIN32 - SetConsoleTextAttribute(g_Console, a_Color); -#else - (void)a_Color; -#endif + #ifdef _WIN32 + WORD Attrib = 0x07; // by default, gray on black + switch (a_Scheme) + { + case csGrayOnBlack: Attrib = 0x07; break; + case csYellowOnBlack: Attrib = 0x0e; break; + case csRedOnBlack: Attrib = 0x0c; break; + case csBlackOnRed: Attrib = 0xc0; break; + default: ASSERT(!"Unhandled color scheme"); + } + SetConsoleTextAttribute(g_Console, Attrib); + #elif defined(LINUX) && !defined(ANDROID_NDK) + switch (a_Scheme) + { + case csGrayOnBlack: puts("\x1b[0m"); break; + case csYellowOnBlack: puts("\x1b[33;1m"); break; + case csRedOnBlack: puts("\x1b[31;1m"); break; + case csBlackOnRed: puts("\x1b[7;31;1m"); break; + default: ASSERT(!"Unhandled color scheme"); + } + #endif } -- cgit v1.2.3 From 2a97bed3b4831d1fe1000d1c75c068a942020b14 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 10 Aug 2013 09:42:20 +0200 Subject: Bad preprocesor used for discovering Linux --- source/MCLogger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/MCLogger.cpp') diff --git a/source/MCLogger.cpp b/source/MCLogger.cpp index dd15051c2..e6fc86775 100644 --- a/source/MCLogger.cpp +++ b/source/MCLogger.cpp @@ -144,7 +144,7 @@ void cMCLogger::SetColor(eColorScheme a_Scheme) default: ASSERT(!"Unhandled color scheme"); } SetConsoleTextAttribute(g_Console, Attrib); - #elif defined(LINUX) && !defined(ANDROID_NDK) + #elif defined(__linux) && !defined(ANDROID_NDK) switch (a_Scheme) { case csGrayOnBlack: puts("\x1b[0m"); break; -- cgit v1.2.3 From 528feaba2c4df71912cd6734a0beec569b7a7d26 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 10 Aug 2013 09:45:05 +0200 Subject: Use printf() instead of puts(). puts() outputs an extra newline, making it unsuitable --- source/MCLogger.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source/MCLogger.cpp') diff --git a/source/MCLogger.cpp b/source/MCLogger.cpp index e6fc86775..78665f9d2 100644 --- a/source/MCLogger.cpp +++ b/source/MCLogger.cpp @@ -147,10 +147,10 @@ void cMCLogger::SetColor(eColorScheme a_Scheme) #elif defined(__linux) && !defined(ANDROID_NDK) switch (a_Scheme) { - case csGrayOnBlack: puts("\x1b[0m"); break; - case csYellowOnBlack: puts("\x1b[33;1m"); break; - case csRedOnBlack: puts("\x1b[31;1m"); break; - case csBlackOnRed: puts("\x1b[7;31;1m"); break; + case csGrayOnBlack: printf("\x1b[0m"); break; + case csYellowOnBlack: printf("\x1b[33;1m"); break; + case csRedOnBlack: printf("\x1b[31;1m"); break; + case csBlackOnRed: printf("\x1b[7;31;1m"); break; default: ASSERT(!"Unhandled color scheme"); } #endif -- cgit v1.2.3 From 63b2fa21e8c7891da5f232e79f41b845d17c6e3d Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 10 Aug 2013 12:44:39 +0200 Subject: Disabled coloring for redirected output. --- source/MCLogger.cpp | 72 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 13 deletions(-) (limited to 'source/MCLogger.cpp') diff --git a/source/MCLogger.cpp b/source/MCLogger.cpp index 78665f9d2..ae411302f 100644 --- a/source/MCLogger.cpp +++ b/source/MCLogger.cpp @@ -2,6 +2,7 @@ #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include +#include #include "Log.h" @@ -9,15 +10,20 @@ cMCLogger * cMCLogger::s_MCLogger = NULL; +bool g_ShouldColorOutput = false; #ifdef _WIN32 HANDLE g_Console = GetStdHandle(STD_OUTPUT_HANDLE); + WORD g_DefaultConsoleAttrib = 0x07; +#elif defined (__linux) && !defined(ANDROID_NDK) + bool g_ShouldColorOutput; #endif -cMCLogger* cMCLogger::GetInstance() + +cMCLogger * cMCLogger::GetInstance(void) { return s_MCLogger; } @@ -34,6 +40,20 @@ cMCLogger::cMCLogger(void) m_Log->Log("--- Started Log ---"); s_MCLogger = this; + + #ifdef _WIN32 + // See whether we are writing to a console the default console attrib: + g_ShouldColorOutput = (_isatty(_fileno(stdin)) != 0); + if (g_ShouldColorOutput) + { + CONSOLE_SCREEN_BUFFER_INFO sbi; + GetConsoleScreenBufferInfo(g_Console, &sbi); + g_DefaultConsoleAttrib = sbi.wAttributes; + } + #elif defined (__linux) && !defined(ANDROID_NDK) + g_ShouldColorOutput = isatty(fileno(stdin)); + // TODO: Check if the terminal supports colors, somehow? + #endif } @@ -90,8 +110,9 @@ void cMCLogger::LogSimple(const char* a_Text, int a_LogType /* = 0 */ ) void cMCLogger::Log(const char * a_Format, va_list a_ArgList) { cCSLock Lock(m_CriticalSection); - SetColor(csGrayOnBlack); + SetColor(csRegular); m_Log->Log(a_Format, a_ArgList); + ResetColor(); } @@ -101,8 +122,9 @@ void cMCLogger::Log(const char * a_Format, va_list a_ArgList) void cMCLogger::Info(const char * a_Format, va_list a_ArgList) { cCSLock Lock(m_CriticalSection); - SetColor(csYellowOnBlack); + SetColor(csInfo); m_Log->Log(a_Format, a_ArgList); + ResetColor(); } @@ -112,8 +134,9 @@ void cMCLogger::Info(const char * a_Format, va_list a_ArgList) void cMCLogger::Warn(const char * a_Format, va_list a_ArgList) { cCSLock Lock(m_CriticalSection); - SetColor(csRedOnBlack); + SetColor(csWarning); m_Log->Log(a_Format, a_ArgList); + ResetColor(); } @@ -123,8 +146,9 @@ void cMCLogger::Warn(const char * a_Format, va_list a_ArgList) void cMCLogger::Error(const char * a_Format, va_list a_ArgList) { cCSLock Lock(m_CriticalSection); - SetColor(csBlackOnRed); + SetColor(csError); m_Log->Log(a_Format, a_ArgList); + ResetColor(); } @@ -133,24 +157,28 @@ void cMCLogger::Error(const char * a_Format, va_list a_ArgList) void cMCLogger::SetColor(eColorScheme a_Scheme) { + if (!g_ShouldColorOutput) + { + return; + } #ifdef _WIN32 WORD Attrib = 0x07; // by default, gray on black switch (a_Scheme) { - case csGrayOnBlack: Attrib = 0x07; break; - case csYellowOnBlack: Attrib = 0x0e; break; - case csRedOnBlack: Attrib = 0x0c; break; - case csBlackOnRed: Attrib = 0xc0; break; + case csRegular: Attrib = 0x07; break; // Gray on black + case csInfo: Attrib = 0x0e; break; // Yellow on black + case csWarning: Attrib = 0x0c; break; // Read on black + case csError: Attrib = 0xc0; break; // Black on red default: ASSERT(!"Unhandled color scheme"); } SetConsoleTextAttribute(g_Console, Attrib); #elif defined(__linux) && !defined(ANDROID_NDK) switch (a_Scheme) { - case csGrayOnBlack: printf("\x1b[0m"); break; - case csYellowOnBlack: printf("\x1b[33;1m"); break; - case csRedOnBlack: printf("\x1b[31;1m"); break; - case csBlackOnRed: printf("\x1b[7;31;1m"); break; + case csRegular: printf("\x1b[0m"); break; // Whatever the console default is + case csInfo: printf("\x1b[33;1m"); break; // Yellow on black + case csWarning: printf("\x1b[31;1m"); break; // Red on black + case csError: printf("\x1b[1;33;41;1m"); break; // Yellow on red default: ASSERT(!"Unhandled color scheme"); } #endif @@ -160,8 +188,26 @@ void cMCLogger::SetColor(eColorScheme a_Scheme) +void cMCLogger::ResetColor(void) +{ + if (!g_ShouldColorOutput) + { + return; + } + #ifdef _WIN32 + SetConsoleTextAttribute(g_Console, g_DefaultConsoleAttrib); + #elif defined(__linux) && !defined(ANDROID_NDK) + printf("\x1b[0m"); + #endif +} + + + + + ////////////////////////////////////////////////////////////////////////// // Global functions + void LOG(const char* a_Format, ...) { va_list argList; -- cgit v1.2.3 From 211a8395d4e8f572ac98b753530a1e6e060bf983 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 10 Aug 2013 12:50:23 +0200 Subject: Fixed Linux build. --- source/MCLogger.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source/MCLogger.cpp') diff --git a/source/MCLogger.cpp b/source/MCLogger.cpp index ae411302f..99c1533ac 100644 --- a/source/MCLogger.cpp +++ b/source/MCLogger.cpp @@ -2,7 +2,6 @@ #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include -#include #include "Log.h" @@ -13,6 +12,8 @@ cMCLogger * cMCLogger::s_MCLogger = NULL; bool g_ShouldColorOutput = false; #ifdef _WIN32 + #include // Needed for _isatty(), not available on Linux + HANDLE g_Console = GetStdHandle(STD_OUTPUT_HANDLE); WORD g_DefaultConsoleAttrib = 0x07; #elif defined (__linux) && !defined(ANDROID_NDK) -- cgit v1.2.3 From 9794496571b1bd008205049a3abdb9143dc645f5 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 10 Aug 2013 12:51:57 +0200 Subject: Another Linux compilation fix. --- source/MCLogger.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source/MCLogger.cpp') diff --git a/source/MCLogger.cpp b/source/MCLogger.cpp index 99c1533ac..80cbf7406 100644 --- a/source/MCLogger.cpp +++ b/source/MCLogger.cpp @@ -17,6 +17,8 @@ bool g_ShouldColorOutput = false; HANDLE g_Console = GetStdHandle(STD_OUTPUT_HANDLE); WORD g_DefaultConsoleAttrib = 0x07; #elif defined (__linux) && !defined(ANDROID_NDK) + #include // Needed for isatty() on Linux + bool g_ShouldColorOutput; #endif -- cgit v1.2.3 From 19781ecad53c37adc99c4f9b3044b2fb956071c5 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 10 Aug 2013 13:03:05 +0200 Subject: Coloring is reset before the LF. --- source/MCLogger.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'source/MCLogger.cpp') diff --git a/source/MCLogger.cpp b/source/MCLogger.cpp index 80cbf7406..4442fc5b0 100644 --- a/source/MCLogger.cpp +++ b/source/MCLogger.cpp @@ -18,8 +18,6 @@ bool g_ShouldColorOutput = false; WORD g_DefaultConsoleAttrib = 0x07; #elif defined (__linux) && !defined(ANDROID_NDK) #include // Needed for isatty() on Linux - - bool g_ShouldColorOutput; #endif @@ -40,7 +38,7 @@ cMCLogger::cMCLogger(void) AString FileName; Printf(FileName, "LOG_%d.txt", (int)time(NULL)); m_Log = new cLog(FileName); - m_Log->Log("--- Started Log ---"); + m_Log->Log("--- Started Log ---\n"); s_MCLogger = this; @@ -74,7 +72,7 @@ cMCLogger::cMCLogger(const AString & a_FileName) cMCLogger::~cMCLogger() { - m_Log->Log("--- Stopped Log ---"); + m_Log->Log("--- Stopped Log ---\n"); delete m_Log; if (this == s_MCLogger) s_MCLogger = NULL; @@ -116,6 +114,7 @@ void cMCLogger::Log(const char * a_Format, va_list a_ArgList) SetColor(csRegular); m_Log->Log(a_Format, a_ArgList); ResetColor(); + puts(""); } @@ -128,6 +127,7 @@ void cMCLogger::Info(const char * a_Format, va_list a_ArgList) SetColor(csInfo); m_Log->Log(a_Format, a_ArgList); ResetColor(); + puts(""); } @@ -140,6 +140,7 @@ void cMCLogger::Warn(const char * a_Format, va_list a_ArgList) SetColor(csWarning); m_Log->Log(a_Format, a_ArgList); ResetColor(); + puts(""); } @@ -152,6 +153,7 @@ void cMCLogger::Error(const char * a_Format, va_list a_ArgList) SetColor(csError); m_Log->Log(a_Format, a_ArgList); ResetColor(); + puts(""); } -- cgit v1.2.3 From 15f80e0811fbc3a842eb29a2f203e107102935c8 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sat, 10 Aug 2013 13:07:49 +0200 Subject: Linux color redirection fixed. Outputting to stdin, yeah, right, that's gonna work :P --- source/MCLogger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source/MCLogger.cpp') diff --git a/source/MCLogger.cpp b/source/MCLogger.cpp index 4442fc5b0..de0fcae2e 100644 --- a/source/MCLogger.cpp +++ b/source/MCLogger.cpp @@ -52,7 +52,7 @@ cMCLogger::cMCLogger(void) g_DefaultConsoleAttrib = sbi.wAttributes; } #elif defined (__linux) && !defined(ANDROID_NDK) - g_ShouldColorOutput = isatty(fileno(stdin)); + g_ShouldColorOutput = isatty(fileno(stdout)); // TODO: Check if the terminal supports colors, somehow? #endif } -- cgit v1.2.3