diff --git a/ChangeLog.txt b/ChangeLog.txt index 3ad89452f5..f9b602bd7f 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,31 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2013-09-19 09:52 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/rtl/hbgtcore.c + + added support for GT parameters passed in //GT + parameter after ":", i.e. //GT: + + * src/rtl/gttrm/gttrm.c + + added new parameters set in //GTTRM: + 1) "NOPOS" - inform GTTRM that terminal does not support + cursor position query: ESC [ 6 n + At startup GTTRM asks terminal about cursor position + and waits for answer for 2 seconds. If terminal doesn't + support it then it's unnecessary delay at application + startup. + 2) "UTF8" or "UTF-8" - force UTF-8 terminal output + Useful when terminal does not support cursor position + query so it cannot be used to detect automatically + UTF-8 or ISO terminal mode. + 3) "ISO" - force ISO terminal output + 4) "XTERM", "LINUX", "PUTTY", "CONS" - force given terminal + type + f.e. working with Android Terminal Emulator it's good to use + //GTTRM:UTF8,NOPOS + because it still does not support cursor position query and + LANG variable is not set. + 2013-09-16 15:36 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * doc/pp_prg.txt ! added missing REQUEST __WAIT in example code diff --git a/src/rtl/gttrm/gttrm.c b/src/rtl/gttrm/gttrm.c index e9fef62a20..1aa5a96623 100644 --- a/src/rtl/gttrm/gttrm.c +++ b/src/rtl/gttrm/gttrm.c @@ -2109,21 +2109,42 @@ static void hb_gt_trm_AnsiExit( PHB_GTTRM pTerm ) /* * common functions */ +static HB_BOOL hb_trm_Param( const char * pszParam ) +{ + HB_BOOL fResult = HB_FALSE; + char * pszGtTrmParams = hb_cmdargString( "GTTRM" ); + + if( pszGtTrmParams ) + { + fResult = strstr( hb_strupr( pszGtTrmParams ), pszParam ) != NULL; + hb_xfree( pszGtTrmParams ); + } + + return fResult; +} + static HB_BOOL hb_trm_isUTF8( PHB_GTTRM pTerm ) { + HB_BOOL fUTF8 = HB_FALSE; char * szLang; if( pTerm->fPosAnswer ) { int iRow = 0, iCol = 0; - HB_BOOL fSize; hb_gt_trm_termOut( pTerm, "\005\r\303\255", 4 ); - fSize = pTerm->GetCursorPos( pTerm, &iRow, &iCol, "\r \r" ); + fUTF8 = pTerm->GetCursorPos( pTerm, &iRow, &iCol, "\r \r" ) && + iCol == 1; pTerm->iCol = 0; - if( fSize ) - return iCol == 1; } + + if( hb_trm_Param( "UTF8" ) || hb_trm_Param( "UTF-8" ) ) + return HB_TRUE; + else if( hb_trm_Param( "ISO" ) ) + return HB_FALSE; + else if( fUTF8 ) + return HB_TRUE; + szLang = getenv( "LANG" ); return szLang && strstr( szLang, "UTF-8" ) != NULL; } @@ -2905,6 +2926,8 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm ) pTerm->iAttrMask = ~HB_GTTRM_ATTR_BOX; pTerm->terminal_ext = 0; pTerm->fAM = HB_FALSE; + if( hb_trm_Param( "PUTTY" ) ) + pTerm->terminal_ext |= TERM_PUTTY; szTerm = getenv( "HB_TERM" ); if( szTerm == NULL || *szTerm == '\0' ) @@ -2919,7 +2942,8 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm ) strstr( szTerm, "xterm" ) != NULL || strncmp( szTerm, "rxvt", 4 ) == 0 || strcmp( szTerm, "putty" ) == 0 || - strncmp( szTerm, "screen", 6 ) == 0 ) + strncmp( szTerm, "screen", 6 ) == 0 || + hb_trm_Param( "XTERM" ) ) { pTerm->Init = hb_gt_trm_AnsiInit; pTerm->Exit = hb_gt_trm_AnsiExit; @@ -2937,7 +2961,8 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm ) } else if( strncmp( szTerm, "linux", 5 ) == 0 || strcmp( szTerm, "tterm" ) == 0 || - strcmp( szTerm, "teraterm" ) == 0 ) + strcmp( szTerm, "teraterm" ) == 0 || + hb_trm_Param( "LINUX" ) ) { pTerm->Init = hb_gt_trm_AnsiInit; pTerm->Exit = hb_gt_trm_AnsiExit; @@ -2953,7 +2978,8 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm ) pTerm->szAcsc = szExtAcsc; pTerm->terminal_type = TERM_LINUX; } - else if( strncmp( szTerm, "cons", 4 ) == 0 ) + else if( strncmp( szTerm, "cons", 4 ) == 0 || + hb_trm_Param( "CONS" ) ) { pTerm->Init = hb_gt_trm_AnsiInit; pTerm->Exit = hb_gt_trm_AnsiExit; @@ -2997,7 +3023,7 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm ) pTerm->hFileno = pTerm->hFilenoStdin; pTerm->fOutTTY = HB_TRUE; } - pTerm->fPosAnswer = pTerm->fOutTTY; + pTerm->fPosAnswer = pTerm->fOutTTY && ! hb_trm_Param( "NOPOS" ); pTerm->fUTF8 = HB_FALSE; hb_fsSetDevMode( pTerm->hFileno, FD_BINARY ); diff --git a/src/rtl/hbgtcore.c b/src/rtl/hbgtcore.c index 2489c00d51..9bc478ad79 100644 --- a/src/rtl/hbgtcore.c +++ b/src/rtl/hbgtcore.c @@ -3876,7 +3876,16 @@ static HB_BOOL hb_gtTryInit( const char * szGtName, HB_BOOL fFree ) if( szGtName ) { if( hb_stackGetGT() == NULL ) + { + if( fFree ) + { + char * pszStr; + if( ( pszStr = strchr( szGtName, ':' ) ) != NULL ) + * pszStr = '\0'; + } + hb_stackSetGT( hb_gtLoad( szGtName, NULL, NULL ) ); + } if( fFree ) hb_xfree( ( void * ) szGtName );