diff --git a/ChangeLog.txt b/ChangeLog.txt index 4e4f7e8664..7a54e25225 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,19 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2016-03-01 16:11 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/rtl/gttrm/gttrm.c + + added support for CYGWIN ssh terminal + (i.e. ssh.exe included in github for MS-Windows) + ! fixed support for terminals which always scrolls when the most + upper/right character is written. + In current version GTTRM simply ignores this character cell. + On such terminals it can be shown by writing the last character + one cell before then sending escape sequences to move cursor back, + insert one space and finally restoring overwritten character + cell value. Anyhow it increases number of used escape sequences + so I decided to not implement it yet. + 2016-02-18 17:02 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * include/fileio.ch + added HB_VF_IONAME to hb_vcConfigure() actions diff --git a/src/rtl/gttrm/gttrm.c b/src/rtl/gttrm/gttrm.c index d06b601eac..6ecc09724c 100644 --- a/src/rtl/gttrm/gttrm.c +++ b/src/rtl/gttrm/gttrm.c @@ -124,8 +124,9 @@ static HB_GT_FUNCS SuperTable; #define TERM_ANSI 1 #define TERM_LINUX 2 #define TERM_XTERM 3 -#define TERM_PUTTY 4 -#define TERM_CONS 8 +#define TERM_CONS 4 +#define TERM_CYGWIN 5 +#define TERM_PUTTY 16 #define HB_GTTRM_CLRSTD 0 #define HB_GTTRM_CLRX16 1 @@ -905,7 +906,7 @@ static void set_tmevt( PHB_GTTRM pTerm, unsigned char * cMBuf, mouseEvent * mEvt break; } chk_mevtdblck( pTerm ); - /* printf( "\n\rmouse event: %02x, %02x, %02x\n\r", cMBuf[ 0 ], cMBuf[ 1 ], cMBuf[ 2 ] ); */ + /* printf( "\r\nmouse event: %02x, %02x, %02x\r\n", cMBuf[ 0 ], cMBuf[ 1 ], cMBuf[ 2 ] ); */ } #if defined( HB_HAS_GPM ) @@ -2709,8 +2710,27 @@ static void init_keys( PHB_GTTRM pTerm ) { 0, NULL } }; - static const keySeq xtermModKeySeq[] = { + static const keySeq cygwinModKeySeq[] = { + { EXKEY_F1 |KEY_CTRLMASK, "\033[11^" }, + { EXKEY_F2 |KEY_CTRLMASK, "\033[12^" }, + { EXKEY_F3 |KEY_CTRLMASK, "\033[13^" }, + { EXKEY_F4 |KEY_CTRLMASK, "\033[14^" }, + { EXKEY_F5 |KEY_CTRLMASK, "\033[15^" }, + { EXKEY_F6 |KEY_CTRLMASK, "\033[17^" }, + { EXKEY_F7 |KEY_CTRLMASK, "\033[18^" }, + { EXKEY_F8 |KEY_CTRLMASK, "\033[19^" }, + { EXKEY_F9 |KEY_CTRLMASK, "\033[20^" }, + { EXKEY_F10|KEY_CTRLMASK, "\033[21^" }, + { EXKEY_F11|KEY_CTRLMASK, "\033[23^" }, + { EXKEY_F12|KEY_CTRLMASK, "\033[24^" }, + { EXKEY_F11|KEY_SHIFTMASK, "\033[23$" }, + { EXKEY_F12|KEY_SHIFTMASK, "\033[24$" }, + + { 0, NULL } }; + + static const keySeq xtermModKeySeq[] = { + /* XTerm with modifiers */ { EXKEY_F1 |KEY_CTRLMASK, "\033O5P" }, { EXKEY_F2 |KEY_CTRLMASK, "\033O5Q" }, { EXKEY_F3 |KEY_CTRLMASK, "\033O5R" }, @@ -2736,6 +2756,24 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_PGUP |KEY_CTRLMASK, "\033[5;5~" }, { EXKEY_PGDN |KEY_CTRLMASK, "\033[6;5~" }, + { EXKEY_UP |KEY_CTRLMASK, "\033[1;5A" }, + { EXKEY_DOWN |KEY_CTRLMASK, "\033[1;5B" }, + { EXKEY_RIGHT |KEY_CTRLMASK, "\033[1;5C" }, + { EXKEY_LEFT |KEY_CTRLMASK, "\033[1;5D" }, + { EXKEY_CENTER|KEY_CTRLMASK, "\033[1;5E" }, + { EXKEY_END |KEY_CTRLMASK, "\033[1;5F" }, + { EXKEY_CENTER|KEY_CTRLMASK, "\033[1;5G" }, + { EXKEY_HOME |KEY_CTRLMASK, "\033[1;5H" }, + + { EXKEY_UP |KEY_CTRLMASK, "\033[5A" }, + { EXKEY_DOWN |KEY_CTRLMASK, "\033[5B" }, + { EXKEY_RIGHT |KEY_CTRLMASK, "\033[5C" }, + { EXKEY_LEFT |KEY_CTRLMASK, "\033[5D" }, + { EXKEY_CENTER|KEY_CTRLMASK, "\033[5E" }, /* --- */ + { EXKEY_END |KEY_CTRLMASK, "\033[5F" }, /* --- */ + { EXKEY_CENTER|KEY_CTRLMASK, "\033[5G" }, /* --- */ + { EXKEY_HOME |KEY_CTRLMASK, "\033[5H" }, /* --- */ + { EXKEY_F1 |KEY_ALTMASK, "\033O3P" }, { EXKEY_F2 |KEY_ALTMASK, "\033O3Q" }, { EXKEY_F3 |KEY_ALTMASK, "\033O3R" }, @@ -2761,6 +2799,24 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_PGUP |KEY_ALTMASK, "\033[5;3~" }, { EXKEY_PGDN |KEY_ALTMASK, "\033[6;3~" }, + { EXKEY_UP |KEY_ALTMASK, "\033[1;3A" }, + { EXKEY_DOWN |KEY_ALTMASK, "\033[1;3B" }, + { EXKEY_RIGHT |KEY_ALTMASK, "\033[1;3C" }, + { EXKEY_LEFT |KEY_ALTMASK, "\033[1;3D" }, + { EXKEY_CENTER|KEY_ALTMASK, "\033[1;3E" }, + { EXKEY_END |KEY_ALTMASK, "\033[1;3F" }, + { EXKEY_CENTER|KEY_ALTMASK, "\033[1;3G" }, + { EXKEY_HOME |KEY_ALTMASK, "\033[1;3H" }, + + { EXKEY_UP |KEY_ALTMASK, "\033[3A" }, + { EXKEY_DOWN |KEY_ALTMASK, "\033[3B" }, + { EXKEY_RIGHT |KEY_ALTMASK, "\033[3C" }, + { EXKEY_LEFT |KEY_ALTMASK, "\033[3D" }, + { EXKEY_CENTER|KEY_ALTMASK, "\033[3E" }, /* --- */ + { EXKEY_END |KEY_ALTMASK, "\033[3F" }, /* --- */ + { EXKEY_CENTER|KEY_ALTMASK, "\033[3G" }, /* --- */ + { EXKEY_HOME |KEY_ALTMASK, "\033[3H" }, /* --- */ + { EXKEY_F1 |KEY_SHIFTMASK, "\033O2P" }, { EXKEY_F2 |KEY_SHIFTMASK, "\033O2Q" }, { EXKEY_F3 |KEY_SHIFTMASK, "\033O2R" }, @@ -2796,6 +2852,24 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_PGUP |KEY_SHIFTMASK, "\033[5;2~" }, { EXKEY_PGDN |KEY_SHIFTMASK, "\033[6;2~" }, + { EXKEY_UP |KEY_SHIFTMASK, "\033[1;2A" }, + { EXKEY_DOWN |KEY_SHIFTMASK, "\033[1;2B" }, + { EXKEY_RIGHT |KEY_SHIFTMASK, "\033[1;2C" }, + { EXKEY_LEFT |KEY_SHIFTMASK, "\033[1;2D" }, + { EXKEY_CENTER|KEY_SHIFTMASK, "\033[1;2E" }, + { EXKEY_END |KEY_SHIFTMASK, "\033[1;2F" }, + { EXKEY_CENTER|KEY_SHIFTMASK, "\033[1;2G" }, + { EXKEY_HOME |KEY_SHIFTMASK, "\033[1;2H" }, + + { EXKEY_UP |KEY_SHIFTMASK, "\033[2A" }, + { EXKEY_DOWN |KEY_SHIFTMASK, "\033[2B" }, + { EXKEY_RIGHT |KEY_SHIFTMASK, "\033[2C" }, + { EXKEY_LEFT |KEY_SHIFTMASK, "\033[2D" }, + { EXKEY_CENTER|KEY_SHIFTMASK, "\033[2E" }, /* --- */ + { EXKEY_END |KEY_SHIFTMASK, "\033[2F" }, /* --- */ + { EXKEY_CENTER|KEY_SHIFTMASK, "\033[2G" }, /* --- */ + { EXKEY_HOME |KEY_SHIFTMASK, "\033[2H" }, /* --- */ + { EXKEY_BS |KEY_ALTMASK, "\033\010" }, { 0, NULL } }; @@ -2828,31 +2902,6 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_TAB |KEY_SHIFTMASK, "\033[Z" }, /* kcbt, XTerm */ - /* XTerm with modifiers */ - { EXKEY_UP |KEY_CTRLMASK, "\033[1;5A" }, - { EXKEY_DOWN |KEY_CTRLMASK, "\033[1;5B" }, - { EXKEY_RIGHT |KEY_CTRLMASK, "\033[1;5C" }, - { EXKEY_LEFT |KEY_CTRLMASK, "\033[1;5D" }, - { EXKEY_CENTER|KEY_CTRLMASK, "\033[1;5E" }, - { EXKEY_END |KEY_CTRLMASK, "\033[1;5F" }, - { EXKEY_HOME |KEY_CTRLMASK, "\033[1;5H" }, - - { EXKEY_UP |KEY_ALTMASK, "\033[1;3A" }, - { EXKEY_DOWN |KEY_ALTMASK, "\033[1;3B" }, - { EXKEY_RIGHT |KEY_ALTMASK, "\033[1;3C" }, - { EXKEY_LEFT |KEY_ALTMASK, "\033[1;3D" }, - { EXKEY_CENTER|KEY_ALTMASK, "\033[1;3E" }, - { EXKEY_END |KEY_ALTMASK, "\033[1;3F" }, - { EXKEY_HOME |KEY_ALTMASK, "\033[1;3H" }, - - { EXKEY_UP |KEY_SHIFTMASK, "\033[1;2A" }, - { EXKEY_DOWN |KEY_SHIFTMASK, "\033[1;2B" }, - { EXKEY_RIGHT |KEY_SHIFTMASK, "\033[1;2C" }, - { EXKEY_LEFT |KEY_SHIFTMASK, "\033[1;2D" }, - { EXKEY_CENTER|KEY_SHIFTMASK, "\033[1;2E" }, - { EXKEY_END |KEY_SHIFTMASK, "\033[1;2F" }, - { EXKEY_HOME |KEY_SHIFTMASK, "\033[1;2H" }, - /* Konsole */ { EXKEY_ENTER |KEY_SHIFTMASK, "\033OM" }, @@ -2863,30 +2912,6 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_HOME, "\033OH" }, /* khome */ { EXKEY_ENTER |KEY_ALTMASK, "\033\012" }, - { EXKEY_UP |KEY_CTRLMASK, "\033[5A" }, - { EXKEY_DOWN |KEY_CTRLMASK, "\033[5B" }, - { EXKEY_RIGHT |KEY_CTRLMASK, "\033[5C" }, - { EXKEY_LEFT |KEY_CTRLMASK, "\033[5D" }, - { EXKEY_CENTER|KEY_CTRLMASK, "\033[5E" }, /* --- */ - { EXKEY_END |KEY_CTRLMASK, "\033[5F" }, /* --- */ - { EXKEY_HOME |KEY_CTRLMASK, "\033[5H" }, /* --- */ - - { EXKEY_UP |KEY_ALTMASK, "\033[3A" }, - { EXKEY_DOWN |KEY_ALTMASK, "\033[3B" }, - { EXKEY_RIGHT |KEY_ALTMASK, "\033[3C" }, - { EXKEY_LEFT |KEY_ALTMASK, "\033[3D" }, - { EXKEY_CENTER|KEY_ALTMASK, "\033[3E" }, /* --- */ - { EXKEY_END |KEY_ALTMASK, "\033[3F" }, /* --- */ - { EXKEY_HOME |KEY_ALTMASK, "\033[3H" }, /* --- */ - - { EXKEY_UP |KEY_SHIFTMASK, "\033[2A" }, - { EXKEY_DOWN |KEY_SHIFTMASK, "\033[2B" }, - { EXKEY_RIGHT |KEY_SHIFTMASK, "\033[2C" }, - { EXKEY_LEFT |KEY_SHIFTMASK, "\033[2D" }, - { EXKEY_CENTER|KEY_SHIFTMASK, "\033[2E" }, /* --- */ - { EXKEY_END |KEY_SHIFTMASK, "\033[2F" }, /* --- */ - { EXKEY_HOME |KEY_SHIFTMASK, "\033[2H" }, /* --- */ - #if 0 /* key added for gnome-terminal and teraterm */ { EXKEY_ENTER |KEY_CTRLMASK, "\033[7;5~" }, @@ -3024,7 +3049,8 @@ static void init_keys( PHB_GTTRM pTerm ) addKeyTab( pTerm, haikuStdKeySeq ); #endif } - else if( pTerm->terminal_type == TERM_LINUX ) + else if( pTerm->terminal_type == TERM_LINUX || + pTerm->terminal_type == TERM_CYGWIN ) { addKeyTab( pTerm, linuxKeySeq ); addKeyTab( pTerm, stdFnKeySeq ); @@ -3034,6 +3060,8 @@ static void init_keys( PHB_GTTRM pTerm ) addKeyTab( pTerm, puttyKeySeq ); /* if( pTerm->terminal_ext & TERM_PUTTY ) for PuTTY */ addKeyTab( pTerm, rxvtKeySeq ); + if( pTerm->terminal_type == TERM_CYGWIN ) + addKeyTab( pTerm, cygwinModKeySeq ); } else if( pTerm->terminal_type == TERM_CONS ) { @@ -3224,6 +3252,7 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm ) pTerm->terminal_type = TERM_XTERM; } else if( strncmp( szTerm, "linux", 5 ) == 0 || + strcmp( szTerm, "cygwin" ) == 0 || strcmp( szTerm, "tterm" ) == 0 || strcmp( szTerm, "teraterm" ) == 0 ) { @@ -3239,7 +3268,13 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm ) pTerm->Tone = hb_gt_trm_LinuxTone; pTerm->Bell = hb_gt_trm_AnsiBell; pTerm->szAcsc = szExtAcsc; - pTerm->terminal_type = TERM_LINUX; + if( strcmp( szTerm, "cygwin" ) == 0 ) + { + pTerm->terminal_type = TERM_CYGWIN; + pTerm->fAM = HB_TRUE; + } + else + pTerm->terminal_type = TERM_LINUX; } else if( strncmp( szTerm, "cons", 4 ) == 0 ) { @@ -3285,7 +3320,8 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm ) pTerm->hFileno = pTerm->hFilenoStdin; pTerm->fOutTTY = HB_TRUE; } - pTerm->fPosAnswer = pTerm->fOutTTY && ! hb_trm_Param( "NOPOS", NULL ); + pTerm->fPosAnswer = pTerm->fOutTTY && ! hb_trm_Param( "NOPOS", NULL ) && + pTerm->terminal_type != TERM_CYGWIN; pTerm->fUTF8 = HB_FALSE; hb_fsSetDevMode( pTerm->hFileno, FD_BINARY ); @@ -3422,7 +3458,7 @@ static void hb_gt_trm_Exit( PHB_GT pGT ) pTerm->Exit( pTerm ); hb_gt_trm_ResetPalette( pTerm ); if( pTerm->fOutTTY && pTerm->iCol > 0 ) - hb_gt_trm_termOut( pTerm, "\n\r", 2 ); + hb_gt_trm_termOut( pTerm, "\r\n", 2 ); hb_gt_trm_termFlush( pTerm ); } @@ -3600,6 +3636,8 @@ static HB_BOOL hb_gt_trm_Suspend( PHB_GT pGT ) HB_TRACE( HB_TR_DEBUG, ( "hb_gt_trm_Suspend(%p)", pGT ) ); pTerm = HB_GTTRM_GET( pGT ); + if( pTerm->mouse_type & MOUSE_XTERM ) + hb_gt_trm_termOut( pTerm, s_szMouseOff, strlen( s_szMouseOff ) ); #if defined( HB_OS_UNIX ) || defined( __DJGPP__ ) if( pTerm->fRestTTY ) tcsetattr( pTerm->hFilenoStdin, TCSANOW, &pTerm->saved_TIO ); @@ -3657,7 +3695,7 @@ static void hb_gt_trm_Scroll( PHB_GT pGT, int iTop, int iLeft, int iBottom, int /* update our internal row position */ do { - hb_gt_trm_termOut( pTerm, "\n\r", 2 ); + hb_gt_trm_termOut( pTerm, "\r\n", 2 ); } while( --iRows > 0 ); pTerm->iCol = 0; @@ -3759,6 +3797,8 @@ static void hb_gt_trm_Redraw( PHB_GT pGT, int iRow, int iCol, int iSize ) pTerm->SetTermMode( pTerm, 0 ); if( iRow < pTerm->iRow ) pTerm->SetCursorStyle( pTerm, SC_NONE ); + if( pTerm->fAM && iRow == pTerm->iHeight - 1 && iCol + iSize == pTerm->iWidth ) + iSize--; while( iSize-- ) { #ifdef HB_GT_UNICODE_BUF @@ -3829,15 +3869,11 @@ static void hb_gt_trm_Redraw( PHB_GT pGT, int iRow, int iCol, int iSize ) iAttribute = iColor; } pTerm->pLineBuf[ iLen++ ] = ( char ) usChar; + ++iChars; #endif } if( iLen ) - { - if( pTerm->fAM && - iRow == pTerm->iHeight - 1 && iCol + iLen == pTerm->iWidth ) - --iLen; hb_gt_trm_PutStr( pTerm, iRow, iCol, iAttribute, pTerm->pLineBuf, iLen, iChars ); - } } static void hb_gt_trm_Refresh( PHB_GT pGT )