#include "Screen.h" #include "CursesObj.h" #include "curses.h" #include #include // Forward declarations int ConvertColour(int); void Screen::write(std::string s, int x, int y, int color) { CursesObj::Instance(); // Force initialization if (color >= 128) color -= 128; // Remove gray background - does not work on Linux std::string blank_str(s.length(), ' '); mvaddstr(y, x, blank_str.c_str()); // Always draw a black refresh(); if (color != Screen::BLACK) // If colour is not black, also draw the color { printf("\e[%i;3%im", 0, ConvertColour(color)); fflush(stdout); mvaddstr(y, x, s.c_str()); refresh(); } } typedef struct { int pelio_colour; int curses_color_pair; } Entry; // Entry null pointer const Entry *ENTRY_NP = (Entry *)0; typedef Entry Table[]; Table ColourTable = {{Screen::GRAY, 8}, // Display as white {Screen::BLUE, 4}, {Screen::GREEN, 2}, {Screen::RED, 1}, {Screen::YELLOW, 3}, {Screen::WHITE, 7}}; const int LEN_TAB = sizeof ColourTable / sizeof ColourTable[0]; const Entry *TabSearch(Table t, int nEntries, int colour) { Entry *p; for (p = t; p < t + nEntries && p->pelio_colour != colour; p++) ; // EMPTY BODY return (p < t + nEntries) ? p : ENTRY_NP; } int ConvertColour(int colour) { int result = 0; const Entry *p; p = TabSearch(ColourTable, LEN_TAB, colour); // Search the table for the colour specified if (p != ENTRY_NP) // If the colour is in the table ... result = p->curses_color_pair; // ... return the 'int' for the associated // curses colour pair return result; }