From 207ab1cbfd2ba53275885c194a06d45ca60866e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Tue, 1 Mar 2016 16:11:53 +0100 Subject: [PATCH] 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. --- ChangeLog.txt | 13 ++++ src/rtl/gttrm/gttrm.c | 162 ++++++++++++++++++++++++++---------------- 2 files changed, 112 insertions(+), 63 deletions(-) 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 )