diff --git a/ChangeLog b/ChangeLog index 701fd60a..79ebb5f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2016-11-05 Markus Gans + * Determine xterm maximum number of colors via OSC 4 + * The method clearArea can now fill the background + with certain character + 2016-11-03 Markus Gans * xterm should be able to use at least 16 colors diff --git a/src/fterm.cpp b/src/fterm.cpp index a678724e..8b6ba1da 100644 --- a/src/fterm.cpp +++ b/src/fterm.cpp @@ -813,6 +813,39 @@ const FString FTerm::getXTermTitle() return title; } +//---------------------------------------------------------------------- +const FString FTerm::getXTermColorName (int color) +{ + FString color_str(""); + + if ( raw_mode && non_blocking_stdin ) + { + int n; + int c = color; + int digits = 0; + + while ( c /= 10 ) + digits++; + + char temp[512] = {}; + putstringf (OSC "4;%d;?" BEL, color); // get color + std::fflush(stdout); + usleep(150000); // wait 150 ms + + // read the terminal answer + n = int(read(fileno(stdin), &temp, sizeof(temp)-1)); + + // BEL + '\0' = string terminator + if ( n >= 6 && temp[n-1] == BEL[0] && temp[n] == '\0' ) + { + temp[n-1] = '\0'; + color_str = static_cast(temp + 6 + digits); + } + } + + return color_str; +} + //---------------------------------------------------------------------- void FTerm::setXTermCursorStyle (fc::xtermCursorStyle style) { @@ -1544,6 +1577,16 @@ bool FTerm::gpmMouse (bool on) // private methods of FTerm +//---------------------------------------------------------------------- +int FTerm::isConsole() +{ + char arg = 0; + // get keyboard type an compare + return ( isatty (fd_tty) + && ioctl(fd_tty, KDGKBTYPE, &arg) == 0 + && ((arg == KB_101) || (arg == KB_84)) ); +} + //---------------------------------------------------------------------- inline uInt16 FTerm::getInputStatusRegisterOne() { @@ -1705,16 +1748,6 @@ int FTerm::closeConsole() return -1; } -//---------------------------------------------------------------------- -int FTerm::isConsole() -{ - char arg = 0; - // get keyboard type an compare - return ( isatty (fd_tty) - && ioctl(fd_tty, KDGKBTYPE, &arg) == 0 - && ((arg == KB_101) || (arg == KB_84)) ); -} - //---------------------------------------------------------------------- void FTerm::identifyTermType() { @@ -2954,6 +2987,22 @@ void FTerm::init() // Identify the terminal via the secondary device attributes (SEC_DA) new_termtype = parseSecDA (new_termtype); + if ( ! color256 && getXTermColorName(0) != "" ) + { + if ( getXTermColorName(256) != "" ) + { + new_termtype = const_cast("xterm-256color"); + } + else if ( FTermcap::max_color < 88 && getXTermColorName(87) != "" ) + { + new_termtype = const_cast("xterm-88color"); + } + else if ( FTermcap::max_color < 16 && getXTermColorName(15) != "" ) + { + new_termtype = const_cast("xterm-16color"); + } + } + unsetRawMode(); // ...end of terminal detection @@ -2968,7 +3017,7 @@ void FTerm::init() // Each xterm should be able to use at least 16 colors if ( ! new_termtype && std::strlen(termtype) == 5 ) - new_termtype = const_cast("xterm-16color"); + new_termtype = const_cast("xterm-16color"); } else xterm_terminal = false; @@ -3069,19 +3118,7 @@ void FTerm::init() } setXTermCursorStyle(fc::blinking_underline); - setXTermMouseBackground("rgb:ffff/ffff/ffff"); - setXTermMouseForeground ("rgb:0000/0000/0000"); - - if ( ! gnome_terminal ) - setXTermCursorColor("rgb:ffff/ffff/ffff"); - - if ( ! (mintty_terminal || rxvt_terminal || screen_terminal) ) - { - // mintty and rxvt can't reset these settings - setXTermBackground("rgb:8080/a4a4/ecec"); - setXTermForeground("rgb:0000/0000/0000"); - setXTermHighlightBackground("rgb:8686/8686/8686"); - } + setXTermColors(); setRawMode(); @@ -3313,6 +3350,24 @@ void FTerm::finish() delete opti_move; } +//---------------------------------------------------------------------- +void FTerm::setXTermColors() +{ + setXTermMouseBackground("rgb:ffff/ffff/ffff"); + setXTermMouseForeground ("rgb:0000/0000/0000"); + + if ( ! gnome_terminal ) + setXTermCursorColor("rgb:ffff/ffff/ffff"); + + if ( ! (mintty_terminal || rxvt_terminal || screen_terminal) ) + { + // mintty and rxvt can't reset these settings + setXTermBackground("rgb:8080/a4a4/ecec"); + setXTermForeground("rgb:0000/0000/0000"); + setXTermHighlightBackground("rgb:8686/8686/8686"); + } +} + //---------------------------------------------------------------------- uInt FTerm::cp437_to_unicode (uChar c) { diff --git a/src/fterm.h b/src/fterm.h index 7f571015..08ad1663 100644 --- a/src/fterm.h +++ b/src/fterm.h @@ -168,6 +168,7 @@ class FTerm static void setKDECursor (fc::kdeKonsoleCursorShape); static const FString getXTermFont(); static const FString getXTermTitle(); + static const FString getXTermColorName (int); static void setXTermCursorStyle (fc::xtermCursorStyle); static void setXTermTitle (const FString&); static void setXTermForeground (const FString&); @@ -201,6 +202,7 @@ class FTerm // function pointer -> static function static int (*Fputchar)(int); + static void putstringf (const char*, ...) #if defined(__clang__) __attribute__((__format__ (__printf__, 1, 2))) @@ -267,6 +269,9 @@ class FTerm // Disable assignment operator (=) FTerm& operator = (const FTerm&); + // Inquiries + static int isConsole(); + // Methods static uInt16 getInputStatusRegisterOne(); static uChar readAttributeController (uChar); @@ -277,7 +282,6 @@ class FTerm static int getFramebuffer_bpp(); static int openConsole(); static int closeConsole(); - static int isConsole(); static void identifyTermType(); static int getScreenFont(); static int setScreenFont (uChar*, uInt, uInt, uInt, bool = false); @@ -296,6 +300,7 @@ class FTerm static void init_encoding(); void init(); void finish(); + static void setXTermColors(); static uInt cp437_to_unicode (uChar); static void signal_handler (int); diff --git a/src/fvterm.cpp b/src/fvterm.cpp index 9f1339a0..085aa577 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -121,18 +121,20 @@ bool FVTerm::hideCursor (bool on) char* hide_str = disableCursor(); if ( hide_str ) + { appendOutputBuffer (hide_str); - - hidden_cursor = true; // global + hidden_cursor = true; // global + } } else { char* show_str = enableCursor(); if ( show_str ) + { appendOutputBuffer (show_str); - - hidden_cursor = false; + hidden_cursor = false; + } } flush_out(); @@ -1160,6 +1162,7 @@ void FVTerm::restoreVTerm (int x, int y, int w, int h) || s_ch.code == fc::UpperHalfBlock || s_ch.code == fc::LeftHalfBlock || s_ch.code == fc::RightHalfBlock + || s_ch.code == fc::MediumShade || s_ch.code == fc::FullBlock ) s_ch.code = ' '; @@ -1360,6 +1363,7 @@ void FVTerm::updateVTerm (term_area* area) || ch.code == fc::UpperHalfBlock || ch.code == fc::LeftHalfBlock || ch.code == fc::RightHalfBlock + || ch.code == fc::MediumShade || ch.code == fc::FullBlock ) ch.code = ' '; @@ -1388,6 +1392,7 @@ void FVTerm::updateVTerm (term_area* area) || ch.code == fc::UpperHalfBlock || ch.code == fc::LeftHalfBlock || ch.code == fc::RightHalfBlock + || ch.code == fc::MediumShade || ch.code == fc::FullBlock ) ch.code = ' '; @@ -1707,6 +1712,7 @@ void FVTerm::putArea (int ax, int ay, term_area* area) || ch.code == fc::UpperHalfBlock || ch.code == fc::LeftHalfBlock || ch.code == fc::RightHalfBlock + || ch.code == fc::MediumShade || ch.code == fc::FullBlock ) ch.code = ' '; @@ -1820,7 +1826,7 @@ void FVTerm::scrollAreaReverse (term_area* area) } //---------------------------------------------------------------------- -void FVTerm::clearArea (term_area* area) +void FVTerm::clearArea (term_area* area, int fillchar) { // clear the area with the current attributes char_data nc; // next character @@ -1829,7 +1835,7 @@ void FVTerm::clearArea (term_area* area) // current attributes with a space character std::memcpy (&nc, &next_attribute, sizeof(char_data)); - nc.code = ' '; + nc.code = fillchar; if ( ! area ) return; diff --git a/src/fvterm.h b/src/fvterm.h index 0b915b71..89a7cef6 100644 --- a/src/fvterm.h +++ b/src/fvterm.h @@ -279,7 +279,7 @@ class FVTerm : public FObject, public FTerm static void putArea (int, int, term_area*); static void scrollAreaForward (term_area*); static void scrollAreaReverse (term_area*); - static void clearArea (term_area*); + static void clearArea (term_area*, int = ' '); static char_data getCharacter ( character_type , const FPoint& diff --git a/test/calculator.cpp b/test/calculator.cpp index aa979904..ea2122b8 100644 --- a/test/calculator.cpp +++ b/test/calculator.cpp @@ -243,7 +243,7 @@ Calc::Calc (FWidget* parent) setText ("calculator"); setGeometry (19, 6, 37, 18); addAccelerator('q'); // press 'q' to quit - setShadow(); + //setShadow(); for (int key=0; key < Calc::NUM_OF_BUTTONS; key++) { @@ -372,6 +372,10 @@ void Calc::drawDispay() //---------------------------------------------------------------------- void Calc::draw() { + setBold(); + setColor (fc::Blue, fc::Cyan); + clearArea (vdesktop, fc::MediumShade); + unsetBold(); FDialog::draw(); drawDispay(); } diff --git a/test/transparent.cpp b/test/transparent.cpp index 0f04d8b8..c6383750 100644 --- a/test/transparent.cpp +++ b/test/transparent.cpp @@ -79,7 +79,11 @@ void Transparent::draw() } else if ( type == inherit_background ) { - setColor(fc::Blue, fc::Black); + if ( getMaxColor() > 8 ) + setColor(fc::Blue, fc::Black); + else + setColor(fc::Green, fc::Black); + setInheritBackground(); } else