See ChangeLog entry 2001-01-22 13:15 UTC-0500 David G. Holm <dholm@jsd-llc.com>

This commit is contained in:
David G. Holm
2001-01-22 18:18:16 +00:00
parent 99c5bb3d1f
commit db38a8239b
4 changed files with 192 additions and 38 deletions

View File

@@ -1,3 +1,11 @@
2001-01-22 13:15 UTC-0500 David G. Holm <dholm@jsd-llc.com>
+ doc/en/gtslang.txt
+ New file provided by Marek Paliwoda <paliwoda@inetia.pl>
* source/rtl/gtsln/gtsln.c
* Enhancements provided by Marek Paliwoda <paliwoda@inetia.pl>
* source/rtl/gtsln/kbsln.c
* Enhancements provided by Marek Paliwoda <paliwoda@inetia.pl>
2001-01-22 00:50 UTC-0800 Ron Pinkas <ron@profit-master.com>
* contrib/dot/pp.prg
* source/pp/ppcore.c

136
harbour/doc/en/gtslang.txt Normal file
View File

@@ -0,0 +1,136 @@
/*
* $Id$
*/
Marek Paliwoda
<paliwoda@inetia.pl>
Gt slang driver
A gt slang driver for Harbour (gtsln) is based on a S-Lang library written
by John E. Davis. It was developed using Slang version 1.41, although prior
versions of Slang up to 1.38 should also work. It was reported that even
Slang 1.22 was succesfully used but I've not tested it.
The main OS it is developed to be used on is Linux. Although Slang was
ported to other OSes, my tests on SCO OpenServer 5.0.2 show that a library
does not work perfectly on such systems. I've also successfully compiled and
testd gtsln under DOS but I don't think it makes any sense to use it on that
system instead of gtdos, due to its limitations and incompatibilities with
Clipper (see below).
A gt slang driver is a second driver which can be used on Linux based OSes.
The first one is a gt driver based on a curses library (gtcrs). Due to the
fact that curses is a standard library on Unix like systems, gtcrs should
be considerd as a primary gt driver for such OSes.
Compiling a gt slang driver ...
The driver should be automaticly compiled when you build Harbour from
source, regardless of what gt driver you've chosen by setting HB_GT_LIB.
Succesfull compilation requires Slang library and Slang header files
properly installed on your system.
To build programs (by using a bld.sh script from Harbour sources), which
will use a gtsln, you need to :
- have a Slang library properly installed
- set an environment variable HB_GT_LIB set to gtsln
- modify bld.sh by adding -lslang to a link command
Generally you always need to add -lgtsln -lslang to your link libraries to
build programs which are supposed to use a gt slang driver.
Limitations, incomatibilities with Clipper, errors ...
The driver is rather limited in comparison to other Harbour gt drivers and has
many incompatibilities with Clipper. Some of those limitations and incompati-
bilities are caused by an Unix behavior, others are caused by a Slang imple-
mentation. There are also some caused by a gt layer design. Not to mention
that there are probably some caused by my lack of knowledge.
Here is a (probably not complete) list of them :
- a driver allows only 126 combinations of FgBg colors. It means you can
use 16 colors for Fg, 8 colors for Bg. 16*8 gives 128 but last two (126
and 127) are reserved by Slang
- you can't get intensity/blinking background mode working (this is in
fact the previous problem, just worded differently)
- you can't display characters with values below 32 (control characters).
It is a very important limitation because you can't use many usefull
chars which you used under Clipper. This is an OS limitation which
Slang also inherits
- displaying chars above 128 widely depends on terminal posibilities.
Because of this on xterm I set all frame chars to a single frame (this
means - double and mixed frames are shown as a single frame). You should
not expect to see chars above 128 shown properly in all cases.
- a screen is automaticly cleared on program's startup (you can't inherit
it from system) and a cursor is set at 0,0
- when you run external programs a screen is restored after execution so
there is no possibility to interact with screen handling between two
programs
- you can't expect cursor hiding and cursor style changing to work at
all. Although on a textmode Linux console it works, this is a Linux
textmode hack only and it is hardcoded. For example on xterm only cur-
sor hiding works well.
- it is not guaranteed that programs which use DispBegin() and DispEnd()
will work well in all cases
- a screen size change does not work at all. There is a big problem on
an xterm where you can change a window's size at your request. Doing
this confuses a Harbour program
- Clipper programs which utilized PC hardware specifications about screen
construction (an array of char+attr) (for example to make quick shadow
on a screen) will not work, although this can be easily emulated if
required
- there is currently no support for Tone() function. This is a TODO item
- keyboard handling is VERY VERY LIMITED. Generally you should not expect
ALT+key, CTRL+F<n> and CTRL+<specialkeys> combinations to work at all
although they work on a textmode Linux console. This is a VERY BIG
PROBLEM and at least any solution should be developed to emulate this
- abort key is CTRL+C not ALT+C on Linux
- to get an ESC key you have to press ESC twice. This is an issue related
to OS behavior where ESC begins a control sequence
- currently there is no mouse support. This is a TODO item
- OutStd() does not work well. This is caused by a design of a gt layer
where writing directly to stdout is done outside Slang, so Slang can't
maintain screen changes properly. Also redirecting OutStd() to a file
results in writing control chars which were supposed to initialize a
terminal, to that file
Terminfo database ...
Slang gt driver is based on a terminfo database so it is very important to
have it properly set. Most problems are related to a broken terminfo file.
I don't have general advice about that. You are supposed to help yourself.
The only thing you should know is that you must not have sequences for F11
and F12 function keys set in a terminfo file if you want to use SHFT+F<n>
and CTRL+F<n> keys (of course they all should be defined there).
Why use gt slang driver ...
Well, personaly I find only two reasons. When Clipper compatibility and
current limitations are not a problem, gtsln is a little bit faster than
gtcrs and my experiences show that sometimes it works a little bit better
than gtcrs on real terminals (tested on wy60 where gtcrs did not handle the
keyboard well).
Marek Paliwoda
PS. I want to appologize for any english errors and any technical errors in
this text.

View File

@@ -41,7 +41,7 @@
#include <slang.h>
#endif
/* missing defines in previous versions of Slang - this was not TESTED !! */
#if SLANG_VERSION < 10401
#if SLANG_VERSION < 10400
typedef unsigned short SLsmg_Char_Type;
#define SLSMG_EXTRACT_CHAR( x ) ( ( x ) & 0xFF )
#define SLSMG_EXTRACT_COLOR( x ) ( ( ( x ) >> 8 ) & 0xFF )
@@ -50,6 +50,7 @@
#define SLSMG_BLOCK_CHAR '0'
#endif
#include <unistd.h>
#include <signal.h>
#include "hbapigt.h"
@@ -190,13 +191,15 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
}
hb_mouse_Init();
if( ! gt_Inited )
{
char * errmsg = '\r'+'\n'+"Internal error : screen driver initialization failure"+'\r'+'\n'+( char )0;
/* something went wrong - restore default settings */
SLang_reset_tty();
/* NOTE: an error should be generated here ! */
return;
/* NOTE: a standard Harbour error should be generated here ! */
write( iFilenoStderr, errmsg , strlen( errmsg ) );
exit( 20 );
}
}
@@ -210,7 +213,7 @@ void hb_gt_Exit( void )
*/
hb_mouse_Exit();
if( s_sCursorStyle != SC_UNAVAIL )
hb_gt_SetCursorStyle( SC_NORMAL );
@@ -229,7 +232,7 @@ BOOL hb_gt_AdjustPos( BYTE * pStr, ULONG ulLen )
for( ulCount = 0; ulCount < ulLen; ulCount++ )
{
switch( *pStr++ )
switch( *pStr++ )
{
case HB_CHAR_BEL:
break;
@@ -247,6 +250,11 @@ BOOL hb_gt_AdjustPos( BYTE * pStr, ULONG ulLen )
case HB_CHAR_LF:
col = 0;
/* This is a hack. OutStd() is done outside Slang and it
can't be tracked currently by Slang. This should be
changed in console.c
*/
SLtt_write_string( "\r" );
if( row < SLtt_Screen_Rows - 1 )
row++;
break;
@@ -298,9 +306,9 @@ void hb_gt_SetPos( SHORT iRow, SHORT iCol, SHORT iMethod )
HB_TRACE(HB_TR_DEBUG, ("hb_gt_SetPos(%hd, %hd, %hd)", iRow, iCol, iMethod));
HB_SYMBOL_UNUSED( iMethod );
SLsmg_gotorc( iRow, iCol );
SLtt_goto_rc( iRow, iCol ); /* ??? */
/* SLtt_goto_rc( iRow, iCol ); */ /* ??? */
if( s_uiDispCount == 0 )
SLsmg_refresh();
@@ -344,7 +352,7 @@ void hb_gt_SetCursorStyle( USHORT uiStyle )
/* see ..\..\..\tests\working\cursrtst.prg for an explanation */
if( s_sCursorStyle == SC_UNAVAIL )
return;
if( ( s_sCursorStyle >= SC_NONE ) && ( s_sCursorStyle <= SC_SPECIAL2 ) )
{
s_sCursorStyle = uiStyle;
@@ -357,21 +365,23 @@ void hb_gt_SetCursorStyle( USHORT uiStyle )
case SC_NONE:
cursDefseq[ 3 ] = '1';
break;
case SC_NORMAL:
cursDefseq[ 3 ] = '2';
break;
case SC_INSERT:
cursDefseq[ 3 ] = '4';
break;
case SC_SPECIAL1:
cursDefseq[ 3 ] = '8';
break;
case SC_SPECIAL2:
/* TODO: find a proper sequqnce to set a cursor under Linux console */
/* TODO: find a proper sequqnce to set a cursor
to SC_SPECIAL2 under Linux console
*/
cursDefseq[ 3 ] = '4';
break;
}
@@ -391,8 +401,8 @@ static void hb_gt_xPutch( USHORT uiRow, USHORT uiCol, BYTE byAttr, BYTE byChar )
HB_TRACE(HB_TR_DEBUG, ("hb_gt_xPutch(%hu, %hu, %d, %i)", uiRow, uiCol, (int) byAttr, byChar));
/* build a Slang converted char - note we are clearing a high bit of color */
SLchar = SLSMG_BUILD_CHAR( s_convHighChars[ byChar ],
( byAttr + SLANG_RESERVED_COLORS ) & 0x7F );
SLchar = SLSMG_BUILD_CHAR( s_convHighChars[ byChar ],
( (int)byAttr + SLANG_RESERVED_COLORS ) & 0x7F );
/* alternate char set */
if( byChar > 127 )
@@ -418,8 +428,8 @@ void hb_gt_Puts( USHORT uiRow, USHORT uiCol, BYTE byAttr, BYTE * pbyStr, ULONG u
byChar = *pbyStr++;
/* build a Slang converted char - note we are clearing a high bit of color */
SLchar = SLSMG_BUILD_CHAR( s_convHighChars[ byChar ],
( byAttr + SLANG_RESERVED_COLORS ) & 0x7F );
SLchar = SLSMG_BUILD_CHAR( s_convHighChars[ byChar ],
( (int)byAttr + SLANG_RESERVED_COLORS ) & 0x7F );
/* alternate char set */
if( byChar > 127 )
@@ -438,8 +448,8 @@ void hb_gt_Puts( USHORT uiRow, USHORT uiCol, BYTE byAttr, BYTE * pbyStr, ULONG u
if( s_uiDispCount == 0 )
SLsmg_refresh();
*/
hb_gt_SetPos( uiRow, uiCol + ulLen, HB_GT_SET_POS_AFTER );
hb_gt_SetPos( uiRow, uiCol + ulLen, HB_GT_SET_POS_AFTER );
hb_xfree( ( BYTE * )pScr );
}
@@ -491,7 +501,7 @@ void hb_gt_PutText( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight
if( s_uiDispCount == 0 )
SLsmg_refresh();
*/
hb_gt_SetPos( usSavRow, usSavCol, HB_GT_SET_POS_AFTER );
hb_gt_SetPos( usSavRow, usSavCol, HB_GT_SET_POS_AFTER );
}
void hb_gt_SetAttribute( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, BYTE byAttr )
@@ -504,7 +514,7 @@ void hb_gt_SetAttribute( USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT ui
Cols = uiRight - uiLeft + 1;
/* note: we are clearing a high bit of color */
SLsmg_set_color_in_region( ( byAttr + SLANG_RESERVED_COLORS ) & 0x7F,
SLsmg_set_color_in_region( ( (int)byAttr + SLANG_RESERVED_COLORS ) & 0x7F,
uiTop, uiLeft, Rows, Cols );
if( s_uiDispCount == 0 )
@@ -652,8 +662,8 @@ void hb_gt_Replicate( USHORT uiRow, USHORT uiCol, BYTE byAttr, BYTE byChar, ULON
for( i = 0; i < ulLen; i++ )
{
/* build a Slang converted char - note we are clearing a high bit of color */
SLchar = SLSMG_BUILD_CHAR( s_convHighChars[ byChar ],
( byAttr + SLANG_RESERVED_COLORS ) & 0x7F );
SLchar = SLSMG_BUILD_CHAR( s_convHighChars[ byChar ],
( (int)byAttr + SLANG_RESERVED_COLORS ) & 0x7F );
/* alternate char set */
if( byChar > 127 )
@@ -669,7 +679,7 @@ void hb_gt_Replicate( USHORT uiRow, USHORT uiCol, BYTE byAttr, BYTE byChar, ULON
SLsmg_write_raw( pScr, ulLen );
/* this should not be needed here.
hb_gtRepChar() should set this for us
hb_gtRepChar() should set this for us
*/
/*
SLsmg_gotorc( uiRow, uiCol + ulLen );
@@ -677,7 +687,7 @@ void hb_gt_Replicate( USHORT uiRow, USHORT uiCol, BYTE byAttr, BYTE byChar, ULON
if( s_uiDispCount == 0 )
SLsmg_refresh();
*/
hb_gt_SetPos( uiRow, uiCol + ulLen, HB_GT_SET_POS_AFTER );
hb_gt_SetPos( uiRow, uiCol + ulLen, HB_GT_SET_POS_AFTER );
}
hb_xfree( ( BYTE * ) pScr );
@@ -803,7 +813,7 @@ USHORT hb_gt_VertLine( USHORT uiCol, USHORT uiTop, USHORT uiBottom, BYTE byChar,
if( s_uiDispCount == 0 )
SLsmg_refresh();
*/
hb_gt_SetPos( uiBottom + 1, uiCol, HB_GT_SET_POS_AFTER );
hb_gt_SetPos( uiBottom + 1, uiCol, HB_GT_SET_POS_AFTER );
return 0;
}
@@ -830,9 +840,10 @@ BOOL hb_gt_Suspend()
BOOL hb_gt_Resume()
{
if( s_bSuspended &&
if( s_bSuspended &&
SLsmg_resume_smg() != -1 &&
hb_gt_Init_Terminal( 1 ) != -1 ) /* reinitialize a terminal */
SLsmg_refresh();
{
s_bSuspended = FALSE;
}
@@ -865,12 +876,12 @@ static void hb_gt_build_conv_tabs()
char mask so it leaves us only 128 possible fgbg colors.
(see Notes in Slang sources). This is incompatible with
Clipper. Slang uses color 0 as a normal color and a
color 1 as a reverse one, leaving us only 126 fgbg.
color 1 as a reverse one, leaving us only 126 fgbg.
*/
/* init colors - color 0 and 1 are normal and
reverse color in Slang. We can't use them
/* init colors - color 0 and 1 are normal and
reverse color in Slang. We can't use them
*/
for( i = 0; i < 256 - 2; i++ )
for( i = 0; i < 256 - SLANG_RESERVED_COLORS; i++ )
{
fg = ( i & 0x0F );
bg = ( i >> 4 ) & 0x07; /* bit 7 is a blinking attribute - not used here */
@@ -878,9 +889,11 @@ static void hb_gt_build_conv_tabs()
/* leave 0 and 1 for Slang library. Shift color number by 2 */
SLtt_set_color( i + SLANG_RESERVED_COLORS, ( char * ) NULL, s_colorNames[ fg ], s_colorNames[ bg ] );
}
/* Slang normal and reverse color */
SLtt_set_color( 0, ( char * ) NULL, s_colorNames[ 7 ], s_colorNames[ 0 ] );
SLtt_set_color( 1, ( char * ) NULL, s_colorNames[ 0 ], s_colorNames[ 7 ] );
/* build alternate chars table */
/* build an alternate chars table */
for( i = 0; i < 32; i++ )
/* under Unix control-chars are not visible in a general meaning */
s_convHighChars[ i ] = '.';
@@ -931,7 +944,7 @@ static void hb_gt_build_conv_tabs()
}
}
/* QUESTION: do we have dobule, single-double, ... frames under xterm ? */
/* QUESTION: do we have double, single-double, ... frames under xterm ? */
if( s_underXTerm )
{
/* frames of all Clipper type are _B_SINBLE under xterm */

View File

@@ -184,10 +184,7 @@ static void hb_gt_Init_KeyTranslat()
keyname[ 1 ] = ch;
keyseq = SLtt_tgetstr( keyname );
if( ( keyseq != NULL ) && ( keyseq[ 0 ] != 0 ) )
{
if( ( keyseq != NULL ) && ( keyseq[ 0 ] != 0 ) )
SLkp_define_keysym( keyseq, SL_KEY_F( keynum ) );
}
keynum++;
}
}