ChangeLog 20000422-13:50 GTM+1

This commit is contained in:
Ryszard Glab
2000-04-22 11:35:46 +00:00
parent 36360b0551
commit da278bc7ca
4 changed files with 302 additions and 69 deletions

View File

@@ -1,3 +1,14 @@
20000422-13:50 GMT+1 Ryszard Glab <rglab@imid.med.pl>
*source/rtl/gtcrs/gtcrs.c
*source/rtl/gtcrs/mousecrs.c
*fixed arrow keys under xterm
*added support for mouse under xterm
*source/compiler/harbour.c
*fixed duplicated variable error when PARAMETER variable was
also declared as a MEMVAR variable
20000422 08:20 gmt -3 Luiz Rafael Culik <culik@sl.conex.net>
+contrib\libnf\getenvrn.c
contrib\libnf\n2color.c

View File

@@ -423,7 +423,7 @@ void hb_compVariableAdd( char * szVarName, char cValueType )
/* variable defined in a function/procedure */
hb_compCheckDuplVars( pFunc->pFields, szVarName, hb_comp_iVarScope );
hb_compCheckDuplVars( pFunc->pStatics, szVarName, hb_comp_iVarScope );
if( !( hb_comp_iVarScope == VS_PRIVATE || hb_comp_iVarScope == VS_PUBLIC ) )
if( !( hb_comp_iVarScope & VS_PRIVATE || hb_comp_iVarScope == VS_PUBLIC ) )
hb_compCheckDuplVars( pFunc->pMemvars, szVarName, hb_comp_iVarScope );
}
else

View File

@@ -41,6 +41,14 @@
#include "inkey.ch"
/* functions defined in mousecrs.c
*/
extern int hb_mouse_xevent( char *, HB_inkey_enum );
extern int hb_mouse_key( void );
extern int hb_mouse_initialize( void );
/* static data
*/
static USHORT s_uiDispCount;
static void gt_GetMaxRC(int* r, int* c);
@@ -51,7 +59,7 @@ static void hb_gt_Add_terminfo_keymap( int, char * );
static void hb_gt_Add_keymap( int, char * );
/* max number of characters in a keymapped string */
#define HB_MAX_KEYMAP_CHARS 8
#define HB_MAX_KEYMAP_CHARS 16
struct key_map_struc
{
@@ -61,12 +69,16 @@ struct key_map_struc
struct key_map_struc *Next;
};
static struct key_map_struc *s_keymap_table = NULL;
#define HB_HASH_KEY 128
static struct key_map_struc * s_keymap_table[ HB_HASH_KEY ];
static unsigned s_attribmap_table[ 256 ]; /* mapping from DOS style attributes */
static BOOL s_under_xterm;
static int s_alternate_char_set;
static char s_xTermBox[ 10 ] = "lqkxjqmx ";
static char * s_mouse_event_seq;
static int s_mouse_event_len;
static void hb_gt_Initialize_Terminal( void )
{
if( has_colors() )
@@ -120,25 +132,31 @@ static void hb_gt_Initialize_Terminal( void )
keypad( stdscr, FALSE );
s_under_xterm = !strncmp( getenv("TERM"), "xterm", 5 );
/* NOTE: using A_ALTCHARSET attribute is causing that small letters
a-z are not printed under xterm (at least xterm from Linux
RedHat 6.1 distribution)
*/
if( s_under_xterm )
{
s_alternate_char_set = 0;
}
else
{
s_alternate_char_set = A_ALTCHARSET;
}
if( s_under_xterm )
{
/* Alternate characters set will be enabled only by request because
* it changes character mapping under xterm
*/
s_alternate_char_set = 0;
}
else
{
/* If running under Linux console enable alternate character set
* by default
*/
s_alternate_char_set = A_ALTCHARSET;
}
bkgdset( ' ' );
ripoffline( 0, NULL );
/* Mouse sub-sytem have to be initialized after ncurses initialization */
hb_mouse_initialize();
}
void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
{
int i;
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Init()"));
s_uiDispCount = 0;
@@ -146,6 +164,39 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
initscr();
hb_gt_Initialize_Terminal();
/* Initialize keycode table */
for( i = 0; i < HB_HASH_KEY; i++ )
s_keymap_table[ i ] = NULL;
if( s_under_xterm )
{
/* NOTE: under xterm \E[M is used as a leading code for a mouse event
Events are as follows:
\E[M - prefix
b0 - a byte with buttons state
b1 - column position of a mouse pointer
b2 - row position of a mouse pointer
*/
s_mouse_event_seq = tigetstr( "kmous" );
if( s_mouse_event_seq == NULL || s_mouse_event_seq == (char *)-1 )
s_mouse_event_len =0;
else
s_mouse_event_len = strlen( s_mouse_event_seq );
hb_gt_Add_terminfo_keymap( K_HOME, "kfnd" );
hb_gt_Add_terminfo_keymap( K_END, "kslt" );
/* workaraound for xterm bug */
hb_gt_Add_terminfo_keymap( K_UP, "cuu1" );
hb_gt_Add_terminfo_keymap( K_RIGHT, "cuf1" );
hb_gt_Add_keymap( K_LEFT, "\033[D" );
hb_gt_Add_keymap( K_DOWN, "\033[B" );
}
else
{
/* NOTE: ncurses doesn't report any mouse events when run under GPM
*/
s_mouse_event_len = 0;
}
hb_gt_Add_terminfo_keymap( K_ENTER, "kent" );
hb_gt_Add_terminfo_keymap( K_ENTER, "ind" );
hb_gt_Add_terminfo_keymap( K_TAB, "ht" );
@@ -154,9 +205,7 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
hb_gt_Add_terminfo_keymap( K_LEFT, "kcub1" );
hb_gt_Add_terminfo_keymap( K_RIGHT, "kcuf1" );
hb_gt_Add_terminfo_keymap( K_HOME, "khome" );
hb_gt_Add_terminfo_keymap( K_HOME, "kfnd" ); /* xterm */
hb_gt_Add_terminfo_keymap( K_END, "kend" );
hb_gt_Add_terminfo_keymap( K_END, "kslt" ); /* xterm */
hb_gt_Add_terminfo_keymap( K_BS, "kbs" );
hb_gt_Add_terminfo_keymap( K_BS, "kcbt" );
hb_gt_Add_terminfo_keymap( K_INS, "kich1" );
@@ -261,20 +310,25 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
void hb_gt_Exit( void )
{
int i, k;
struct key_map_struc *tmp;
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Exit()"));
noraw();
refresh();
endwin();
if( s_keymap_table )
for( i = 0; i < HB_HASH_KEY; i++ )
{
struct key_map_struc *tmp = s_keymap_table;
tmp = s_keymap_table[ i ];
k = 0;
while( tmp )
{
s_keymap_table = s_keymap_table->Next;
s_keymap_table[ i ] = tmp->Next;
hb_xfree( tmp );
tmp = s_keymap_table;
tmp = s_keymap_table[ i ];
k++;
}
}
}
@@ -287,8 +341,6 @@ int hb_gt_ReadKey( HB_inkey_enum eventmask )
HB_TRACE(HB_TR_DEBUG, ("hb_gt_ReadKey(%d)", (int) eventmask));
HB_SYMBOL_UNUSED( eventmask );
if( key_waiting >= 0 )
{
/* return next character from the buffer */
@@ -300,7 +352,7 @@ int hb_gt_ReadKey( HB_inkey_enum eventmask )
ch = getch();
if( ch == ERR )
ch = 0;
ch = hb_mouse_key();
else
{
if( ch == 3 )
@@ -308,39 +360,63 @@ int hb_gt_ReadKey( HB_inkey_enum eventmask )
/* Ctrl-C was pressed */
ch = HB_BREAK_FLAG;
}
else if( s_keymap_table )
else
{
struct key_map_struc *tmp = s_keymap_table;
int i = 0;
int i = 0;
BYTE sum;
key_codes[ 0 ] = ch;
while( ( ch = getch() ) != ERR && i <= HB_MAX_KEYMAP_CHARS )
key_codes[ ++i ] = ch;
key_codes[ ++i ] = 0;
key_codes[ 0 ] = sum = ch;
while( ( ch = getch() ) != ERR && i <= HB_MAX_KEYMAP_CHARS )
{
key_codes[ ++i ] = ch;
/*fprintf( stderr, "key%i=%i(%c)\n", i, ch, ch );
fflush( stderr );
*/
sum += ch;
}
key_codes[ ++i ] = 0;
sum &= HB_HASH_KEY - 1;
ch = 0;
while( tmp )
{
if( (i == tmp->length) && (strcmp( tmp->key_string, key_codes ) == 0 ) )
{
ch = tmp->inkey_code;
tmp = NULL;
}
else
tmp = tmp->Next;
if( s_keymap_table[ sum ] )
{
/* there is an entry in the hash table */
struct key_map_struc *tmp = s_keymap_table[ sum ];
while( (ch == 0) && tmp )
{
/* now look for exact match */
if( (i == tmp->length) && (memcmp( tmp->key_string, key_codes, i ) == 0 ) )
{
ch = tmp->inkey_code; /* keycode found */
tmp = NULL; /* NOTE: tmp->inkey_code can be set to 0 */
}
else
tmp = tmp->Next;
}
}
if( ch == 0 )
{
/* keymap not found */
if( ch == 0 )
{
if( s_mouse_event_len )
{
/* check for mouse event */
if( memcmp( s_mouse_event_seq, key_codes, s_mouse_event_len ) == 0 )
{
/* Convert the mouse event into INKEY keycodes */
return hb_mouse_xevent( key_codes+s_mouse_event_len, eventmask );
}
}
/* keymap not found */
if( i == 1 )
ch = key_codes[ 0 ];
else
{
key_waiting = 0; /* return raw key sequence */
ch = K_HB_KEYCODES;
}
}
ch = key_codes[ 0 ];
else
{
key_waiting = 0; /* return raw key sequence */
ch = K_HB_KEYCODES;
}
}
}
}
return ch;
@@ -760,24 +836,31 @@ static void hb_gt_Add_keymap( int InkeyCode, char *key_string )
{
struct key_map_struc *keymap;
int iLength = strlen( key_string );
int i = 0;
BYTE sum = 0;
if( iLength && iLength <= HB_MAX_KEYMAP_CHARS )
{
while( i < iLength )
sum += key_string[ i++ ];
sum &= HB_HASH_KEY-1;
keymap = hb_xgrab( sizeof( struct key_map_struc ) );
keymap->inkey_code = InkeyCode;
keymap->key_string = key_string;
keymap->length = iLength;
keymap->Next = NULL;
if( s_keymap_table )
if( s_keymap_table[ sum ] )
{
struct key_map_struc *tmp = s_keymap_table;
struct key_map_struc *tmp = s_keymap_table[ sum ];
while( tmp->Next )
tmp =tmp->Next;
tmp->Next = keymap;
}
else
s_keymap_table = keymap;
s_keymap_table[ sum ] = keymap;
}
}

View File

@@ -33,21 +33,140 @@
*
*/
#include "hbapigt.h"
#include <curses.h>
/* NOTE: This file is a simple stub for those platforms which don't have
any kind of mouse support. [vszakats] */
#include "hbapigt.h"
#include "inkey.ch" /* included also in a harbour code */
/* C callable low-level interface */
struct HB_mouse_event
{
USHORT key;
USHORT row;
USHORT col;
long time;
};
#define HB_MOUSE_QUEUE_LEN 8
static struct HB_mouse_event s_event_queue[ HB_MOUSE_QUEUE_LEN ];
static int s_last_event;
/* this is called from key handling when ncurses reports a mouse event
* under xterm
* m_event points into:
* m_event[ 0 ] = buttons state
* bits 0-1:
* 00 = button1 pressed (left on 2-buttons mouse)
* 01 = button2 pressed (ignored on 2 button mouse)
* 10 = button3 pressed (right on 2-buttons mouse)
* 11 = button released
* bit 2:
* 1 = shift was down
* bit 3:
* 1 = meta key was down
* bit 4:
* 1 = control key was down
*
* m_event[ 1 ] = column position of a pointer + 32
* m_event[ 2 ] = row position of a pointer + 32
*/
int hb_mouse_xevent( char *m_event, HB_inkey_enum eventmask )
{
int ch = 0;
if( ( m_event[ 0 ] & 0x03 ) == 0x03 )
{
/* some button was released -
* xterm dosen't report which then use the last one!
*/
if( s_event_queue[ s_last_event ].key == K_RBUTTONDOWN )
{
/* the last pressed button was the right one */
if( eventmask & INKEY_RUP )
ch = K_RBUTTONUP;
}
else if( s_event_queue[ s_last_event ].key == K_LBUTTONDOWN )
{
if( eventmask & INKEY_LUP )
ch = K_LBUTTONUP;
}
else
{
/* ignore it - it is release after a double click */
}
--s_last_event;
}
else if( m_event[ 0 ] & 0x20 )
{
/* some button was pressed */
if( s_last_event < HB_MOUSE_QUEUE_LEN )
++s_last_event;
s_event_queue[ s_last_event ].col = m_event[ 1 ] - 33;
s_event_queue[ s_last_event ].row = m_event[ 2 ] - 33;
if( m_event[ 0 ] & 0x02 )
{
/* button2 (right) button was pressed */
if( m_event[ 3 ] )
{
/* two press sequences = double-click is signaled */
s_event_queue[ s_last_event ].key = K_RDBLCLK;
ch = K_RDBLCLK;
}
else
{
s_event_queue[ s_last_event ].key = K_RBUTTONDOWN;
if( eventmask & INKEY_RDOWN )
ch = K_RBUTTONDOWN;
}
}
else
{
/* button1 (left) was pressed */
if( m_event[ 3 ] )
{
/* double-click is signaled */
s_event_queue[ s_last_event ].key = K_LDBLCLK;
ch = K_LDBLCLK;
}
else
{
s_event_queue[ s_last_event ].key = K_LBUTTONDOWN;
if( eventmask & INKEY_LDOWN )
ch = K_LBUTTONDOWN;
}
}
}
return ch;
}
/* this reads a single mouse event
*/
int hb_mouse_key( void )
{
return 0;
}
void hb_mouse_initialize( void )
{
mmask_t mm;
mousemask( BUTTON1_PRESSED | BUTTON1_RELEASED | BUTTON1_DOUBLE_CLICKED |
BUTTON2_PRESSED | BUTTON2_RELEASED | BUTTON2_DOUBLE_CLICKED |
REPORT_MOUSE_POSITION,
&mm );
mouseinterval( 500 );
s_last_event = -1;
}
void hb_mouse_Init( void )
{
;
}
void hb_mouse_Exit( void )
{
;
hb_mouse_Init(); /* do not leave mouse hidden */
}
BOOL hb_mouse_IsPresent( void )
@@ -57,22 +176,30 @@ BOOL hb_mouse_IsPresent( void )
void hb_mouse_Show( void )
{
;
hb_mouse_Init();
}
void hb_mouse_Hide( void )
{
;
mmask_t mm;
mousemask( 0, &mm );
}
int hb_mouse_Col( void )
{
return 0;
if( s_last_event >= 0 )
return s_event_queue[ s_last_event ].col;
else
return 0;
}
int hb_mouse_Row( void )
{
return 0;
if( s_last_event >= 0 )
return s_event_queue[ s_last_event ].row;
else
return 0;
}
void hb_mouse_SetPos( int iRow, int iCol )
@@ -83,14 +210,23 @@ void hb_mouse_SetPos( int iRow, int iCol )
BOOL hb_mouse_IsButtonPressed( int iButton )
{
HB_SYMBOL_UNUSED( iButton );
if( s_last_event >= 0 )
{
USHORT uKey;
USHORT i;
uKey = (iButton == 1) ? INKEY_LDOWN : INKEY_RDOWN;
i = 0;
while( i <= s_last_event )
if( s_event_queue[ i++ ].key & uKey )
return TRUE;
}
return FALSE;
}
int hb_mouse_CountButton( void )
{
return 0;
return tigetnum( "btns" );
}
void hb_mouse_SetBounds( int iTop, int iLeft, int iBottom, int iRight )
@@ -103,9 +239,12 @@ void hb_mouse_SetBounds( int iTop, int iLeft, int iBottom, int iRight )
void hb_mouse_GetBounds( int * piTop, int * piLeft, int * piBottom, int * piRight )
{
HB_SYMBOL_UNUSED( piTop );
HB_SYMBOL_UNUSED( piLeft );
HB_SYMBOL_UNUSED( piBottom );
HB_SYMBOL_UNUSED( piRight );
int r, c;
getmaxyx(stdscr, r, c);
*piTop = *piLeft = 0;
*piBottom = r;
*piRight = c;
}