mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Merge pull request #278 from yuriks/log-colors
Restore the original console color after logging a message.
This commit is contained in:
		
						commit
						8eac8ee3f3
					
				
					 2 changed files with 25 additions and 13 deletions
				
			
		|  | @ -54,12 +54,22 @@ void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len) { | ||||||
|         TrimSourcePath(entry.location.c_str()), entry.message.c_str()); |         TrimSourcePath(entry.location.c_str()), entry.message.c_str()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void ChangeConsoleColor(Level level) { | void PrintMessage(const Entry& entry) { | ||||||
|  |     std::array<char, 4 * 1024> format_buffer; | ||||||
|  |     FormatLogMessage(entry, format_buffer.data(), format_buffer.size()); | ||||||
|  |     fputs(format_buffer.data(), stderr); | ||||||
|  |     fputc('\n', stderr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void PrintColoredMessage(const Entry& entry) { | ||||||
| #ifdef _WIN32 | #ifdef _WIN32 | ||||||
|     static HANDLE console_handle = GetStdHandle(STD_ERROR_HANDLE); |     static HANDLE console_handle = GetStdHandle(STD_ERROR_HANDLE); | ||||||
| 
 | 
 | ||||||
|  |     CONSOLE_SCREEN_BUFFER_INFO original_info = {0}; | ||||||
|  |     GetConsoleScreenBufferInfo(console_handle, &original_info); | ||||||
|  | 
 | ||||||
|     WORD color = 0; |     WORD color = 0; | ||||||
|     switch (level) { |     switch (entry.log_level) { | ||||||
|     case Level::Trace: // Grey
 |     case Level::Trace: // Grey
 | ||||||
|         color = FOREGROUND_INTENSITY; break; |         color = FOREGROUND_INTENSITY; break; | ||||||
|     case Level::Debug: // Cyan
 |     case Level::Debug: // Cyan
 | ||||||
|  | @ -76,9 +86,9 @@ static void ChangeConsoleColor(Level level) { | ||||||
| 
 | 
 | ||||||
|     SetConsoleTextAttribute(console_handle, color); |     SetConsoleTextAttribute(console_handle, color); | ||||||
| #else | #else | ||||||
| #define ESC "\x1b" | #   define ESC "\x1b" | ||||||
|     const char* color = ""; |     const char* color = ""; | ||||||
|     switch (level) { |     switch (entry.log_level) { | ||||||
|     case Level::Trace: // Grey
 |     case Level::Trace: // Grey
 | ||||||
|         color = ESC "[1;30m"; break; |         color = ESC "[1;30m"; break; | ||||||
|     case Level::Debug: // Cyan
 |     case Level::Debug: // Cyan
 | ||||||
|  | @ -92,18 +102,18 @@ static void ChangeConsoleColor(Level level) { | ||||||
|     case Level::Critical: // Bright magenta
 |     case Level::Critical: // Bright magenta
 | ||||||
|         color = ESC "[1;35m"; break; |         color = ESC "[1;35m"; break; | ||||||
|     } |     } | ||||||
| #undef ESC |  | ||||||
| 
 | 
 | ||||||
|     fputs(color, stderr); |     fputs(color, stderr); | ||||||
| #endif | #endif | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| void PrintMessage(const Entry& entry) { |     PrintMessage(entry); | ||||||
|     ChangeConsoleColor(entry.log_level); | 
 | ||||||
|     std::array<char, 4 * 1024> format_buffer; | #ifdef _WIN32 | ||||||
|     FormatLogMessage(entry, format_buffer.data(), format_buffer.size()); |     SetConsoleTextAttribute(console_handle, original_info.wAttributes); | ||||||
|     fputs(format_buffer.data(), stderr); | #else | ||||||
|     fputc('\n', stderr); |     fputs(ESC "[0m", stderr); | ||||||
|  | #   undef ESC | ||||||
|  | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void TextLoggingLoop(std::shared_ptr<Logger> logger, const Filter* filter) { | void TextLoggingLoop(std::shared_ptr<Logger> logger, const Filter* filter) { | ||||||
|  | @ -117,7 +127,7 @@ void TextLoggingLoop(std::shared_ptr<Logger> logger, const Filter* filter) { | ||||||
|         for (size_t i = 0; i < num_entries; ++i) { |         for (size_t i = 0; i < num_entries; ++i) { | ||||||
|             const Entry& entry = entry_buffer[i]; |             const Entry& entry = entry_buffer[i]; | ||||||
|             if (filter->CheckMessage(entry.log_class, entry.log_level)) { |             if (filter->CheckMessage(entry.log_class, entry.log_level)) { | ||||||
|                 PrintMessage(entry); |                 PrintColoredMessage(entry); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -29,6 +29,8 @@ const char* TrimSourcePath(const char* path, const char* root = "src"); | ||||||
| void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len); | void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len); | ||||||
| /// Formats and prints a log entry to stderr.
 | /// Formats and prints a log entry to stderr.
 | ||||||
| void PrintMessage(const Entry& entry); | void PrintMessage(const Entry& entry); | ||||||
|  | /// Prints the same message as `PrintMessage`, but colored acoording to the severity level.
 | ||||||
|  | void PrintColoredMessage(const Entry& entry); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Logging loop that repeatedly reads messages from the provided logger and prints them to the |  * Logging loop that repeatedly reads messages from the provided logger and prints them to the | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue