diff --git a/ChangeLog b/ChangeLog index bb72ba4f..76911561 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2015-10-05 Markus Gans + * Improve compatibility with initialize_color + * Better support for TeraTerm + 2015-10-02 Markus Gans * No terminal updates until input data is pending. This speeds up the window moving with the mouse on terminals diff --git a/src/fapp.cpp b/src/fapp.cpp index fe73d7e9..9f2401a4 100644 --- a/src/fapp.cpp +++ b/src/fapp.cpp @@ -1230,9 +1230,10 @@ bool FApplication::processNextEvent() while ( iter != close_widget->end() ) { - delete(*iter); - close_widget->erase(iter); + delete *iter; + ++iter; } + close_widget->clear(); } sendQueuedEvents(); diff --git a/src/fbutton.cpp b/src/fbutton.cpp index 62dae312..975aa31c 100644 --- a/src/fbutton.cpp +++ b/src/fbutton.cpp @@ -239,6 +239,8 @@ void FButton::draw() // Cygwin terminal use IBM Codepage 850 if ( isCygwinTerminal() ) print (fc::FullBlock); // █ + else if ( isTeraTerm() ) + print (0xdb); else print (fc::RightHalfBlock); // ▐ gotoxy (xpos+xmin-1+d, ypos+ymin-1+y); @@ -538,7 +540,9 @@ bool FButton::setFlat (bool on) //---------------------------------------------------------------------- bool FButton::setShadow (bool on) { - if ( on && Encoding != fc::VT100 && Encoding != fc::ASCII ) + if ( on + && (Encoding != fc::VT100 || isTeraTerm() ) + && Encoding != fc::ASCII ) flags |= SHADOW; else flags &= ~SHADOW; diff --git a/src/fcharmap.h b/src/fcharmap.h index 2260f403..9e522f61 100644 --- a/src/fcharmap.h +++ b/src/fcharmap.h @@ -16,6 +16,8 @@ static uInt character[][fc::NUM_OF_ENCODINGS] = {0x00d6,0xd6, 0x99, 'O'}, // Ö - O-umlaut {0x00c4,0xc4, 0x8e, 'A'}, // Ä - A-umlaut {0x00dc,0xdc, 0x9a, 'U'}, // Ü - U-umlaut + {0x00db,0xdb, 0x96, 'U'}, // Û - U-circumflex + {0x00fb,0xfb, 0x96, 'u'}, // û - u-circumflex {0x00df,0xdf, 0xe1, 's'}, // ß - sz-ligature {0x20ac, 'E', 0xee, 'E'}, // € - Euro {0x00a3, '}', 0x9c, 'P'}, // £ - Pound diff --git a/src/flineedit.cpp b/src/flineedit.cpp index 9a47d75d..f8e3d594 100644 --- a/src/flineedit.cpp +++ b/src/flineedit.cpp @@ -146,6 +146,8 @@ void FLineEdit::drawInputField() setColor (wc.inputfield_active_focus_bg, wc.dialog_bg); if ( isCygwinTerminal() ) // IBM Codepage 850 print (fc::FullBlock); // █ + else if ( isTeraTerm() ) + print (0xdb); else print (fc::RightHalfBlock); // ▐ } @@ -154,6 +156,8 @@ void FLineEdit::drawInputField() setColor (wc.inputfield_active_bg, wc.dialog_bg); if ( isCygwinTerminal() ) // IBM Codepage 850 print (fc::FullBlock); // █ + else if ( isTeraTerm() ) + print (0xdb); else print (fc::RightHalfBlock); // ▐ } @@ -162,6 +166,8 @@ void FLineEdit::drawInputField() setColor (wc.inputfield_inactive_bg, wc.dialog_bg); if ( isCygwinTerminal() ) // IBM Codepage 850 print (fc::FullBlock); // █ + else if ( isTeraTerm() ) + print (0xdb); else print (fc::RightHalfBlock); // ▐ } @@ -369,7 +375,9 @@ bool FLineEdit::setFocus (bool on) //---------------------------------------------------------------------- bool FLineEdit::setShadow (bool on) { - if ( on ) + if ( on + && (Encoding != fc::VT100 || isTeraTerm() ) + && Encoding != fc::ASCII ) flags |= SHADOW; else flags &= ~SHADOW; diff --git a/src/fstring.cpp b/src/fstring.cpp index 8b11bb18..00a413db 100644 --- a/src/fstring.cpp +++ b/src/fstring.cpp @@ -2161,8 +2161,7 @@ bool FString::includes (const char* s) if ( ! wc_string ) return false; ret = bool(wcsstr(string, wc_string) != 0); - if ( wc_string ) - delete[] wc_string; + delete[] wc_string; return (ret); } diff --git a/src/fterm.cpp b/src/fterm.cpp index 6f9333d5..b74f17a3 100644 --- a/src/fterm.cpp +++ b/src/fterm.cpp @@ -574,14 +574,14 @@ void FTerm::init_termcaps() tcap[t_set_a_background].string = \ const_cast("\033[4%p1%{8}%m%d%?%p1%{7}%>%t;5%e;25%;m"); } - if ( tera_terminal && color256 ) + else if ( tera_terminal && color256 ) { tcap[t_set_a_foreground].string = \ const_cast("\033[38;5;%p1%dm"); tcap[t_set_a_background].string = \ const_cast("\033[48;5;%p1%dm"); } - if ( putty_terminal ) + else if ( putty_terminal ) { tcap[t_set_a_foreground].string = \ const_cast("\033[%?%p1%{8}%<" @@ -596,13 +596,25 @@ void FTerm::init_termcaps() "%t10%p1%{8}%-%d" "%e48;5;%p1%d%;m"); } + + // fallback if "AF" is not found if ( ! tcap[t_set_a_foreground].string ) tcap[t_set_a_foreground].string = \ const_cast("\033[3%p1%dm"); + + // fallback if "AB" is not found if ( ! tcap[t_set_a_background].string ) tcap[t_set_a_background].string = \ const_cast("\033[4%p1%dm"); + // fallback if "Ic" is not found + if ( ! tcap[t_initialize_color].string ) + tcap[t_initialize_color].string = \ + const_cast("\033]P%p1%x" + "%p2%{255}%*%{1000}%/%02x" + "%p3%{255}%*%{1000}%/%02x" + "%p4%{255}%*%{1000}%/%02x"); + // fallback if "ti" is not found if ( ! tcap[t_enter_ca_mode].string ) tcap[t_enter_ca_mode].string = \ @@ -1089,6 +1101,9 @@ void FTerm::init() else cygwin_terminal = false; + if ( strncmp(termtype, "rxvt-cygwin-native", 18) == 0 ) + new_termtype = const_cast("rxvt-16color"); + if ( (s1 && strncmp(s1, "gnome-terminal", 14) == 0) || s2 ) { if ( color256 ) @@ -1103,8 +1118,8 @@ void FTerm::init() // terminal detection setRawMode(); + // send ENQ and read the answerback message AnswerBack = new FString(getAnswerbackMsg()); - if ( AnswerBack && *AnswerBack == FString("PuTTY") ) { putty_terminal = true; @@ -1119,7 +1134,8 @@ void FTerm::init() if ( cygwin_terminal ) putchar(0x8); // cygwin needs a backspace to delete the '♣' char - Sec_DA = new FString(getSecDA()); // get Secondary DA + // secondary device attributes (SEC_DA) + Sec_DA = new FString(getSecDA()); if ( Sec_DA->getLength() > 5 ) { FString temp = Sec_DA->right(Sec_DA->getLength() - 3); @@ -1130,8 +1146,10 @@ void FTerm::init() { FString* Sec_DA_components = &Sec_DA_split[0]; - switch ( Sec_DA_components[0].toInt() ) + if ( ! Sec_DA_components[0].isEmpty() ) { + switch ( Sec_DA_components[0].toInt() ) + { case 0: if ( Sec_DA_components[1] && Sec_DA_components[1].toInt() == 136 ) @@ -1196,6 +1214,7 @@ void FTerm::init() default: break; + } } } } @@ -1220,7 +1239,7 @@ void FTerm::init() if ( new_termtype ) { setenv(const_cast("TERM"), new_termtype, 1); - strncpy (termtype, new_termtype, strlen(new_termtype)); + strncpy (termtype, new_termtype, strlen(new_termtype)+1); } // Initializes variables for the current terminal @@ -1307,7 +1326,6 @@ void FTerm::init() if ( linux_terminal || cygwin_terminal - || tera_terminal || NewFont || (putty_terminal && ! utf8_state) ) { @@ -1372,8 +1390,9 @@ void FTerm::init() setXTermMouseForeground ("rgb:0000/0000/0000"); if ( ! gnome_terminal ) setXTermCursor("rgb:ffff/ffff/ffff"); - if ( ! mintty_terminal ) + if ( ! gnome_terminal && ! mintty_terminal ) { + // gnome-terminal and mintty can't reset these settings setXTermBackground("rgb:8080/a4a4/ecec"); setXTermForeground("rgb:0000/0000/0000"); setXTermHighlightBackground("rgb:b1b1/b1b1/b1b1"); @@ -2838,7 +2857,7 @@ void FTerm::setPalette (int index, int r, int g, int b) } else if ( linux_terminal ) { - ::printf ("\033]P%x%.2x%.2x%.2x", index, r, g, b); + //::printf ("\033]P%x%.2x%.2x%.2x", index, r, g, b); /* // direct vga-register set if ( r>=0 && r<256 @@ -2851,26 +2870,6 @@ void FTerm::setPalette (int index, int r, int g, int b) } ioctl (0, PIO_CMAP, &map); */ } - else if ( xterm || mintty_terminal || rxvt_terminal ) - { - ::printf ("\033]4;%d;#%2.2x%2.2x%2.2x\033\\", index, r, g, b); - switch (index) - { - case 0: - ::printf ("\033]11;#%2.2x%2.2x%2.2x\033\\", r, g, b); - break; - - case 7: - ::printf ("\033]10;#%2.2x%2.2x%2.2x\033\\", r, g, b); - - default: - break; - } - } - else - { - ::printf ("\033]P%x%.2x%.2x%.2x", index, r, g, b); - } fflush(stdout); } @@ -3476,7 +3475,7 @@ FString FTerm::getAnswerbackMsg() FD_SET(stdin_no, &ifds); tv.tv_sec = 0; tv.tv_usec = 150000; // 150 ms - + putchar(0x05); // send enquiry character fflush(stdout); @@ -3510,7 +3509,7 @@ FString FTerm::getSecDA() FD_ZERO(&ifds); FD_SET(stdin_no, &ifds); tv.tv_sec = 0; - tv.tv_usec = 150000; // 150 ms + tv.tv_usec = 550000; // 150 ms // get the secondary device attributes putchar(0x1b); // ESC @@ -3518,6 +3517,7 @@ FString FTerm::getSecDA() putchar(0x3e); // > putchar(0x63); // c fflush(stdout); + usleep(150000); // min. wait time 150 ms (need for mintty) // read the answer if ( select (stdin_no+1, &ifds, 0, 0, &tv) > 0 ) diff --git a/src/fterm.h b/src/fterm.h index 515a01c3..7ffeb35c 100644 --- a/src/fterm.h +++ b/src/fterm.h @@ -289,6 +289,7 @@ class FTerm static bool hasASCII(); static bool isMonochron(); static bool isCygwinTerminal(); + static bool isTeraTerm(); static bool isUrxvtTerminal(); static bool setVGAFont(); static bool setNewFont(); @@ -475,6 +476,10 @@ inline bool FTerm::isMonochron() inline bool FTerm::isCygwinTerminal() { return cygwin_terminal; } +//---------------------------------------------------------------------- +inline bool FTerm::isTeraTerm() +{ return tera_terminal; } + //---------------------------------------------------------------------- inline bool FTerm::isUrxvtTerminal() { return urxvt_terminal; } diff --git a/src/fwidget.cpp b/src/fwidget.cpp index 7b8b18ee..74a47f10 100644 --- a/src/fwidget.cpp +++ b/src/fwidget.cpp @@ -1838,7 +1838,7 @@ void FWidget::drawShadow() trans_shadow = bool((flags & TRANS_SHADOW) != 0); - if ( (Encoding == fc::VT100 && ! trans_shadow) + if ( (Encoding == fc::VT100 && ! trans_shadow && ! isTeraTerm() ) || (Encoding == fc::ASCII && ! trans_shadow) || monochron ) { @@ -1909,27 +1909,40 @@ void FWidget::drawShadow() { if ( x2 < xmax ) { + uInt block; gotoxy (x2+1, y1); ch = getCoveredCharacter (x2+1, y1, this); setColor (wc.shadow_fg, ch.bg_color); - print (fc::LowerHalfBlock); // ▄ + + if ( isTeraTerm() ) + { + block = 0xdb; // █ + print (0xdc); // ▄ + } + else + { + block = fc::FullBlock; // █ + print (fc::LowerHalfBlock); // ▄ + } for (int i=1; i < height && y1+i <= ymax; i++) { gotoxy (x2+1, y1+i); - print (fc::FullBlock); // █ + print (block); // █ } } if ( y2 < ymax ) { gotoxy (x1+1, y2+1); - for (int i=1; i <= width && x1+i <= xmax; i++) { ch = getCoveredCharacter (x1+i, y2+1, this); setColor(wc.shadow_fg, ch.bg_color); - print (fc::UpperHalfBlock); // ▀ + if ( isTeraTerm() ) + print (0xdf); // ▀ + else + print (fc::UpperHalfBlock); // ▀ } } }