2009-09-18 04:07 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/source/rtl/gttrm/gttrm.c
    + added support for FreeBSD console
This commit is contained in:
Przemyslaw Czerpak
2009-09-18 02:07:11 +00:00
parent b21c0d1bce
commit f9b7018a4a
2 changed files with 110 additions and 3 deletions

View File

@@ -17,6 +17,10 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-09-18 04:07 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/rtl/gttrm/gttrm.c
+ added support for FreeBSD console
2009-09-18 02:38 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/config/detect.mk
! fixed typo in include directory used for slang.h detection

View File

@@ -121,6 +121,7 @@ static HB_GT_FUNCS SuperTable;
#define TERM_LINUX 2
#define TERM_XTERM 3
#define TERM_PUTTY 4
#define TERM_CONS 8
#define NO_STDKEYS 96
#define NO_EXTDKEYS 30
@@ -1530,7 +1531,7 @@ static void hb_gt_trm_LinuxTone( PHB_GTTRM pTerm, double dFrequency, double dDur
pTerm->iACSC = 0;
}
hb_snprintf( escseq, sizeof( escseq ), "\033[10;%d]\033[11;%d]\007",
( int ) dFrequency, ( int ) ( dDuration * 1000.0 / 18.2 ) );
( int ) dFrequency, ( int ) ( dDuration * 1000.0 / 18.2 ) );
hb_gt_trm_termOut( pTerm, escseq, strlen( escseq ) );
hb_gt_trm_termFlush( pTerm );
@@ -1572,7 +1573,7 @@ static void hb_gt_trm_LinuxSetCursorStyle( PHB_GTTRM pTerm, int iStyle )
{
char escseq[64];
hb_snprintf( escseq, sizeof( escseq ), "\033[?25%c\033[?%dc",
iStyle == SC_NONE ? 'l' : 'h', lcurs );
iStyle == SC_NONE ? 'l' : 'h', lcurs );
hb_gt_trm_termOut( pTerm, escseq, strlen( escseq ) );
pTerm->iCursorStyle = iStyle;
}
@@ -1739,6 +1740,78 @@ static void hb_gt_trm_XtermSetAttributes( PHB_GTTRM pTerm, int iAttr )
/*
* BSD console
*/
static BOOL hb_gt_trm_BsdGetCursorPos( PHB_GTTRM pTerm, int * iRow, int * iCol,
const char * szPost )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_trm_BsdGetCursorPos(%p,%p,%p,%p)", pTerm, iRow, iCol, szPost));
HB_SYMBOL_UNUSED( szPost );
if( pTerm->fPosAnswer )
{
pTerm->fPosAnswer = FALSE;
*iRow = *iCol = -1;
}
return FALSE;
}
static void hb_gt_trm_BsdSetCursorStyle( PHB_GTTRM pTerm, int iStyle )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_trm_BsdSetCursorStyle(%p,%d)", pTerm, iStyle));
if( pTerm->iCursorStyle != iStyle )
{
char escseq[64];
int l, h;
switch( iStyle )
{
case SC_NONE:
l = h = 32;
break;
case SC_NORMAL:
l = 6; h = 7;
break;
case SC_INSERT:
l = 4; h = 7;
break;
case SC_SPECIAL1:
l = 0; h = 7;
break;
case SC_SPECIAL2:
l = 0; h = 3;
break;
default:
return;
}
hb_snprintf( escseq, sizeof( escseq ), "\033[=%d;%dC", l, h );
hb_gt_trm_termOut( pTerm, escseq, strlen( escseq ) );
pTerm->iCursorStyle = iStyle;
}
}
static void hb_gt_trm_BsdTone( PHB_GTTRM pTerm, double dFrequency, double dDuration )
{
char escseq[64];
HB_TRACE(HB_TR_DEBUG, ("hb_gt_trm_BsdTone(%p,%lf,%lf)", pTerm, dFrequency, dDuration));
hb_snprintf( escseq, sizeof( escseq ), "\033[=%d;%dB\007",
( int ) dFrequency, ( int ) ( dDuration * 10.0 / 18.2 ) );
hb_gt_trm_termOut( pTerm, escseq, strlen( escseq ) );
hb_gt_trm_termFlush( pTerm );
/* convert Clipper (DOS) timer tick units to seconds ( x / 18.2 ) */
hb_idleSleep( dDuration / 18.2 );
}
/*
* ANSI terminal operations
*/
@@ -2733,6 +2806,12 @@ static void init_keys( PHB_GTTRM pTerm )
{ 0, NULL } };
static const keySeq bsdConsKeySeq[] = {
{ EXKEY_TAB |KEY_CTRLMASK|KEY_ALTMASK, "\033[Z" }, /* SHIFT+TAB */
{ 0, NULL } };
addKeyTab( pTerm, stdKeySeq );
if( pTerm->terminal_type == TERM_XTERM )
@@ -2759,6 +2838,11 @@ static void init_keys( PHB_GTTRM pTerm )
/* if( pTerm->terminal_ext & TERM_PUTTY ) for PuTTY */
addKeyTab( pTerm, rxvtKeySeq );
}
else if( pTerm->terminal_type == TERM_CONS )
{
addKeyTab( pTerm, ansiKeySeq );
addKeyTab( pTerm, bsdConsKeySeq );
}
else if( pTerm->terminal_type == TERM_ANSI )
{
addKeyTab( pTerm, ansiKeySeq );
@@ -2864,6 +2948,7 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm )
pTerm->mouse_type = MOUSE_NONE;
pTerm->esc_delay = ESC_DELAY;
pTerm->iAttrMask = ~HB_GTTRM_ATTR_BOX;
pTerm->terminal_ext = 0;
szTerm = getenv("HB_TERM");
if( szTerm == NULL || *szTerm == '\0' )
@@ -2873,6 +2958,7 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm )
szTerm = "ansi";
}
if( strncmp( szTerm, "linux", 5 ) == 0 ||
strcmp( szTerm, "tterm" ) == 0 ||
strcmp( szTerm, "teraterm" ) == 0 )
@@ -2911,6 +2997,22 @@ static void hb_gt_trm_SetTerm( PHB_GTTRM pTerm )
pTerm->szAcsc = szAcsc;
pTerm->terminal_type = TERM_XTERM;
}
else if( strncmp( szTerm, "cons", 4 ) == 0 )
{
pTerm->Init = hb_gt_trm_AnsiInit;
pTerm->Exit = hb_gt_trm_AnsiExit;
pTerm->SetTermMode = hb_gt_trm_AnsiSetTermMode;
pTerm->GetCursorPos = hb_gt_trm_BsdGetCursorPos;
pTerm->SetCursorPos = hb_gt_trm_AnsiSetCursorPos;
pTerm->SetCursorStyle = hb_gt_trm_BsdSetCursorStyle;
pTerm->SetAttributes = hb_gt_trm_AnsiSetAttributes;
pTerm->SetMode = hb_gt_trm_AnsiSetMode;
pTerm->GetAcsc = hb_gt_trm_AnsiGetAcsc;
pTerm->Tone = hb_gt_trm_BsdTone;
pTerm->Bell = hb_gt_trm_AnsiBell;
pTerm->szAcsc = szExtAcsc;
pTerm->terminal_type = TERM_CONS;
}
else
{
pTerm->Init = hb_gt_trm_AnsiInit;
@@ -3453,7 +3555,8 @@ static void hb_gt_trm_Redraw( PHB_GT pGT, int iRow, int iCol, int iSize )
pTerm = HB_GTTRM_GET( pGT );
pTerm->SetTermMode( pTerm, 0 );
pTerm->SetCursorStyle( pTerm, SC_NONE );
if( iRow < pTerm->iRow )
pTerm->SetCursorStyle( pTerm, SC_NONE );
while( iSize-- )
{
if( !HB_GTSELF_GETSCRCHAR( pGT, iRow, iCol + iLen, &iColor, &bAttr, &usChar ) )