diff --git a/src/terminal/terminalframebuffer.cc b/src/terminal/terminalframebuffer.cc index 626cb72..2751f3b 100644 --- a/src/terminal/terminalframebuffer.cc +++ b/src/terminal/terminalframebuffer.cc @@ -522,6 +522,7 @@ void Renditions::set_background_color( int num ) std::string Renditions::sgr( void ) const { std::string ret; + char col[64]; ret.append( "\033[0" ); if ( get_attribute( bold ) ) ret.append( ";1" ); @@ -531,49 +532,34 @@ std::string Renditions::sgr( void ) const if ( get_attribute( inverse ) ) ret.append( ";7" ); if ( get_attribute( invisible ) ) ret.append( ";8" ); - if ( foreground_color - && (foreground_color <= 37) ) { - /* ANSI foreground color */ - char col[ 8 ]; - snprintf( col, 8, ";%u", static_cast( foreground_color ) ); + if ( foreground_color ) { + if ( is_true_color( foreground_color ) ) { + snprintf( col, sizeof( col ), ";38;2;%u;%u;%u", + (foreground_color >> 16) & 0xff, + (foreground_color >> 8) & 0xff, + foreground_color & 0xff); + } else if ( foreground_color > 37 ) { /* use 256-color set */ + snprintf( col, sizeof( col ), ";38;5;%u", foreground_color - 30 ); + } else { /* ANSI foreground color */ + snprintf( col, sizeof( col ), ";%u", static_cast( foreground_color ) ); + } ret.append( col ); } - - if ( background_color - && (background_color <= 47) ) { - char col[ 8 ]; - snprintf( col, 8, ";%u", static_cast( background_color ) ); + if ( background_color ) { + if ( is_true_color( background_color ) ) { + snprintf( col, sizeof( col ), ";48;2;%u;%u;%u", + (background_color >> 16) & 0xff, + (background_color >> 8) & 0xff, + background_color & 0xff); + } else if ( background_color > 47 ) { /* use 256-color set */ + snprintf( col, sizeof( col ), ";48;5;%u", background_color - 40 ); + } else { /* ANSI background color */ + snprintf( col, sizeof( col ), ";%u", static_cast( background_color ) ); + } ret.append( col ); } - ret.append( "m" ); - if ( is_true_color( foreground_color ) ) { - char col[64]; - snprintf( col, 64, "\033[38;2;%u;%u;%um", - (foreground_color >> 16) & 0xff, - (foreground_color >> 8) & 0xff, - foreground_color & 0xff); - ret.append( col ); - } else if ( foreground_color > 37 ) { /* use 256-color set */ - char col[ 64 ]; - snprintf( col, 64, "\033[38;5;%um", foreground_color - 30 ); - ret.append( col ); - } - - if ( is_true_color( background_color ) ) { - char col[64]; - snprintf( col, 64, "\033[48;2;%u;%u;%um", - (background_color >> 16) & 0xff, - (background_color >> 8) & 0xff, - background_color & 0xff); - ret.append( col ); - } else if ( background_color > 47 ) { /* use 256-color set */ - char col[ 64 ]; - snprintf( col, 64, "\033[48;5;%um", background_color - 40 ); - ret.append( col ); - } - return ret; }