From b9a30a4577456b1a43af99345bdefc147c983c35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Mon, 22 Apr 2013 15:38:35 +0200 Subject: [PATCH] 2013-03-05 11:53 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * include/hbapi.h * include/hbapigt.h * include/hbvm.h * src/rtl/inkeyapi.c * src/vm/cmdarg.c * src/vm/hvm.c * replaced hb_cmdargProcessVM() with hb_cmdargProcess() and removed unused for long time custom user cancel key functionality. - removed dummy hb_inkeySetCancelKeys() C function. - removed not used for long time HVM C functions and macros: hb_vmFlagEnabled(), hb_vmFlagSet(), hb_vmFlagClear(), HB_VMFLAG_HARBOUR, HB_VMFLAG_ARRSTR * include/hbgtinfo.ch + added new HB_GTI_* actions: HB_GTI_WINHANDLE - Get console window low level handle HB_GTI_MOUSEPOS_XY - Get mouse position in pixels HB_GTI_DISPIMAGE - Display image with given name * include/hbapigt.h * src/rtl/inkeyapi.c + added new C function: int hb_inkeyKeyMod( int iKey ) + added code for translation from extended key codes to standard Clipper ones * include/harbour.hbx * src/rtl/inkey.c + added new PRG function hb_keyMod( ) -> It extract keyboard modifiers (HB_KF_*) from extended key code. * include/hbgtcore.h * src/rtl/hbgtcore.c + added new macros for generating extended key codes with keyboard modifiers for ASCII and UNICODE characters % strip repeated extended key codes for mouse move ! use standard key codes in extended ALERT() GT method * include/inkey.ch + added key modifiers/flags for extended key codes: HB_KF_* + added extended key codes: HB_KX_* - removed unused HB_K_MULTICODE macro * src/rtl/gttrm/gttrm.c * replaced old keyboard and mouse code with new one using extended key codes for keyboard and mouse + added support for keyboard modifiers in GPM events + added support for keyboard modifiers in terminal mouse events * src/rtl/gtwvt/gtwvt.h * src/rtl/gtwvt/gtwvt.c ! invert selection region in WinCE builds ! fixed selection in fullscreen or maximized modes with margins * do not add EOL to one line selections + added support for painting box drawing characters. This mode can be enabled by: hb_gtInfo( HB_GTI_FONTATTRIBUTE, HB_GTI_FONTA_DRAWBOX ) and it causes that GTWVT draws all box characters as pixmap regardles of used font. So far this functionality existed only in GTXWC. + added support for HB_GTI_FONTA_FIXMETRIC and HB_GTI_FONTA_CLRBKG So far this functionality existed only in GTXWC. + added support for HB_GTI_WINHANDLE ! do not add EOL at the end of one line selection * src/rtl/gtxwc/gtxwc.h * src/rtl/gtxwc/gtxwc.c * replaced old keyboard and mouse code with new one using extended key codes for keyboard and mouse * renamed HB_GTXWC_* box drawing macros to HB_BOXCH_* ones * do not add EOL to one line selections ! fixed few keypad keycodes * use cursor blinking rate HB_GTI_CURSORBLINKRATE for whole show/hide period not only half of them. If someone use this GTI action in his code then now he should double passed value. [incompatible] ! fixed return value for HB_GTI_SETPOS_ROWCOL * few minor cleanups * tests/gtkeys.prg * replaced old keyboard and mouse code with new one using extended key codes for keyboard and mouse + added description for some key codes + added some initial HB_GTI_* actions + change cursor size by K_INS + display terminal size after HB_K_RESIZE + display mouse position after mouse key codes ! display all characters created by hb_keyChar() ! fixed formatting * src/rdd/dbf1.c * added more general protection against GPF in not fully initialized workarea --- ChangeLog.txt | 94 +++ include/harbour.hbx | 1 + include/hbapi.h | 2 +- include/hbapigt.h | 2 +- include/hbgtcore.h | 6 +- include/hbgtinfo.ch | 5 +- include/hbvm.h | 7 - include/inkey.ch | 46 +- src/rdd/dbf1.c | 9 +- src/rtl/gttrm/gttrm.c | 572 ++++++------- src/rtl/gtwvt/gtwvt.c | 1803 ++++++++++++++++++++++++++++++++--------- src/rtl/gtwvt/gtwvt.h | 177 +++- src/rtl/gtxwc/gtxwc.c | 726 +++++++---------- src/rtl/gtxwc/gtxwc.h | 285 +++---- src/rtl/hbgtcore.c | 21 +- src/rtl/inkey.c | 5 + src/rtl/inkeyapi.c | 275 ++++++- src/vm/cmdarg.c | 49 +- src/vm/hvm.c | 34 +- tests/gtkeys.prg | 310 +++---- 20 files changed, 2815 insertions(+), 1614 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index c45614cac9..9cb4faecbb 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,100 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2013-04-22 15:38 UTC+0200 Przemysław Czerpak (druzus/at/poczta.onet.pl) + * include/hbapi.h + * include/hbapigt.h + * include/hbvm.h + * src/rtl/inkeyapi.c + * src/vm/cmdarg.c + * src/vm/hvm.c + * replaced hb_cmdargProcessVM() with hb_cmdargProcess() and removed + unused for long time custom user cancel key functionality. + - removed dummy hb_inkeySetCancelKeys() C function. + - removed not used for long time HVM C functions and macros: + hb_vmFlagEnabled(), hb_vmFlagSet(), hb_vmFlagClear(), + HB_VMFLAG_HARBOUR, HB_VMFLAG_ARRSTR + + * include/hbgtinfo.ch + + added new HB_GTI_* actions: + HB_GTI_WINHANDLE - Get console window low level handle + HB_GTI_MOUSEPOS_XY - Get mouse position in pixels + HB_GTI_DISPIMAGE - Display image with given name + + * include/hbapigt.h + * src/rtl/inkeyapi.c + + added new C function: int hb_inkeyKeyMod( int iKey ) + + added code for translation from extended key codes to + standard Clipper ones + + * include/harbour.hbx + * src/rtl/inkey.c + + added new PRG function hb_keyMod( ) -> + It extract keyboard modifiers (HB_KF_*) from extended key code. + + * include/hbgtcore.h + * src/rtl/hbgtcore.c + + added new macros for generating extended key codes with keyboard + modifiers for ASCII and UNICODE characters + % strip repeated extended key codes for mouse move + ! use standard key codes in extended ALERT() GT method + + * include/inkey.ch + + added key modifiers/flags for extended key codes: HB_KF_* + + added extended key codes: HB_KX_* + - removed unused HB_K_MULTICODE macro + + * src/rtl/gttrm/gttrm.c + * replaced old keyboard and mouse code with new one using + extended key codes for keyboard and mouse + + added support for keyboard modifiers in GPM events + + added support for keyboard modifiers in terminal mouse events + + * src/rtl/gtwvt/gtwvt.h + * src/rtl/gtwvt/gtwvt.c + ! invert selection region in WinCE builds + ! fixed selection in fullscreen or maximized modes with margins + * do not add EOL to one line selections + + added support for painting box drawing characters. + This mode can be enabled by: + hb_gtInfo( HB_GTI_FONTATTRIBUTE, HB_GTI_FONTA_DRAWBOX ) + and it causes that GTWVT draws all box characters as pixmap + regardles of used font. + So far this functionality existed only in GTXWC. + + added support for HB_GTI_FONTA_FIXMETRIC and HB_GTI_FONTA_CLRBKG + So far this functionality existed only in GTXWC. + + added support for HB_GTI_WINHANDLE + ! do not add EOL at the end of one line selection + + * src/rtl/gtxwc/gtxwc.h + * src/rtl/gtxwc/gtxwc.c + * replaced old keyboard and mouse code with new one using + extended key codes for keyboard and mouse + * renamed HB_GTXWC_* box drawing macros to HB_BOXCH_* ones + * do not add EOL to one line selections + ! fixed few keypad keycodes + * use cursor blinking rate HB_GTI_CURSORBLINKRATE for whole + show/hide period not only half of them. If someone use this + GTI action in his code then now he should double passed + value. [incompatible] + ! fixed return value for HB_GTI_SETPOS_ROWCOL + * few minor cleanups + + * tests/gtkeys.prg + * replaced old keyboard and mouse code with new one using + extended key codes for keyboard and mouse + + added description for some key codes + + added some initial HB_GTI_* actions + + change cursor size by K_INS + + display terminal size after HB_K_RESIZE + + display mouse position after mouse key codes + ! display all characters created by hb_keyChar() + ! fixed formatting + + * src/rdd/dbf1.c + * added more general protection against GPF in not fully + initialized workarea + 2013-04-19 16:55 UTC+0300 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt) * harbour/contrib/rddads/adsx.c ! fixed adsSeek() if seek string length is less than index key length diff --git a/include/harbour.hbx b/include/harbour.hbx index ede83a91d9..90f83ee32f 100644 --- a/include/harbour.hbx +++ b/include/harbour.hbx @@ -634,6 +634,7 @@ DYNAMIC hb_keyClear DYNAMIC hb_keyCode DYNAMIC hb_keyIns DYNAMIC hb_keyLast +DYNAMIC hb_keyMod DYNAMIC hb_keyNext DYNAMIC hb_keyPut DYNAMIC hb_keySetLast diff --git a/include/hbapi.h b/include/hbapi.h index 7b57097c40..4c6f1dcae4 100644 --- a/include/hbapi.h +++ b/include/hbapi.h @@ -1050,7 +1050,7 @@ extern void hb_cmdargUpdate( void ); /* update arguments afte extern HB_BOOL hb_cmdargCheck( const char * pszName ); /* Check if a given internal switch (like //INFO) was set */ extern char * hb_cmdargString( const char * pszName ); /* Returns the string value of an internal switch (like //TEMPPATH:"C:\") */ extern int hb_cmdargNum( const char * pszName ); /* Returns the numeric value of an internal switch (like //F:90) */ -extern HB_U32 hb_cmdargProcessVM( int * pCancelKey, int * pCancelKeyEx ); /* Check for command line internal arguments */ +extern void hb_cmdargProcess( void ); /* Check for command line internal arguments */ #if defined( HB_OS_WIN ) extern HB_EXPORT void hb_winmainArgInit( void * hInstance, void * hPrevInstance, int iCmdShow ); /* Set WinMain() parameters */ extern HB_EXPORT HB_BOOL hb_winmainArgGet( void * phInstance, void * phPrevInstance, int * piCmdShow ); /* Retrieve WinMain() parameters */ diff --git a/include/hbapigt.h b/include/hbapigt.h index 70f021f5f5..68bde5cb40 100644 --- a/include/hbapigt.h +++ b/include/hbapigt.h @@ -308,13 +308,13 @@ extern HB_EXPORT int hb_inkeyLast( int iEvenMask ); /* Return the value extern HB_EXPORT int hb_inkeyNext( int iEvenMask ); /* Return the next key without extracting it */ extern HB_EXPORT void hb_inkeyPoll( void ); /* Poll the console keyboard to stuff the Harbour buffer */ extern HB_EXPORT void hb_inkeyReset( void ); /* Reset the Harbour keyboard buffer */ -extern HB_EXPORT void hb_inkeySetCancelKeys( int CancelKey, int CancelKeyEx ); /* Set keycodes for Cancel key (usually K_ALT_C) */ extern HB_EXPORT void hb_inkeySetText( const char * szText, HB_SIZE nLen ); /* Set text into inkey buffer */ extern HB_EXPORT int hb_inkeySetLast( int iKey ); /* Set new LastKey() value, return previous one */ extern HB_EXPORT void hb_inkeyExit( void ); /* reset inkey pool to default state and free any allocated resources */ extern HB_EXPORT HB_SIZE hb_inkeyKeyString( int iKey, char * buffer, HB_SIZE nSize ); /* convert key value to string */ extern HB_EXPORT int hb_inkeyKeyStd( int iKey ); /* convert Harbour extended key code to cl*pper inkey code */ +extern HB_EXPORT int hb_inkeyKeyMod( int iKey ); /* extract keyboard modifiers from Harbour extended key code */ HB_EXTERN_END diff --git a/include/hbgtcore.h b/include/hbgtcore.h index 149eec76e0..b1e6f4f46c 100644 --- a/include/hbgtcore.h +++ b/include/hbgtcore.h @@ -331,7 +331,7 @@ typedef struct _HB_GT_BASE int inkeyBufferSize; int inkeyHead; int inkeyTail; - int iLastPut; + int inkeyLastPos; int inkeyLast; HB_WCHAR * StrBuffer; HB_SIZE StrBufferSize; @@ -669,10 +669,12 @@ extern int hb_gt_dos_keyCodeTranslate( int iKey ); #define HB_INKEY_NEW_VALF( v, f ) ( ( ( v ) & HB_INKEY_EXT_VALMASK ) | \ ( ( ( f ) << HB_INKEY_EXT_VALBITS ) & HB_INKEY_EXT_FLAGMASK ) ) -#define HB_INKEY_NEW_MKEY( b, f ) ( HB_INKEY_NEW_VALF( b, f ) | HB_INKEY_EXT_BIT | HB_INKEY_EXT_MOUSEKEY ) +#define HB_INKEY_NEW_MKEY( k, f ) ( HB_INKEY_NEW_VALF( k, f ) | HB_INKEY_EXT_BIT | HB_INKEY_EXT_MOUSEKEY ) #define HB_INKEY_NEW_KEY( k, f ) ( HB_INKEY_NEW_VALF( k, f ) | HB_INKEY_EXT_BIT | HB_INKEY_EXT_KEY ) #define HB_INKEY_NEW_CHAR( b ) ( ( b ) | ( HB_INKEY_EXT_BIT | HB_INKEY_EXT_CHAR ) ) +#define HB_INKEY_NEW_CHARF( b, f ) ( HB_INKEY_NEW_VALF( b, f ) | ( HB_INKEY_EXT_BIT | HB_INKEY_EXT_CHAR ) ) #define HB_INKEY_NEW_UNICODE( b ) ( ( b ) | ( HB_INKEY_EXT_BIT | HB_INKEY_EXT_UNICODE ) ) +#define HB_INKEY_NEW_UNICODEF( b, f ) ( HB_INKEY_NEW_VALF( b, f ) | ( HB_INKEY_EXT_BIT | HB_INKEY_EXT_UNICODE ) ) #define HB_INKEY_NEW_MPOS( x, y ) ( ( ( ( y ) & HB_INKEY_EXT_POSMASK ) << HB_INKEY_EXT_POSBITS ) | \ ( ( x ) & HB_INKEY_EXT_POSMASK ) | \ diff --git a/include/hbgtinfo.ch b/include/hbgtinfo.ch index cdd1fd6b1d..0ff7c697f1 100644 --- a/include/hbgtinfo.ch +++ b/include/hbgtinfo.ch @@ -144,10 +144,11 @@ #define HB_GTI_VERSION 65 /* Get terminal version string */ #define HB_GTI_MAXIMIZED 66 /* Get/Set Window's Maximized status (supported by: GTWVT) */ - #define HB_GTI_FONTATTRIBUTE 67 /* Get/set font attribute */ - #define HB_GTI_UNITRANS 68 /* set translation table for UNICODE characters */ +#define HB_GTI_WINHANDLE 69 /* Get console window low level handle */ +#define HB_GTI_MOUSEPOS_XY 70 /* Get mouse position in pixels */ +#define HB_GTI_DISPIMAGE 71 /* Display image with given name */ /* Font weights */ #define HB_GTI_FONTW_THIN 1 diff --git a/include/hbvm.h b/include/hbvm.h index f55822b4f1..9cbc599b7e 100644 --- a/include/hbvm.h +++ b/include/hbvm.h @@ -190,13 +190,6 @@ extern HB_EXPORT void hb_vmTerminateThreads( void ); /* send QUIT request to extern HB_EXPORT PHB_ITEM hb_vmThreadStart( HB_ULONG ulAttr, PHB_CARGO_FUNC pThreadFunc, void * cargo ); /* create new thread with HVM stack */ extern HB_EXPORT void * hb_vmThreadState( void ); -/* various flags for supported features */ -#define HB_VMFLAG_HARBOUR 1 /* enable Harbour extension */ -#define HB_VMFLAG_ARRSTR 16 /* support for string as array of bytes -ks */ -extern HB_EXPORT HB_U32 hb_vmFlagEnabled( HB_U32 flags ); -extern HB_EXPORT void hb_vmFlagSet( HB_U32 flags ); -extern HB_EXPORT void hb_vmFlagClear( HB_U32 flags ); - HB_EXTERN_END #endif /* HB_VM_H_ */ diff --git a/include/inkey.ch b/include/inkey.ch index ee9af20ad2..7acf359932 100644 --- a/include/inkey.ch +++ b/include/inkey.ch @@ -101,11 +101,6 @@ #define HB_K_CONNECT 1105 #define HB_K_DISCONNECT 1106 -/* Harbour extension - this marks that multi-characters keycode will be - returned - call Inkey() until ZERO will be returned -*/ -#define HB_K_MULTICODE 4096 - /* Cursor movement keys */ #define K_UP 5 /* Up arrow, Ctrl-E */ @@ -332,4 +327,45 @@ #define K_SH_F11 -42 /* * Shift-F11 */ #define K_SH_F12 -43 /* * Shift-F12 */ + +/* key flags used by extended key codes */ + +#define HB_KF_SHIFT 0x01 +#define HB_KF_CTRL 0x02 +#define HB_KF_ALT 0x04 +#define HB_KF_KEYPAD 0x08 + +/* extended key codes */ + +#define HB_KX_F1 1 +#define HB_KX_F2 2 +#define HB_KX_F3 3 +#define HB_KX_F4 4 +#define HB_KX_F5 5 +#define HB_KX_F6 6 +#define HB_KX_F7 7 +#define HB_KX_F8 8 +#define HB_KX_F9 9 +#define HB_KX_F10 10 +#define HB_KX_F11 11 +#define HB_KX_F12 12 +#define HB_KX_UP 13 +#define HB_KX_DOWN 14 +#define HB_KX_LEFT 15 +#define HB_KX_RIGHT 16 +#define HB_KX_HOME 17 +#define HB_KX_END 18 +#define HB_KX_PGUP 19 +#define HB_KX_PGDN 20 +#define HB_KX_INS 21 +#define HB_KX_DEL 22 +#define HB_KX_BS 23 +#define HB_KX_TAB 24 +#define HB_KX_ESC 25 +#define HB_KX_ENTER 26 +#define HB_KX_CENTER 27 +#define HB_KX_PRTSCR 28 +#define HB_KX_PAUSE 29 + + #endif /* HB_INKEY_CH_ */ diff --git a/src/rdd/dbf1.c b/src/rdd/dbf1.c index 87643d3691..c0c67c87ae 100644 --- a/src/rdd/dbf1.c +++ b/src/rdd/dbf1.c @@ -548,6 +548,9 @@ static HB_BOOL hb_dbfReadRecord( DBFAREAP pArea ) { HB_TRACE( HB_TR_DEBUG, ( "hb_dbfReadRecord(%p)", pArea ) ); + if( ! pArea->pRecord ) + return HB_FALSE; + if( ! pArea->fPositioned ) { pArea->fValidBuffer = HB_TRUE; @@ -2021,11 +2024,11 @@ static HB_ERRCODE hb_dbfGetValue( DBFAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pI return HB_FAILURE; } - /* Read record */ - if( ! pArea->pRecord || ! pArea->fValidBuffer && ! hb_dbfReadRecord( pArea ) ) + if( --uiIndex >= pArea->area.uiFieldCount ) return HB_FAILURE; - if( --uiIndex >= pArea->area.uiFieldCount ) + /* Read record */ + if( ! pArea->fValidBuffer && ! hb_dbfReadRecord( pArea ) ) return HB_FAILURE; fError = HB_FALSE; diff --git a/src/rtl/gttrm/gttrm.c b/src/rtl/gttrm/gttrm.c index 1f7b8121fa..13699cce5b 100644 --- a/src/rtl/gttrm/gttrm.c +++ b/src/rtl/gttrm/gttrm.c @@ -92,6 +92,13 @@ #endif #if defined( HB_HAS_GPM ) # include +# if defined( HB_OS_LINUX ) && 0 +# include +# else +# define KG_SHIFT 0 +# define KG_CTRL 2 +# define KG_ALT 3 +# endif #endif #ifndef O_ACCMODE @@ -174,11 +181,14 @@ static HB_GT_FUNCS SuperTable; #endif -#define KEY_ALTMASK 0x10000000 -#define KEY_CTRLMASK 0x20000000 -#define KEY_EXTDMASK 0x40000000 -#define KEY_CLIPMASK 0x80000000 -#define KEY_MASK 0xF0000000 +#define KEY_SHIFTMASK 0x01000000 +#define KEY_CTRLMASK 0x02000000 +#define KEY_ALTMASK 0x04000000 +#define KEY_KPADMASK 0x08000000 +#define KEY_EXTDMASK 0x10000000 +#define KEY_CLIPMASK 0x20000000 +/* 0x40000000 reserved for Harbour extended keys */ +#define KEY_MASK 0xFF000000 #define CLR_KEYMASK( x ) ( ( x ) & ~KEY_MASK ) #define GET_KEYMASK( x ) ( ( x ) & KEY_MASK ) @@ -191,36 +201,35 @@ static HB_GT_FUNCS SuperTable; #define ALT_SEQ "\037" /*#define NATION_SEQ "\016"*/ -#define EXKEY_F1 ( 0 | KEY_EXTDMASK ) -#define EXKEY_F2 ( 1 | KEY_EXTDMASK ) -#define EXKEY_F3 ( 2 | KEY_EXTDMASK ) -#define EXKEY_F4 ( 3 | KEY_EXTDMASK ) -#define EXKEY_F5 ( 4 | KEY_EXTDMASK ) -#define EXKEY_F6 ( 5 | KEY_EXTDMASK ) -#define EXKEY_F7 ( 6 | KEY_EXTDMASK ) -#define EXKEY_F8 ( 7 | KEY_EXTDMASK ) -#define EXKEY_F9 ( 8 | KEY_EXTDMASK ) -#define EXKEY_F10 ( 9 | KEY_EXTDMASK ) -#define EXKEY_F11 ( 10 | KEY_EXTDMASK ) -#define EXKEY_F12 ( 11 | KEY_EXTDMASK ) -#define EXKEY_UP ( 12 | KEY_EXTDMASK ) -#define EXKEY_DOWN ( 13 | KEY_EXTDMASK ) -#define EXKEY_LEFT ( 14 | KEY_EXTDMASK ) -#define EXKEY_RIGHT ( 15 | KEY_EXTDMASK ) -#define EXKEY_INS ( 16 | KEY_EXTDMASK ) -#define EXKEY_DEL ( 17 | KEY_EXTDMASK ) -#define EXKEY_HOME ( 18 | KEY_EXTDMASK ) -#define EXKEY_END ( 19 | KEY_EXTDMASK ) -#define EXKEY_PGUP ( 20 | KEY_EXTDMASK ) -#define EXKEY_PGDN ( 21 | KEY_EXTDMASK ) -#define EXKEY_BS ( 22 | KEY_EXTDMASK ) -#define EXKEY_TAB ( 23 | KEY_EXTDMASK ) -#define EXKEY_ESC ( 24 | KEY_EXTDMASK ) -#define EXKEY_ENTER ( 25 | KEY_EXTDMASK ) -#define EXKEY_KPENTER ( 26 | KEY_EXTDMASK ) -#define EXKEY_CENTER ( 27 | KEY_EXTDMASK ) -#define EXKEY_PRTSCR ( 28 | KEY_EXTDMASK ) -#define EXKEY_PAUSE ( 29 | KEY_EXTDMASK ) +#define EXKEY_F1 ( HB_KX_F1 | KEY_EXTDMASK ) +#define EXKEY_F2 ( HB_KX_F2 | KEY_EXTDMASK ) +#define EXKEY_F3 ( HB_KX_F3 | KEY_EXTDMASK ) +#define EXKEY_F4 ( HB_KX_F4 | KEY_EXTDMASK ) +#define EXKEY_F5 ( HB_KX_F5 | KEY_EXTDMASK ) +#define EXKEY_F6 ( HB_KX_F6 | KEY_EXTDMASK ) +#define EXKEY_F7 ( HB_KX_F7 | KEY_EXTDMASK ) +#define EXKEY_F8 ( HB_KX_F8 | KEY_EXTDMASK ) +#define EXKEY_F9 ( HB_KX_F9 | KEY_EXTDMASK ) +#define EXKEY_F10 ( HB_KX_F10 | KEY_EXTDMASK ) +#define EXKEY_F11 ( HB_KX_F11 | KEY_EXTDMASK ) +#define EXKEY_F12 ( HB_KX_F12 | KEY_EXTDMASK ) +#define EXKEY_UP ( HB_KX_UP | KEY_EXTDMASK ) +#define EXKEY_DOWN ( HB_KX_DOWN | KEY_EXTDMASK ) +#define EXKEY_LEFT ( HB_KX_LEFT | KEY_EXTDMASK ) +#define EXKEY_RIGHT ( HB_KX_RIGHT | KEY_EXTDMASK ) +#define EXKEY_HOME ( HB_KX_HOME | KEY_EXTDMASK ) +#define EXKEY_END ( HB_KX_END | KEY_EXTDMASK ) +#define EXKEY_PGUP ( HB_KX_PGUP | KEY_EXTDMASK ) +#define EXKEY_PGDN ( HB_KX_PGDN | KEY_EXTDMASK ) +#define EXKEY_INS ( HB_KX_INS | KEY_EXTDMASK ) +#define EXKEY_DEL ( HB_KX_DEL | KEY_EXTDMASK ) +#define EXKEY_BS ( HB_KX_BS | KEY_EXTDMASK ) +#define EXKEY_TAB ( HB_KX_TAB | KEY_EXTDMASK ) +#define EXKEY_ESC ( HB_KX_ESC | KEY_EXTDMASK ) +#define EXKEY_ENTER ( HB_KX_ENTER | KEY_EXTDMASK ) +#define EXKEY_CENTER ( HB_KX_CENTER | KEY_EXTDMASK ) +#define EXKEY_PRTSCR ( HB_KX_PRTSCR | KEY_EXTDMASK ) +#define EXKEY_PAUSE ( HB_KX_PAUSE | KEY_EXTDMASK ) #define K_UNDEF 0x10000 #define K_METAALT 0x10001 @@ -228,24 +237,6 @@ static HB_GT_FUNCS SuperTable; #define K_NATIONAL 0x10003 #define K_MOUSETERM 0x10004 #define K_RESIZE 0x10005 -#define K_PRTSCR 0x10006 -#define K_PAUSE 0x10007 - -/* xHarbour compatible definitions */ -#if ! defined( K_SH_LEFT ) -#define K_SH_LEFT K_LEFT /* Shift-Left == Left */ -#define K_SH_UP K_UP /* Shift-Up == Up */ -#define K_SH_RIGHT K_RIGHT /* Shift-Right == Right */ -#define K_SH_DOWN K_DOWN /* Shift-Down == Down */ -#define K_SH_INS K_INS /* Shift-Ins == Ins */ -#define K_SH_DEL K_DEL /* Shift-Del == Del */ -#define K_SH_HOME K_HOME /* Shift-Home == Home */ -#define K_SH_END K_END /* Shift-End == End */ -#define K_SH_PGUP K_PGUP /* Shift-PgUp == PgUp */ -#define K_SH_PGDN K_PGDN /* Shift-PgDn == PgDn */ -#define K_SH_RETURN K_RETURN /* Shift-Enter == Enter */ -#define K_SH_ENTER K_ENTER /* Shift-Enter == Enter */ -#endif typedef struct { @@ -261,6 +252,7 @@ typedef struct int row, col; int buttonstate; int lbuttons; + int flags; int lbup_row, lbup_col; int lbdn_row, lbdn_col; int rbup_row, rbup_col; @@ -422,195 +414,38 @@ static const char s_szBell[] = { HB_CHAR_BEL, 0 }; /* conversion table for ANSI color indexes */ static const int s_AnsiColors[] = { 0, 4, 2, 6, 1, 5, 3, 7 }; -/* The tables below are indexed by internal key value, - * It cause that we don't have to make any linear scans - * to access information proper ClipKeyCode entry - */ -static const ClipKeyCode stdKeyTab[ NO_STDKEYS ] = { - { K_SPACE, 0, 0, 0 }, /* 32 */ - { '!', 0, 0, 0 }, /* 33 */ - { '"', 0, 0, 0 }, /* 34 */ - { '#', 0, 0, 0 }, /* 35 */ - { '$', 0, 0, 0 }, /* 36 */ - { '%', 0, 0, 0 }, /* 37 */ - { '&', 0, 0, 0 }, /* 38 */ - { '\'', 296, 7, 0 }, /* 39 */ - { '(', 0, 0, 0 }, /* 40 */ - { ')', 0, 0, 0 }, /* 41 */ - { '*', 0, 0, 0 }, /* 42 */ - { '+', 0, 0, 0 }, /* 43 */ - { ',', 307, 0, 0 }, /* 44 */ - { '-', 386, 31, 0 }, /* 45 */ - { '.', 308, 0, 0 }, /* 46 */ - { '/', 309, 127, 0 }, /* 47 */ - { '0', K_ALT_0, 0, 0 }, /* 48 */ - { '1', K_ALT_1, 0, 0 }, /* 49 */ - { '2', K_ALT_2, 259, 0 }, /* 50 */ - { '3', K_ALT_3, 27, 0 }, /* 51 */ - { '4', K_ALT_4, 28, 0 }, /* 52 */ - { '5', K_ALT_5, 29, 0 }, /* 53 */ - { '6', K_ALT_6, 30, 0 }, /* 54 */ - { '7', K_ALT_7, 31, 0 }, /* 55 */ - { '8', K_ALT_8, 127, 0 }, /* 56 */ - { '9', K_ALT_9, 0, 0 }, /* 57 */ - { ':', 0, 0, 0 }, /* 58 */ - { ';', 295, 0, 0 }, /* 59 */ - { '<', 0, 0, 0 }, /* 60 */ - { '=', K_ALT_EQUALS, 0, 0 }, /* 61 */ - { '>', 0, 0, 0 }, /* 62 */ - { '?', 0, 0, 0 }, /* 63 */ - { '@', 0, 0, 0 }, /* 64 */ - { 'A', K_ALT_A, K_CTRL_A, 0 }, /* 65 */ - { 'B', K_ALT_B, K_CTRL_B, 0 }, /* 66 */ - { 'C', K_ALT_C, K_CTRL_C, 0 }, /* 67 */ - { 'D', K_ALT_D, K_CTRL_D, 0 }, /* 68 */ - { 'E', K_ALT_E, K_CTRL_E, 0 }, /* 69 */ - { 'F', K_ALT_F, K_CTRL_F, 0 }, /* 70 */ - { 'G', K_ALT_G, K_CTRL_G, 0 }, /* 71 */ - { 'H', K_ALT_H, K_CTRL_H, 0 }, /* 72 */ - { 'I', K_ALT_I, K_CTRL_I, 0 }, /* 73 */ - { 'J', K_ALT_J, K_CTRL_J, 0 }, /* 74 */ - { 'K', K_ALT_K, K_CTRL_K, 0 }, /* 75 */ - { 'L', K_ALT_L, K_CTRL_L, 0 }, /* 76 */ - { 'M', K_ALT_M, K_CTRL_M, 0 }, /* 77 */ - { 'N', K_ALT_N, K_CTRL_N, 0 }, /* 78 */ - { 'O', K_ALT_O, K_CTRL_O, 0 }, /* 79 */ - { 'P', K_ALT_P, K_CTRL_P, 0 }, /* 80 */ - { 'Q', K_ALT_Q, K_CTRL_Q, 0 }, /* 81 */ - { 'R', K_ALT_R, K_CTRL_R, 0 }, /* 82 */ - { 'S', K_ALT_S, K_CTRL_S, 0 }, /* 83 */ - { 'T', K_ALT_T, K_CTRL_T, 0 }, /* 84 */ - { 'U', K_ALT_U, K_CTRL_U, 0 }, /* 85 */ - { 'V', K_ALT_V, K_CTRL_V, 0 }, /* 86 */ - { 'W', K_ALT_W, K_CTRL_W, 0 }, /* 87 */ - { 'X', K_ALT_X, K_CTRL_X, 0 }, /* 88 */ - { 'Y', K_ALT_Y, K_CTRL_Y, 0 }, /* 89 */ - { 'Z', K_ALT_Z, K_CTRL_Z, 0 }, /* 90 */ - { '[', 282, 27, 0 }, /* 91 */ - { '\\', 299, 28, 0 }, /* 92 */ - { ']', 283, 29, 0 }, /* 93 */ - { '^', K_ALT_6, 30, 0 }, /* 94 */ - { '_', 386, 31, 0 }, /* 95 */ - { '`', 297, 297, 0 }, /* 96 */ - { 'a', K_ALT_A, K_CTRL_A, 0 }, /* 97 */ - { 'b', K_ALT_B, K_CTRL_B, 0 }, /* 98 */ - { 'c', K_ALT_C, K_CTRL_C, 0 }, /* 99 */ - { 'd', K_ALT_D, K_CTRL_D, 0 }, /* 100 */ - { 'e', K_ALT_E, K_CTRL_E, 0 }, /* 101 */ - { 'f', K_ALT_F, K_CTRL_F, 0 }, /* 102 */ - { 'g', K_ALT_G, K_CTRL_G, 0 }, /* 103 */ - { 'h', K_ALT_H, K_CTRL_H, 0 }, /* 104 */ - { 'i', K_ALT_I, K_CTRL_I, 0 }, /* 105 */ - { 'j', K_ALT_J, K_CTRL_J, 0 }, /* 106 */ - { 'k', K_ALT_K, K_CTRL_K, 0 }, /* 107 */ - { 'l', K_ALT_L, K_CTRL_L, 0 }, /* 108 */ - { 'm', K_ALT_M, K_CTRL_M, 0 }, /* 109 */ - { 'n', K_ALT_N, K_CTRL_N, 0 }, /* 110 */ - { 'o', K_ALT_O, K_CTRL_O, 0 }, /* 111 */ - { 'p', K_ALT_P, K_CTRL_P, 0 }, /* 112 */ - { 'q', K_ALT_Q, K_CTRL_Q, 0 }, /* 113 */ - { 'r', K_ALT_R, K_CTRL_R, 0 }, /* 114 */ - { 's', K_ALT_S, K_CTRL_S, 0 }, /* 115 */ - { 't', K_ALT_T, K_CTRL_T, 0 }, /* 116 */ - { 'u', K_ALT_U, K_CTRL_U, 0 }, /* 117 */ - { 'v', K_ALT_V, K_CTRL_V, 0 }, /* 118 */ - { 'w', K_ALT_W, K_CTRL_W, 0 }, /* 119 */ - { 'x', K_ALT_X, K_CTRL_X, 0 }, /* 120 */ - { 'y', K_ALT_Y, K_CTRL_Y, 0 }, /* 121 */ - { 'z', K_ALT_Z, K_CTRL_Z, 0 }, /* 122 */ - { '{', 282, 27, 0 }, /* 123 */ - { '|', 299, 28, 0 }, /* 124 */ - { '}', 283, 29, 0 }, /* 125 */ - { '~', 297, 297, 0 }, /* 126 */ - { K_CTRL_BS, K_ALT_BS, 127, 0 } /* 127 */ -}; - -static const ClipKeyCode extdKeyTab[ NO_EXTDKEYS ] = { - { K_F1, K_ALT_F1, K_CTRL_F1, K_SH_F1 }, /* 00 */ - { K_F2, K_ALT_F2, K_CTRL_F2, K_SH_F2 }, /* 01 */ - { K_F3, K_ALT_F3, K_CTRL_F3, K_SH_F3 }, /* 02 */ - { K_F4, K_ALT_F4, K_CTRL_F4, K_SH_F4 }, /* 03 */ - { K_F5, K_ALT_F5, K_CTRL_F5, K_SH_F5 }, /* 04 */ - { K_F6, K_ALT_F6, K_CTRL_F6, K_SH_F6 }, /* 05 */ - { K_F7, K_ALT_F7, K_CTRL_F7, K_SH_F7 }, /* 06 */ - { K_F8, K_ALT_F8, K_CTRL_F8, K_SH_F8 }, /* 07 */ - { K_F9, K_ALT_F9, K_CTRL_F9, K_SH_F9 }, /* 08 */ - { K_F10, K_ALT_F10, K_CTRL_F10, K_SH_F10 }, /* 09 */ - { K_F11, K_ALT_F11, K_CTRL_F11, K_SH_F11 }, /* 10 */ - { K_F12, K_ALT_F12, K_CTRL_F12, K_SH_F12 }, /* 11 */ - - { K_UP, K_ALT_UP, K_CTRL_UP, K_SH_UP }, /* 12 */ - { K_DOWN, K_ALT_DOWN, K_CTRL_DOWN, K_SH_DOWN }, /* 13 */ - { K_LEFT, K_ALT_LEFT, K_CTRL_LEFT, K_SH_LEFT }, /* 14 */ - { K_RIGHT, K_ALT_RIGHT, K_CTRL_RIGHT, K_SH_RIGHT }, /* 15 */ - { K_INS, K_ALT_INS, K_CTRL_INS, K_SH_INS }, /* 16 */ - { K_DEL, K_ALT_DEL, K_CTRL_DEL, K_SH_DEL }, /* 17 */ - { K_HOME, K_ALT_HOME, K_CTRL_HOME, K_SH_HOME }, /* 18 */ - { K_END, K_ALT_END, K_CTRL_END, K_SH_END }, /* 19 */ - { K_PGUP, K_ALT_PGUP, K_CTRL_PGUP, K_SH_PGUP }, /* 20 */ - { K_PGDN, K_ALT_PGDN, K_CTRL_PGDN, K_SH_PGDN }, /* 21 */ - - { K_BS, K_ALT_BS, 127, K_SH_BS }, /* 22 */ - { K_TAB, K_ALT_TAB, K_CTRL_TAB, K_SH_TAB }, /* 23 */ - { K_ESC, K_ALT_ESC, K_ESC, 0 }, /* 24 */ - - { K_ENTER, K_ALT_ENTER, K_CTRL_ENTER, K_SH_ENTER }, /* 25 */ - - { K_ENTER, KP_ALT_ENTER, K_CTRL_ENTER, 0 }, /* 26 */ - { KP_CENTER, 0, KP_CTRL_5, 0 }, /* 27 */ - { K_PRTSCR, 0, K_CTRL_PRTSCR, 0 }, /* 28 */ - { K_PAUSE, 0, 0, 0 } /* 29 */ -}; - static int getClipKey( int nKey ) { int nRet = 0, nFlag, n; if( IS_CLIPKEY( nKey ) ) nRet = GET_CLIPKEY( nKey ); + else if( HB_INKEY_ISEXT( nKey ) ) + nRet = nKey; else { - nFlag = GET_KEYMASK( nKey ); + n = GET_KEYMASK( nKey ); nKey = CLR_KEYMASK( nKey ); - if( nFlag & KEY_EXTDMASK ) - { - if( nKey >= 0 && nKey < NO_EXTDKEYS ) - { - if( ( nFlag & KEY_ALTMASK ) && ( nFlag & KEY_CTRLMASK ) && - extdKeyTab[ nKey ].shift_key != 0 ) - nRet = extdKeyTab[ nKey ].shift_key; - else if( ( nFlag & KEY_ALTMASK ) && extdKeyTab[ nKey ].alt_key != 0 ) - nRet = extdKeyTab[ nKey ].alt_key; - else if( ( nFlag & KEY_CTRLMASK ) - && extdKeyTab[ nKey ].ctrl_key != 0 ) - nRet = extdKeyTab[ nKey ].ctrl_key; - else - nRet = extdKeyTab[ nKey ].key; - } - } + nFlag = 0; + if( n & KEY_SHIFTMASK ) + nFlag |= HB_KF_SHIFT; + if( n & KEY_CTRLMASK ) + nFlag |= HB_KF_CTRL; + if( n & KEY_ALTMASK ) + nFlag |= HB_KF_ALT; + if( n & KEY_KPADMASK ) + nFlag |= HB_KF_KEYPAD; + + if( n & KEY_EXTDMASK ) + nRet = HB_INKEY_NEW_KEY( nKey, nFlag ); else { if( nKey > 0 && nKey < 32 ) { - nFlag |= KEY_CTRLMASK; + nFlag |= HB_KF_CTRL; nKey += ( 'A' - 1 ); } - n = nKey - 32; - if( n >= 0 && n < NO_STDKEYS ) - { - if( ( nFlag & KEY_ALTMASK ) && ( nFlag & KEY_CTRLMASK ) && - stdKeyTab[ n ].shift_key != 0 ) - nRet = stdKeyTab[ n ].shift_key; - else if( ( nFlag & KEY_ALTMASK ) && stdKeyTab[ n ].alt_key != 0 ) - nRet = stdKeyTab[ n ].alt_key; - else if( ( nFlag & KEY_CTRLMASK ) && stdKeyTab[ n ].ctrl_key != 0 ) - nRet = stdKeyTab[ n ].ctrl_key; - else - nRet = stdKeyTab[ n ].key; - } - else - nRet = nKey; - + nRet = HB_INKEY_NEW_KEY( nKey, nFlag ); } } @@ -679,6 +514,17 @@ static void set_signals( void ) #endif +static int hb_gt_trm_getKbdState( PHB_GTTRM pTerm ) +{ + int iFlags = 0; + + if( pTerm->mLastEvt.flags & HB_KF_SHIFT ) iFlags |= HB_GTI_KBD_SHIFT; + if( pTerm->mLastEvt.flags & HB_KF_CTRL ) iFlags |= HB_GTI_KBD_CTRL; + if( pTerm->mLastEvt.flags & HB_KF_ALT ) iFlags |= HB_GTI_KBD_ALT; + + return iFlags; +} + static int hb_gt_trm_getSize( PHB_GTTRM pTerm, int * piRows, int * piCols ) { *piRows = *piCols = 0; @@ -892,17 +738,17 @@ static int getMouseKey( mouseEvent * mEvt ) { if( mEvt->buttonstate & M_CURSOR_MOVE ) { - nKey = K_MOUSEMOVE; + nKey = HB_INKEY_NEW_MPOS( mEvt->col, mEvt->row ); mEvt->buttonstate &= ~M_CURSOR_MOVE; } else if( mEvt->buttonstate & M_BUTTON_WHEELUP ) { - nKey = K_MWFORWARD; + nKey = HB_INKEY_NEW_MKEY( K_MWFORWARD, mEvt->flags ); mEvt->buttonstate &= ~M_BUTTON_WHEELUP; } else if( mEvt->buttonstate & M_BUTTON_WHEELDOWN ) { - nKey = K_MWBACKWARD; + nKey = HB_INKEY_NEW_MKEY( K_MWBACKWARD, mEvt->flags ); mEvt->buttonstate &= ~M_BUTTON_WHEELDOWN; } else @@ -924,6 +770,7 @@ static int getMouseKey( mouseEvent * mEvt ) nKey = ( mEvt->buttonstate & M_BUTTON_LEFT ) ? ( ( mEvt->buttonstate & M_BUTTON_LDBLCK ) ? K_LDBLCLK : K_LBUTTONDOWN ) : K_LBUTTONUP; + nKey = HB_INKEY_NEW_MKEY( nKey, mEvt->flags ); mEvt->lbuttons ^= M_BUTTON_LEFT; mEvt->buttonstate &= ~M_BUTTON_LDBLCK; } @@ -942,6 +789,7 @@ static int getMouseKey( mouseEvent * mEvt ) nKey = ( mEvt->buttonstate & M_BUTTON_RIGHT ) ? ( ( mEvt->buttonstate & M_BUTTON_RDBLCK ) ? K_RDBLCLK : K_RBUTTONDOWN ) : K_RBUTTONUP; + nKey = HB_INKEY_NEW_MKEY( nKey, mEvt->flags ); mEvt->lbuttons ^= M_BUTTON_RIGHT; mEvt->buttonstate &= ~M_BUTTON_RDBLCK; } @@ -960,6 +808,7 @@ static int getMouseKey( mouseEvent * mEvt ) nKey = ( mEvt->buttonstate & M_BUTTON_MIDDLE ) ? ( ( mEvt->buttonstate & M_BUTTON_MDBLCK ) ? K_MDBLCLK : K_MBUTTONDOWN ) : K_MBUTTONUP; + nKey = HB_INKEY_NEW_MKEY( nKey, mEvt->flags ); mEvt->lbuttons ^= M_BUTTON_MIDDLE; mEvt->buttonstate &= ~M_BUTTON_MDBLCK; } @@ -1012,6 +861,14 @@ static void set_tmevt( PHB_GTTRM pTerm, unsigned char * cMBuf, mouseEvent * mEvt { int row, col; + mEvt->flags = 0; + if( cMBuf[ 0 ] & 0x04 ) + mEvt->flags |= HB_KF_SHIFT; + if( cMBuf[ 0 ] & 0x08 ) + mEvt->flags |= HB_KF_ALT; + if( cMBuf[ 0 ] & 0x10 ) + mEvt->flags |= HB_KF_CTRL; + col = cMBuf[ 1 ] - 33; row = cMBuf[ 2 ] - 33; if( mEvt->row != row || mEvt->col != col ) @@ -1026,10 +883,8 @@ static void set_tmevt( PHB_GTTRM pTerm, unsigned char * cMBuf, mouseEvent * mEvt switch( cMBuf[ 0 ] & 0xC3 ) { case 0x1: - cMBuf[ 0 ] = 0x2; - break; case 0x2: - cMBuf[ 0 ] = 0x1; + cMBuf[ 0 ] ^= 0x3; break; } #endif @@ -1075,9 +930,17 @@ static int set_gpmevt( int fd, int mode, void * cargo ) if( Gpm_GetEvent( &gEvt ) > 0 ) { + pTerm->mLastEvt.flags = 0; + if( gEvt.modifiers & ( 1 << KG_SHIFT ) ) + pTerm->mLastEvt.flags |= HB_KF_SHIFT; + if( gEvt.modifiers & ( 1 << KG_CTRL ) ) + pTerm->mLastEvt.flags |= HB_KF_CTRL; + if( gEvt.modifiers & ( 1 << KG_ALT ) ) + pTerm->mLastEvt.flags |= HB_KF_ALT; + pTerm->mLastEvt.row = gEvt.y; pTerm->mLastEvt.col = gEvt.x; - if( gEvt.type & GPM_MOVE ) + if( gEvt.type & ( GPM_MOVE | GPM_DRAG ) ) pTerm->mLastEvt.buttonstate |= M_CURSOR_MOVE; if( gEvt.type & GPM_DOWN ) { @@ -1101,7 +964,7 @@ static int set_gpmevt( int fd, int mode, void * cargo ) chk_mevtdblck( pTerm ); nKey = getMouseKey( &pTerm->mLastEvt ); - return nKey ? SET_CLIPKEY( nKey ) : 0; + return nKey ? ( HB_INKEY_ISEXT( nKey ) ? nKey : SET_CLIPKEY( nKey ) ) : 0; } static void flush_gpmevt( PHB_GTTRM pTerm ) @@ -1150,11 +1013,12 @@ static void mouse_init( PHB_GTTRM pTerm ) if( pTerm->terminal_type == TERM_LINUX ) { pTerm->Conn.eventMask = - GPM_MOVE | GPM_DRAG | GPM_UP | GPM_DOWN | GPM_DOUBLE; + GPM_MOVE | GPM_DRAG | GPM_UP | GPM_DOWN | GPM_SINGLE | GPM_DOUBLE; /* give me move events but handle them anyway */ pTerm->Conn.defaultMask = GPM_MOVE | GPM_HARD; - /* only pure mouse events, no Ctrl,Alt,Shft events */ - pTerm->Conn.minMod = pTerm->Conn.maxMod = 0; + /* report Ctrl,Alt,Shft events */ + pTerm->Conn.minMod = 0; + pTerm->Conn.maxMod = ( ( 1 << KG_SHIFT ) | ( 1 << KG_CTRL ) | ( 1 << KG_ALT ) ); gpm_zerobased = 1; gpm_visiblepointer = 0; if( Gpm_Open( &pTerm->Conn, 0 ) >= 0 && gpm_fd >= 0 ) @@ -1303,7 +1167,7 @@ static int get_inch( PHB_GTTRM pTerm, int milisec ) else { pTerm->event_fds[ i ]->status = EVTFDSTAT_RUN; - if( IS_CLIPKEY( n ) ) + if( IS_CLIPKEY( n ) || HB_INKEY_ISEXT( n ) ) { nRet = n; npfd = pTerm->event_fds[ i ]->fd; @@ -1346,9 +1210,9 @@ static int test_bufch( PHB_GTTRM pTerm, int n, int delay ) if( pTerm->stdin_inbuf == n ) nKey = get_inch( pTerm, delay ); - return IS_CLIPKEY( nKey ) ? nKey : - ( pTerm->stdin_inbuf > n ) ? - pTerm->stdin_buf[( pTerm->stdin_ptr_l + n ) % STDIN_BUFLEN] : -1; + return ( IS_CLIPKEY( nKey ) || HB_INKEY_ISEXT( nKey ) ) ? nKey : + ( pTerm->stdin_inbuf > n ? + pTerm->stdin_buf[( pTerm->stdin_ptr_l + n ) % STDIN_BUFLEN] : -1 ); } static void free_bufch( PHB_GTTRM pTerm, int n ) @@ -1399,7 +1263,10 @@ again: nKey = ch; ptr = pTerm->pKeyTab; if( i == 1 && nKey == K_ESC && esc == 0 ) + { + nKey = EXKEY_ESC; esc = 1; + } while( ch >= 0 && ch <= 255 && ptr != NULL ) { if( ptr->ch == ch ) @@ -1448,8 +1315,10 @@ again: if( ch == -1 && pTerm->nTermMouseChars ) pTerm->nTermMouseChars = 0; - if( ch != -1 && IS_CLIPKEY( ch ) ) + if( IS_CLIPKEY( ch ) ) nKey = GET_CLIPKEY( ch ); + else if( HB_INKEY_ISEXT( ch ) ) + nKey = ch; else { if( esc == 1 && n == 0 && ( ch != -1 || i >= 2 ) ) @@ -1464,19 +1333,27 @@ again: if( nKey != 0 ) pTerm->key_flag |= KEY_ALTMASK; else - nKey = K_ESC; + nKey = EXKEY_ESC; if( n == 1 && i > 1 ) n = 2; } - else if( n == 0 && i > 0 ) - n = 1; + else + { + if( nKey != 0 && ( pTerm->key_flag & KEY_CTRLMASK ) != 0 && + ( pTerm->key_flag & KEY_ALTMASK ) != 0 ) + { + pTerm->key_flag &= ~( KEY_CTRLMASK | KEY_ALTMASK ); + pTerm->key_flag |= KEY_SHIFTMASK; + } + if( n == 0 && i > 0 ) + n = 1; + } if( n > 0 ) free_bufch( pTerm, n ); if( pTerm->key_flag != 0 && nKey != 0 ) { - nKey |= pTerm->key_flag; pTerm->key_flag = 0; } @@ -1493,7 +1370,6 @@ again: } else if( nKey >= 32 && nKey <= 255 ) { - /* hb_cdpUTF8ToU16NextChar( HB_UCHAR ucChar, int * n, HB_WCHAR * pwc ) */ HB_WCHAR wc = 0; n = i = 0; if( hb_cdpUTF8ToU16NextChar( ( HB_UCHAR ) nKey, &n, &wc ) ) @@ -2499,18 +2375,18 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_F11, "\033[23~" }, /* kf11 */ { EXKEY_F12, "\033[24~" }, /* kf12 */ - { EXKEY_F1 |KEY_CTRLMASK|KEY_ALTMASK, "\033[25~" }, /* kf13 */ - { EXKEY_F2 |KEY_CTRLMASK|KEY_ALTMASK, "\033[26~" }, /* kf14 */ - { EXKEY_F3 |KEY_CTRLMASK|KEY_ALTMASK, "\033[28~" }, /* kf15 */ - { EXKEY_F4 |KEY_CTRLMASK|KEY_ALTMASK, "\033[29~" }, /* kf16 */ - { EXKEY_F5 |KEY_CTRLMASK|KEY_ALTMASK, "\033[31~" }, /* kf17 */ - { EXKEY_F6 |KEY_CTRLMASK|KEY_ALTMASK, "\033[32~" }, /* kf18 */ - { EXKEY_F7 |KEY_CTRLMASK|KEY_ALTMASK, "\033[33~" }, /* kf19 */ - { EXKEY_F8 |KEY_CTRLMASK|KEY_ALTMASK, "\033[34~" }, /* kf20 */ - { EXKEY_F9 |KEY_CTRLMASK|KEY_ALTMASK, "\033[35~" }, /* kf21 */ - { EXKEY_F10|KEY_CTRLMASK|KEY_ALTMASK, "\033[36~" }, /* kf22 */ - { EXKEY_F11|KEY_CTRLMASK|KEY_ALTMASK, "\033[37~" }, /* kf23 */ - { EXKEY_F12|KEY_CTRLMASK|KEY_ALTMASK, "\033[38~" }, /* kf24 */ + { EXKEY_F1 |KEY_SHIFTMASK, "\033[25~" }, /* kf13 */ + { EXKEY_F2 |KEY_SHIFTMASK, "\033[26~" }, /* kf14 */ + { EXKEY_F3 |KEY_SHIFTMASK, "\033[28~" }, /* kf15 */ + { EXKEY_F4 |KEY_SHIFTMASK, "\033[29~" }, /* kf16 */ + { EXKEY_F5 |KEY_SHIFTMASK, "\033[31~" }, /* kf17 */ + { EXKEY_F6 |KEY_SHIFTMASK, "\033[32~" }, /* kf18 */ + { EXKEY_F7 |KEY_SHIFTMASK, "\033[33~" }, /* kf19 */ + { EXKEY_F8 |KEY_SHIFTMASK, "\033[34~" }, /* kf20 */ + { EXKEY_F9 |KEY_SHIFTMASK, "\033[35~" }, /* kf21 */ + { EXKEY_F10|KEY_SHIFTMASK, "\033[36~" }, /* kf22 */ + { EXKEY_F11|KEY_SHIFTMASK, "\033[37~" }, /* kf23 */ + { EXKEY_F12|KEY_SHIFTMASK, "\033[38~" }, /* kf24 */ { EXKEY_F1 |KEY_CTRLMASK, "\033[39~" }, /* kf25 */ { EXKEY_F2 |KEY_CTRLMASK, "\033[40~" }, /* kf26 */ @@ -2643,40 +2519,40 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_PGUP |KEY_ALTMASK, "\033[5;3~" }, { EXKEY_PGDN |KEY_ALTMASK, "\033[6;3~" }, - { EXKEY_F1 |KEY_CTRLMASK|KEY_ALTMASK, "\033O2P" }, - { EXKEY_F2 |KEY_CTRLMASK|KEY_ALTMASK, "\033O2Q" }, - { EXKEY_F3 |KEY_CTRLMASK|KEY_ALTMASK, "\033O2R" }, - { EXKEY_F4 |KEY_CTRLMASK|KEY_ALTMASK, "\033O2S" }, + { EXKEY_F1 |KEY_SHIFTMASK, "\033O2P" }, + { EXKEY_F2 |KEY_SHIFTMASK, "\033O2Q" }, + { EXKEY_F3 |KEY_SHIFTMASK, "\033O2R" }, + { EXKEY_F4 |KEY_SHIFTMASK, "\033O2S" }, - { EXKEY_F1 |KEY_CTRLMASK|KEY_ALTMASK, "\033O1;2P" }, - { EXKEY_F2 |KEY_CTRLMASK|KEY_ALTMASK, "\033O1;2Q" }, - { EXKEY_F3 |KEY_CTRLMASK|KEY_ALTMASK, "\033O1;2R" }, - { EXKEY_F4 |KEY_CTRLMASK|KEY_ALTMASK, "\033O1;2S" }, + { EXKEY_F1 |KEY_SHIFTMASK, "\033O1;2P" }, + { EXKEY_F2 |KEY_SHIFTMASK, "\033O1;2Q" }, + { EXKEY_F3 |KEY_SHIFTMASK, "\033O1;2R" }, + { EXKEY_F4 |KEY_SHIFTMASK, "\033O1;2S" }, - { EXKEY_F1 |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2P" }, - { EXKEY_F2 |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2Q" }, - { EXKEY_F3 |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2R" }, - { EXKEY_F4 |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2S" }, + { EXKEY_F1 |KEY_SHIFTMASK, "\033[1;2P" }, + { EXKEY_F2 |KEY_SHIFTMASK, "\033[1;2Q" }, + { EXKEY_F3 |KEY_SHIFTMASK, "\033[1;2R" }, + { EXKEY_F4 |KEY_SHIFTMASK, "\033[1;2S" }, - { EXKEY_F1 |KEY_CTRLMASK|KEY_ALTMASK, "\033[11;2~" }, - { EXKEY_F2 |KEY_CTRLMASK|KEY_ALTMASK, "\033[12;2~" }, - { EXKEY_F3 |KEY_CTRLMASK|KEY_ALTMASK, "\033[13;2~" }, - { EXKEY_F4 |KEY_CTRLMASK|KEY_ALTMASK, "\033[14;2~" }, - { EXKEY_F5 |KEY_CTRLMASK|KEY_ALTMASK, "\033[15;2~" }, - { EXKEY_F6 |KEY_CTRLMASK|KEY_ALTMASK, "\033[17;2~" }, - { EXKEY_F7 |KEY_CTRLMASK|KEY_ALTMASK, "\033[18;2~" }, - { EXKEY_F8 |KEY_CTRLMASK|KEY_ALTMASK, "\033[19;2~" }, - { EXKEY_F9 |KEY_CTRLMASK|KEY_ALTMASK, "\033[20;2~" }, - { EXKEY_F10|KEY_CTRLMASK|KEY_ALTMASK, "\033[21;2~" }, - { EXKEY_F11|KEY_CTRLMASK|KEY_ALTMASK, "\033[23;2~" }, - { EXKEY_F12|KEY_CTRLMASK|KEY_ALTMASK, "\033[24;2~" }, + { EXKEY_F1 |KEY_SHIFTMASK, "\033[11;2~" }, + { EXKEY_F2 |KEY_SHIFTMASK, "\033[12;2~" }, + { EXKEY_F3 |KEY_SHIFTMASK, "\033[13;2~" }, + { EXKEY_F4 |KEY_SHIFTMASK, "\033[14;2~" }, + { EXKEY_F5 |KEY_SHIFTMASK, "\033[15;2~" }, + { EXKEY_F6 |KEY_SHIFTMASK, "\033[17;2~" }, + { EXKEY_F7 |KEY_SHIFTMASK, "\033[18;2~" }, + { EXKEY_F8 |KEY_SHIFTMASK, "\033[19;2~" }, + { EXKEY_F9 |KEY_SHIFTMASK, "\033[20;2~" }, + { EXKEY_F10|KEY_SHIFTMASK, "\033[21;2~" }, + { EXKEY_F11|KEY_SHIFTMASK, "\033[23;2~" }, + { EXKEY_F12|KEY_SHIFTMASK, "\033[24;2~" }, - { EXKEY_HOME |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2~" }, - { EXKEY_INS |KEY_CTRLMASK|KEY_ALTMASK, "\033[2;2~" }, - { EXKEY_DEL |KEY_CTRLMASK|KEY_ALTMASK, "\033[3;2~" }, - { EXKEY_END |KEY_CTRLMASK|KEY_ALTMASK, "\033[4;2~" }, - { EXKEY_PGUP |KEY_CTRLMASK|KEY_ALTMASK, "\033[5;2~" }, - { EXKEY_PGDN |KEY_CTRLMASK|KEY_ALTMASK, "\033[6;2~" }, + { EXKEY_HOME |KEY_SHIFTMASK, "\033[1;2~" }, + { EXKEY_INS |KEY_SHIFTMASK, "\033[2;2~" }, + { EXKEY_DEL |KEY_SHIFTMASK, "\033[3;2~" }, + { EXKEY_END |KEY_SHIFTMASK, "\033[4;2~" }, + { EXKEY_PGUP |KEY_SHIFTMASK, "\033[5;2~" }, + { EXKEY_PGDN |KEY_SHIFTMASK, "\033[6;2~" }, { EXKEY_BS |KEY_ALTMASK, "\033\010" }, @@ -2708,7 +2584,7 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_CENTER, "\033[G" }, /* PuTTY */ { EXKEY_HOME , "\033[H" }, /* XTerm */ - { EXKEY_TAB |KEY_CTRLMASK|KEY_ALTMASK, "\033[Z" }, /* kcbt, XTerm */ + { EXKEY_TAB |KEY_SHIFTMASK, "\033[Z" }, /* kcbt, XTerm */ /* XTerm with modifiers */ { EXKEY_UP |KEY_CTRLMASK, "\033[1;5A" }, @@ -2727,16 +2603,16 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_END |KEY_ALTMASK, "\033[1;3F" }, { EXKEY_HOME |KEY_ALTMASK, "\033[1;3H" }, - { EXKEY_UP |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2A" }, - { EXKEY_DOWN |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2B" }, - { EXKEY_RIGHT |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2C" }, - { EXKEY_LEFT |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2D" }, - { EXKEY_CENTER|KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2E" }, - { EXKEY_END |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2F" }, - { EXKEY_HOME |KEY_CTRLMASK|KEY_ALTMASK, "\033[1;2H" }, + { 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_CTRLMASK|KEY_ALTMASK, "\033OM" }, + { EXKEY_ENTER |KEY_SHIFTMASK, "\033OM" }, { EXKEY_END, "\033Ow" }, /* rxvt */ @@ -2761,34 +2637,34 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_END |KEY_ALTMASK, "\033[3F" }, /* --- */ { EXKEY_HOME |KEY_ALTMASK, "\033[3H" }, /* --- */ - { EXKEY_UP |KEY_CTRLMASK|KEY_ALTMASK, "\033[2A" }, - { EXKEY_DOWN |KEY_CTRLMASK|KEY_ALTMASK, "\033[2B" }, - { EXKEY_RIGHT |KEY_CTRLMASK|KEY_ALTMASK, "\033[2C" }, - { EXKEY_LEFT |KEY_CTRLMASK|KEY_ALTMASK, "\033[2D" }, - { EXKEY_CENTER|KEY_CTRLMASK|KEY_ALTMASK, "\033[2E" }, /* --- */ - { EXKEY_END |KEY_CTRLMASK|KEY_ALTMASK, "\033[2F" }, /* --- */ - { EXKEY_HOME |KEY_CTRLMASK|KEY_ALTMASK, "\033[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_HOME |KEY_SHIFTMASK, "\033[2H" }, /* --- */ #if 0 /* key added for gnome-terminal and teraterm */ { EXKEY_ENTER |KEY_CTRLMASK, "\033[7;5~" }, { EXKEY_TAB |KEY_CTRLMASK, "\033[8;5~" }, - { EXKEY_UP |KEY_CTRLMASK|KEY_ALTMASK, "\033[6A" }, - { EXKEY_DOWN |KEY_CTRLMASK|KEY_ALTMASK, "\033[6B" }, - { EXKEY_RIGHT |KEY_CTRLMASK|KEY_ALTMASK, "\033[6C" }, - { EXKEY_LEFT |KEY_CTRLMASK|KEY_ALTMASK, "\033[6D" }, - { EXKEY_CENTER|KEY_CTRLMASK|KEY_ALTMASK, "\033[6E" }, - { EXKEY_END |KEY_CTRLMASK|KEY_ALTMASK, "\033[6F" }, - { EXKEY_HOME |KEY_CTRLMASK|KEY_ALTMASK, "\033[6H" }, + { EXKEY_UP |KEY_SHIFTMASK, "\033[6A" }, + { EXKEY_DOWN |KEY_SHIFTMASK, "\033[6B" }, + { EXKEY_RIGHT |KEY_SHIFTMASK, "\033[6C" }, + { EXKEY_LEFT |KEY_SHIFTMASK, "\033[6D" }, + { EXKEY_CENTER|KEY_SHIFTMASK, "\033[6E" }, + { EXKEY_END |KEY_SHIFTMASK, "\033[6F" }, + { EXKEY_HOME |KEY_SHIFTMASK, "\033[6H" }, - { EXKEY_INS |KEY_CTRLMASK|KEY_ALTMASK, "\033[2;6~" }, - { EXKEY_DEL |KEY_CTRLMASK|KEY_ALTMASK, "\033[3;6~" }, - { EXKEY_PGUP |KEY_CTRLMASK|KEY_ALTMASK, "\033[5;6~" }, - { EXKEY_PGDN |KEY_CTRLMASK|KEY_ALTMASK, "\033[6;6~" }, - { EXKEY_ENTER |KEY_CTRLMASK|KEY_ALTMASK, "\033[7;6~" }, + { EXKEY_INS |KEY_SHIFTMASK, "\033[2;6~" }, + { EXKEY_DEL |KEY_SHIFTMASK, "\033[3;6~" }, + { EXKEY_PGUP |KEY_SHIFTMASK, "\033[5;6~" }, + { EXKEY_PGDN |KEY_SHIFTMASK, "\033[6;6~" }, + { EXKEY_ENTER |KEY_SHIFTMASK, "\033[7;6~" }, - { EXKEY_BS |KEY_CTRLMASK|KEY_ALTMASK, "\033[W" }, + { EXKEY_BS |KEY_SHIFTMASK, "\033[W" }, #endif { 0, NULL } }; @@ -2844,18 +2720,18 @@ static void init_keys( PHB_GTTRM pTerm ) { EXKEY_F11, "\033[W" }, /* kf11 */ { EXKEY_F12, "\033[X" }, /* kf12 */ - { EXKEY_F1 |KEY_CTRLMASK|KEY_ALTMASK, "\033[Y" }, /* kf13 */ - { EXKEY_F2 |KEY_CTRLMASK|KEY_ALTMASK, "\033[Z" }, /* kf14 */ - { EXKEY_F3 |KEY_CTRLMASK|KEY_ALTMASK, "\033[a" }, /* kf15 */ - { EXKEY_F4 |KEY_CTRLMASK|KEY_ALTMASK, "\033[b" }, /* kf16 */ - { EXKEY_F5 |KEY_CTRLMASK|KEY_ALTMASK, "\033[c" }, /* kf17 */ - { EXKEY_F6 |KEY_CTRLMASK|KEY_ALTMASK, "\033[d" }, /* kf18 */ - { EXKEY_F7 |KEY_CTRLMASK|KEY_ALTMASK, "\033[e" }, /* kf19 */ - { EXKEY_F8 |KEY_CTRLMASK|KEY_ALTMASK, "\033[f" }, /* kf20 */ - { EXKEY_F9 |KEY_CTRLMASK|KEY_ALTMASK, "\033[g" }, /* kf21 */ - { EXKEY_F10|KEY_CTRLMASK|KEY_ALTMASK, "\033[h" }, /* kf22 */ - { EXKEY_F11|KEY_CTRLMASK|KEY_ALTMASK, "\033[i" }, /* kf23 */ - { EXKEY_F12|KEY_CTRLMASK|KEY_ALTMASK, "\033[j" }, /* kf24 */ + { EXKEY_F1 |KEY_SHIFTMASK, "\033[Y" }, /* kf13 */ + { EXKEY_F2 |KEY_SHIFTMASK, "\033[Z" }, /* kf14 */ + { EXKEY_F3 |KEY_SHIFTMASK, "\033[a" }, /* kf15 */ + { EXKEY_F4 |KEY_SHIFTMASK, "\033[b" }, /* kf16 */ + { EXKEY_F5 |KEY_SHIFTMASK, "\033[c" }, /* kf17 */ + { EXKEY_F6 |KEY_SHIFTMASK, "\033[d" }, /* kf18 */ + { EXKEY_F7 |KEY_SHIFTMASK, "\033[e" }, /* kf19 */ + { EXKEY_F8 |KEY_SHIFTMASK, "\033[f" }, /* kf20 */ + { EXKEY_F9 |KEY_SHIFTMASK, "\033[g" }, /* kf21 */ + { EXKEY_F10|KEY_SHIFTMASK, "\033[h" }, /* kf22 */ + { EXKEY_F11|KEY_SHIFTMASK, "\033[i" }, /* kf23 */ + { EXKEY_F12|KEY_SHIFTMASK, "\033[j" }, /* kf24 */ { EXKEY_F1 |KEY_CTRLMASK, "\033[k" }, /* kf25 */ { EXKEY_F2 |KEY_CTRLMASK, "\033[l" }, /* kf26 */ @@ -2887,7 +2763,7 @@ static void init_keys( PHB_GTTRM pTerm ) static const keySeq bsdConsKeySeq[] = { - { EXKEY_TAB |KEY_CTRLMASK|KEY_ALTMASK, "\033[Z" }, /* SHIFT+TAB */ + { EXKEY_TAB |KEY_SHIFTMASK, "\033[Z" }, /* SHIFT+TAB */ { 0, NULL } }; @@ -2995,18 +2871,18 @@ static void init_keys( PHB_GTTRM pTerm ) addKeyMap( pTerm, EXKEY_F12, tiGetS( "kf12" ) ); /* shifted function keys */ - addKeyMap( pTerm, EXKEY_F1 |KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf13" ) ); - addKeyMap( pTerm, EXKEY_F2 |KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf14" ) ); - addKeyMap( pTerm, EXKEY_F3 |KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf15" ) ); - addKeyMap( pTerm, EXKEY_F4 |KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf16" ) ); - addKeyMap( pTerm, EXKEY_F5 |KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf17" ) ); - addKeyMap( pTerm, EXKEY_F6 |KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf18" ) ); - addKeyMap( pTerm, EXKEY_F7 |KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf19" ) ); - addKeyMap( pTerm, EXKEY_F8 |KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf20" ) ); - addKeyMap( pTerm, EXKEY_F9 |KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf21" ) ); - addKeyMap( pTerm, EXKEY_F10|KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf22" ) ); - addKeyMap( pTerm, EXKEY_F11|KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf23" ) ); - addKeyMap( pTerm, EXKEY_F12|KEY_CTRLMASK|KEY_ALTMASK, tiGetS( "kf24" ) ); + addKeyMap( pTerm, EXKEY_F1 |KEY_SHIFTMASK, tiGetS( "kf13" ) ); + addKeyMap( pTerm, EXKEY_F2 |KEY_SHIFTMASK, tiGetS( "kf14" ) ); + addKeyMap( pTerm, EXKEY_F3 |KEY_SHIFTMASK, tiGetS( "kf15" ) ); + addKeyMap( pTerm, EXKEY_F4 |KEY_SHIFTMASK, tiGetS( "kf16" ) ); + addKeyMap( pTerm, EXKEY_F5 |KEY_SHIFTMASK, tiGetS( "kf17" ) ); + addKeyMap( pTerm, EXKEY_F6 |KEY_SHIFTMASK, tiGetS( "kf18" ) ); + addKeyMap( pTerm, EXKEY_F7 |KEY_SHIFTMASK, tiGetS( "kf19" ) ); + addKeyMap( pTerm, EXKEY_F8 |KEY_SHIFTMASK, tiGetS( "kf20" ) ); + addKeyMap( pTerm, EXKEY_F9 |KEY_SHIFTMASK, tiGetS( "kf21" ) ); + addKeyMap( pTerm, EXKEY_F10|KEY_SHIFTMASK, tiGetS( "kf22" ) ); + addKeyMap( pTerm, EXKEY_F11|KEY_SHIFTMASK, tiGetS( "kf23" ) ); + addKeyMap( pTerm, EXKEY_F12|KEY_SHIFTMASK, tiGetS( "kf24" ) ); #endif } @@ -3745,6 +3621,11 @@ static HB_BOOL hb_gt_trm_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) pTerm->esc_delay = hb_itemGetNI( pInfo->pNewVal ); break; + case HB_GTI_KBDSHIFTS: + pInfo->pResult = hb_itemPutNI( pInfo->pResult, + hb_gt_trm_getKbdState( pTerm ) ); + break; + case HB_GTI_DELKEYMAP: szVal = hb_itemGetCPtr( pInfo->pNewVal ); if( szVal && *szVal ) @@ -3757,7 +3638,8 @@ static HB_BOOL hb_gt_trm_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) iVal = hb_arrayGetNI( pInfo->pNewVal, 1 ); szVal = hb_arrayGetCPtr( pInfo->pNewVal, 2 ); if( iVal && szVal && *szVal ) - addKeyMap( pTerm, SET_CLIPKEY( iVal ), szVal ); + addKeyMap( pTerm, HB_INKEY_ISEXT( iVal ) ? + iVal : SET_CLIPKEY( iVal ), szVal ); } break; diff --git a/src/rtl/gtwvt/gtwvt.c b/src/rtl/gtwvt/gtwvt.c index 794182f33a..71da7104fb 100644 --- a/src/rtl/gtwvt/gtwvt.c +++ b/src/rtl/gtwvt/gtwvt.c @@ -159,6 +159,7 @@ static const int K_Ctrl[] = static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); static HB_BOOL hb_gt_wvt_FullScreen( PHB_GT pGT ); +static void hb_gt_wvt_ResetBoxCharBitmaps( PHB_GTWVT pWVT ); static void hb_gt_wvt_RegisterClass( HINSTANCE hInstance ) { @@ -265,6 +266,15 @@ static void hb_gt_wvt_Free( PHB_GTWVT pWVT ) #else if( pWVT->wcTrans ) hb_itemFreeC( ( char * ) pWVT->wcTrans ); + + hb_gt_wvt_ResetBoxCharBitmaps( pWVT ); + + if( pWVT->hBmpDC ) + DeleteDC( pWVT->hBmpDC ); + if( pWVT->hPen ) + DeleteObject( pWVT->hPen ); + if( pWVT->hBrush ) + DeleteObject( pWVT->hBrush ); #endif if( pWVT->hFont ) DeleteObject( pWVT->hFont ); @@ -340,11 +350,10 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT, HINSTANCE hInstance, int iCmdShow ) pWVT->CaretWidth = 0; pWVT->MousePos.x = 0; pWVT->MousePos.y = 0; - pWVT->MouseMove = HB_TRUE; pWVT->hWnd = NULL; pWVT->keyPointerIn = 0; pWVT->keyPointerOut = 0; - pWVT->keyLast = 0; + pWVT->keyLastPos = 0; pWVT->CentreWindow = HB_TRUE; /* Default is to always display window in centre of screen */ pWVT->CodePage = OEM_CHARSET; /* GetACP(); - set code page to default system */ @@ -356,7 +365,6 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT, HINSTANCE hInstance, int iCmdShow ) #endif pWVT->Win9X = hb_iswin9x(); - pWVT->AltF4Close = HB_FALSE; pWVT->IgnoreWM_SYSCHAR = HB_FALSE; @@ -396,6 +404,1101 @@ static PHB_GTWVT hb_gt_wvt_New( PHB_GT pGT, HINSTANCE hInstance, int iCmdShow ) return pWVT; } +#if defined( UNICODE ) + +#define hb_bm_line( x1, y1, x2, y2 ) do { \ + MoveToEx( pWVT->hBmpDC, x1, y1, NULL ); \ + LineTo( pWVT->hBmpDC, x2, y2 ); \ + SetPixel( pWVT->hBmpDC, x2, y2, pWVT->COLORS[ 0 ] ); \ + } while( 0 ) +#define hb_bm_point( x, y ) SetPixel( pWVT->hBmpDC, x, y, pWVT->COLORS[ 0 ] ) +#define hb_bm_rect( x, y, w, h ) Rectangle( pWVT->hBmpDC, x, y, (x)+(w), (y)+(h) ) +#define hb_bm_polygon( pts, n ) Polygon( pWVT->hBmpDC, pts, n ) +#define hb_bm_invertrect( x, y, w, h ) do { \ + SetRect( &rc, 0, 0, cellx, celly ); \ + InvertRect( pWVT->hBmpDC, &rc ); \ + } while( 0 ) +#define hb_bm_text( ch ) do { \ + SetTextAlign( pWVT->hBmpDC, TA_LEFT ); \ + SetRect( &rc, 0, 0, cellx, celly ); \ + ExtTextOut( pWVT->hBmpDC, 0, 0, ETO_CLIPPED | ETO_OPAQUE, &rc, \ + ch, 1, pWVT->FixedFont ? NULL : pWVT->FixedSize ); \ + } while( 0 ) + +static HBITMAP hb_gt_wvt_bitmap_char( PHB_GTWVT pWVT, int cellx, int celly ) +{ + HBITMAP hBitMap = CreateBitmap( cellx + 1, celly + 1, 1, 1, NULL ); + HBRUSH hBrush; + RECT rc; + + if( !pWVT->hBmpDC ) + { + HDC hdc = GetDC( pWVT->hWnd ); + pWVT->hBmpDC = CreateCompatibleDC( hdc ); + ReleaseDC( pWVT->hWnd, hdc ); + } + + SelectObject( pWVT->hBmpDC, hBitMap ); + + rc.left = 0; + rc.top = 0; + rc.right = cellx + 1; + rc.bottom = celly + 1; + hBrush = CreateSolidBrush( GetBkColor( pWVT->hBmpDC ) ); + FillRect( pWVT->hBmpDC, &rc, hBrush ); + DeleteObject( hBrush ); + + if( !pWVT->hPen ) + { + pWVT->hPen = CreatePen( PS_SOLID, 0, pWVT->COLORS[ 0 ] ); + SelectObject( pWVT->hBmpDC, pWVT->hPen ); + } + + if( !pWVT->hBrush ) + { + pWVT->hBrush = CreateSolidBrush( pWVT->COLORS[ 0 ] ); + SelectObject( pWVT->hBmpDC, pWVT->hBrush ); + } + + SelectObject( pWVT->hBmpDC, pWVT->hFont ); + + return hBitMap; +} + +static HBITMAP hb_gt_wvt_DefineBoxButtonL( PHB_GTWVT pWVT, int cellx, int celly ) +{ + HBITMAP hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + MoveToEx( pWVT->hBmpDC, cellx - 1, 0, NULL ); + LineTo( pWVT->hBmpDC, 0, 0 ); + LineTo( pWVT->hBmpDC, 0, celly - 1 ); + LineTo( pWVT->hBmpDC, cellx, celly - 1 ); + + MoveToEx( pWVT->hBmpDC, 2, celly - 2, NULL ); + LineTo( pWVT->hBmpDC, cellx, celly - 2 ); + + return hBitMap; +} + +static HBITMAP hb_gt_wvt_DefineBoxButtonR( PHB_GTWVT pWVT, int cellx, int celly ) +{ + HBITMAP hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + MoveToEx( pWVT->hBmpDC, 0, 0, NULL ); + LineTo( pWVT->hBmpDC, cellx - 1, 0 ); + LineTo( pWVT->hBmpDC, cellx - 1, celly - 1 ); + LineTo( pWVT->hBmpDC, -1, celly - 1 ); + + MoveToEx( pWVT->hBmpDC, cellx - 2, 3, NULL ); + LineTo( pWVT->hBmpDC, cellx - 2, celly - 2 ); + LineTo( pWVT->hBmpDC, -1, celly - 2 ); + + return hBitMap; +} + +static HBITMAP hb_gt_wvt_DefineBoxChar( PHB_GTWVT pWVT, HB_USHORT usCh ) +{ + HBITMAP hBitMap = NULL; + int cellx = pWVT->PTEXTSIZE.x; + int celly = pWVT->PTEXTSIZE.y; + int i, y, x, yy, xx, skip, start, mod; + POINT pts[ 3 ]; + RECT rc; + + if( usCh >= HB_BOXCH_RC_MIN && usCh <= HB_BOXCH_RC_MAX ) + switch( usCh ) + { + case HB_BOXCH_RC_ARROW_DL: + hBitMap = hb_gt_wvt_DefineBoxButtonL( pWVT, cellx, celly ); + yy = celly / 2 - 1; + for( y = celly - 4, x = cellx - 1; x >= 3 && y >= yy; --x, --y ) + hb_bm_line( x, y, cellx - 1, y ); + xx = HB_MAX( cellx * 2 / 5, 3 ) | 1; + for( x = cellx - xx / 2 - 1; y >= 3; --y ) + hb_bm_line( x, y, cellx - 1, y ); + break; + + case HB_BOXCH_RC_ARROW_DR: + hBitMap = hb_gt_wvt_DefineBoxButtonR( pWVT, cellx, celly ); + yy = ( celly + 1 ) / 2; + for( y = celly - 5, x = 0; x < cellx - 4 && y >= yy; ++x, --y ) + hb_bm_line( 0, y, x, y ); + xx = HB_MAX( cellx * 2 / 5, 3 ) | 1; + for( x = xx / 2 - 1; y >= 3; --y ) + hb_bm_line( 0, y, x, y ); + break; + + case HB_BOXCH_RC_ARROW_UL: + hBitMap = hb_gt_wvt_DefineBoxButtonL( pWVT, cellx, celly ); + yy = ( celly + 1 ) / 2; + for( y = 3, x = cellx - 1; x >= 3 && y <= yy; --x, ++y ) + hb_bm_line( x, y, cellx - 1, y ); + xx = HB_MAX( cellx * 2 / 5, 3 ) | 1; + for( x = cellx - xx / 2 - 1; y < celly - 3; ++y ) + hb_bm_line( x, y, cellx - 1, y ); + break; + + case HB_BOXCH_RC_ARROW_UR: + hBitMap = hb_gt_wvt_DefineBoxButtonR( pWVT, cellx, celly ); + yy = ( celly + 1 ) / 2; + for( y = 4, x = 0; x < cellx - 4 && y <= yy; ++x, ++y ) + hb_bm_line( 0, y, x, y ); + xx = HB_MAX( cellx * 2 / 5, 3 ) | 1; + for( x = xx / 2 - 1; y < celly - 3; ++y ) + hb_bm_line( 0, y, x, y ); + break; + + case HB_BOXCH_RC_ARROW_VL: + hBitMap = hb_gt_wvt_DefineBoxButtonL( pWVT, cellx, celly ); + yy = ( celly - 1 ) / 2; + for( y = 3, x = cellx - 1; x >= 3 && y < yy; --x, ++y ) + hb_bm_line( x, y, cellx - 1, y ); + for( y = yy + 2, ++x; x <= cellx - 1 && y < celly - 3; ++x, ++y ) + hb_bm_line( x, y, cellx - 1, y ); + break; + + case HB_BOXCH_RC_ARROW_VR: + hBitMap = hb_gt_wvt_DefineBoxButtonR( pWVT, cellx, celly ); + yy = ( celly - 1 ) / 2; + for( y = 4, x = 0; x < cellx - 4 && y < yy; ++x, ++y ) + hb_bm_line( 0, y, x, y ); + for( y = yy + 2, --x; x >= 0 && y < celly - 3; --x, ++y ) + hb_bm_line( 0, y, x, y ); + break; + + case HB_BOXCH_RC_BUTTON_L: + hBitMap = hb_gt_wvt_DefineBoxButtonL( pWVT, cellx, celly ); + break; + + case HB_BOXCH_RC_BUTTON_R: + hBitMap = hb_gt_wvt_DefineBoxButtonR( pWVT, cellx, celly ); + break; + + case HB_BOXCH_RC_ARROW_LL: + hBitMap = hb_gt_wvt_DefineBoxButtonL( pWVT, cellx, celly ); + yy = ( celly - 1 ) / 2; + for( x = 3, y = 0; x < cellx; ++x, ++y ) + hb_bm_line( x, yy - y, x, yy + y ); + break; + + case HB_BOXCH_RC_ARROW_LR: + hBitMap = hb_gt_wvt_DefineBoxButtonR( pWVT, cellx, celly ); + yy = HB_MAX( celly / 5, 3 ) | 1; + for( y = ( celly - yy ) / 2; yy--; ++y ) + hb_bm_line( 0, y, cellx - 4, y ); + break; + + case HB_BOXCH_RC_ARROW_RL: + hBitMap = hb_gt_wvt_DefineBoxButtonL( pWVT, cellx, celly ); + yy = HB_MAX( celly / 5, 3 ) | 1; + for( y = ( celly - yy ) / 2; yy--; ++y ) + hb_bm_line( 3, y, cellx - 1, y ); + break; + + case HB_BOXCH_RC_ARROW_RR: + hBitMap = hb_gt_wvt_DefineBoxButtonR( pWVT, cellx, celly ); + yy = ( celly - 1 ) / 2; + for( x = cellx - 4, y = 0; x >= 0; --x, ++y ) + hb_bm_line( x, yy - y, x, yy + y ); + break; + + case HB_BOXCH_RC_ENTER1: + /* TODO */ + break; + case HB_BOXCH_RC_ENTER2: + /* TODO */ + break; + case HB_BOXCH_RC_ENTER3: + /* TODO */ + break; + + case HB_BOXCH_RC_VSCRL_LD: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, 0, 0, celly - 1 ); + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + hb_bm_line( 2, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + + for( y = celly / 2 + 1; y < celly; y++ ) + { + for( x = ( y & 1 ) + 2; x < cellx; x += 2 ) + hb_bm_point( x, y ); + } + break; + + case HB_BOXCH_RC_VSCRL_RD: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx - 1, 0, cellx - 1, celly - 1 ); + hb_bm_line( cellx - 2, 0, cellx - 2, celly / 2 - 1 ); + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + hb_bm_line( 0, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + + for( y = celly / 2 + 1; y < celly; y++ ) + { + for( x = ( y ^ cellx ) & 1; x < cellx - 2; x += 2 ) + hb_bm_point( x, y ); + } + break; + + case HB_BOXCH_RC_VSCRL_LU: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, 0, 0, celly - 1 ); + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + + for( y = 0; y < celly / 2; y++ ) + { + for( x = ( y & 1 ) + 2; x < cellx; x += 2 ) + hb_bm_point( x, y ); + } + break; + + case HB_BOXCH_RC_VSCRL_RU: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx - 1, 0, cellx - 1, celly - 1 ); + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + hb_bm_line( cellx - 2, celly / 2 + 3, cellx - 2, celly - 1 ); + + for( y = 0; y < celly / 2; y++ ) + { + for( x = ( y ^ cellx ) & 1; x < cellx - 2; x += 2 ) + hb_bm_point( x, y ); + } + break; + + case HB_BOXCH_RC_VSCRL_L: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, 0, 0, celly - 1 ); + + for( y = 0; y < celly; y++ ) + { + for( x = ( y & 1 ) + 2; x < cellx; x += 2 ) + hb_bm_point( x, y ); + } + break; + + case HB_BOXCH_RC_VSCRL_R: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx - 1, 0, cellx - 1, celly - 1 ); + + for( y = 0; y < celly; y++ ) + { + for( x = ( y ^ cellx ) & 1; x < cellx - 2; x += 2 ) + hb_bm_point( x, y ); + } + break; + + case HB_BOXCH_RC_HSCRL: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, 0, cellx - 1, 0 ); + hb_bm_line( 0, celly - 1, cellx - 1, celly - 1 ); + + for( y = 2; y < celly - 2; y++ ) + { + for( x = y & 1; x < cellx; x += 2 ) + hb_bm_point( x, y ); + } + break; + + case HB_BOXCH_RC_0: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "0" ) ); + break; + + case HB_BOXCH_RC_1: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "1" ) ); + break; + + case HB_BOXCH_RC_2: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "2" ) ); + break; + + case HB_BOXCH_RC_3: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "3" ) ); + break; + + case HB_BOXCH_RC_4: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "4" ) ); + break; + + case HB_BOXCH_RC_5: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "5" ) ); + break; + + case HB_BOXCH_RC_6: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "6" ) ); + break; + + case HB_BOXCH_RC_7: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "7" ) ); + break; + + case HB_BOXCH_RC_8: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "8" ) ); + break; + + case HB_BOXCH_RC_9: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "9" ) ); + break; + + case HB_BOXCH_RC_DOT: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "." ) ); + break; + + case HB_BOXCH_RC_ACC: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + hb_bm_text( TEXT( "'" ) ); + break; + + case HB_BOXCH_RC_BOX_ML: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + hb_bm_line( 0, 0, 0, celly - 1 ); + break; + + case HB_BOXCH_RC_BOX_MR: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + hb_bm_line( cellx - 1, 0, cellx - 1, celly - 1 ); + break; + + case HB_BOXCH_RC_HWND_L: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx - 1, 0, 0, 0 ); + hb_bm_line( 0, 0, 0, celly - 1 ); + hb_bm_line( 0, celly - 1, cellx - 1, celly - 1 ); + hb_bm_line( cellx - 1, celly / 4 + 2, cellx / 4 + 1, celly / 4 + 2 ); + hb_bm_line( cellx / 4 + 1, celly / 4 + 2, cellx / 4 + 1, celly - 4 - celly / 4 ); + hb_bm_line( cellx / 4 + 1, celly - 4 - celly / 4, cellx - 1, celly - 4 - celly / 4 ); + hb_bm_line( cellx / 4 + 2, celly - 3 - celly / 4, cellx - 1, celly - 3 - celly / 4 ); + break; + + case HB_BOXCH_RC_HWND_R: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, 0, cellx - 1, 0 ); + hb_bm_line( cellx - 1, 0, cellx - 1, celly - 1 ); + hb_bm_line( cellx - 1, celly - 1, 0, celly - 1 ); + hb_bm_line( 0, celly / 4 + 2, cellx - cellx / 4 - 2, celly / 4 + 2 ); + hb_bm_line( cellx - cellx / 4 - 2, celly / 4 + 2, cellx - cellx / 4 - 2, celly - 4 - celly / 4 ); + hb_bm_line( cellx - cellx / 4 - 2, celly - 4 - celly / 4, 0, celly - 4 - celly / 4 ); + hb_bm_line( 0, celly - 3 - celly / 4, cellx - cellx / 4 - 1, celly - 3 - celly / 4 ); + hb_bm_line( cellx - cellx / 4 - 1, celly - 3 - celly / 4, cellx - cellx / 4 - 1, celly / 4 + 2 ); + break; + + case HB_BOXCH_RC_BOX_TL: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, 0, cellx - 1, 0 ); + hb_bm_line( 0, 0, 0, celly - 1 ); + break; + + case HB_BOXCH_RC_BOX_T: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, 0, cellx - 1, 0 ); + break; + + case HB_BOXCH_RC_BOX_TR: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, 0, cellx - 1, 0 ); + hb_bm_line( cellx - 1, 0, cellx - 1, celly - 1 ); + break; + + case HB_BOXCH_RC_BOX_R: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx - 1, 0, cellx - 1, celly - 1 ); + break; + + case HB_BOXCH_RC_BOX_BR: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx - 1, 0, cellx - 1, celly - 1 ); + hb_bm_line( 0, celly - 1, cellx - 1, celly - 1 ); + break; + + case HB_BOXCH_RC_BOX_B: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly - 1, cellx - 1, celly - 1 ); + break; + + case HB_BOXCH_RC_BOX_BL: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, 0, 0, celly - 1 ); + hb_bm_line( 0, celly - 1, cellx - 1, celly - 1 ); + break; + + case HB_BOXCH_RC_BOX_L: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, 0, 0, celly - 1 ); + break; + + case HB_BOXCH_RC_BOX_MT: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly - 1 ); + hb_bm_line( 0, 0, cellx - 1, 0 ); + break; + + case HB_BOXCH_RC_BOX_MB: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly - 1 ); + hb_bm_line( 0, celly - 1, cellx - 1, celly - 1 ); + break; + + case HB_BOXCH_RC_BUTTON_CL: + hBitMap = hb_gt_wvt_DefineBoxButtonL( pWVT, cellx, celly ); + yy = celly - 2 / 3; + xx = cellx - 4; + if( yy > xx ) + yy = xx; + xx = ( xx * 2 + 1 ) / 3; + if( xx < 2 ) + xx = 2; + for( y = celly - yy - 3 - xx, i = 0; i < xx; ++y, ++i ) + hb_bm_line( 3, y, 3 + yy - 1, y + yy - 1 ); + y = celly - 5 - xx; + hb_bm_line( cellx - 1, y, cellx - 1, y + xx - 1 ); + break; + + case HB_BOXCH_RC_BUTTON_CR: + hBitMap = hb_gt_wvt_DefineBoxButtonR( pWVT, cellx, celly ); + yy = celly - 2 / 3; + xx = cellx - 4; + if( yy > xx ) + yy = xx; + xx = ( xx * 2 + 1 ) / 3; + if( xx < 2 ) + xx = 2; + for( y = celly - 6 - xx, i = 0; i < xx; ++y, ++i ) + hb_bm_line( 0, y, yy, y - yy ); + break; + + case HB_BOXCH_RC_FARROW_DL: + hBitMap = hb_gt_wvt_DefineBoxButtonL( pWVT, cellx, celly ); + yy = ( celly - cellx ) / 2 + 1; + yy = HB_MAX( yy, 2 ); + for( y = celly - yy - 1, x = cellx - 1; x >= 2 && y >= 3; --x, --y ) + hb_bm_line( x, y, cellx - 1, y ); + break; + + case HB_BOXCH_RC_FARROW_DR: + hBitMap = hb_gt_wvt_DefineBoxButtonR( pWVT, cellx, celly ); + yy = ( celly - cellx ) / 2 + 1; + yy = HB_MAX( yy, 2 ); + for( y = celly - yy - 2, x = 0; x < cellx - 3 && y >= 3; ++x, --y ) + hb_bm_line( 0, y, x, y ); + break; + + case HB_BOXCH_RC_DOTS: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + for( x = 1; x < cellx; x += 2 ) + hb_bm_point( x, celly / 2 ); + break; + + case HB_BOXCH_RC_DOTS_L: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + i = cellx / 2; + xx = i - i / 2; + yy = HB_MAX( 2, xx - 1 ); + + hb_bm_rect( cellx - xx / 2 - i, celly / 3 * 2, xx , yy ); + hb_bm_rect( cellx - xx / 2 , celly / 3 * 2, xx / 2, yy ); + break; + + case HB_BOXCH_RC_DOTS_R: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + i = cellx / 2; + xx = i - i / 2; + yy = HB_MAX( 2, xx - 1 ); + + hb_bm_rect( 0 , celly / 3 * 2, xx - xx / 2, yy ); + hb_bm_rect( i - xx / 2, celly / 3 * 2, xx , yy ); + break; + } + else + switch( usCh ) + { + case HB_BOXCH_FILLER1: + case HB_BOXCH_FILLER2: + case HB_BOXCH_FILLER3: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + if( usCh == HB_BOXCH_FILLER1 ) + { + skip = 4; + start = mod = 1; + } + else if( usCh == HB_BOXCH_FILLER2 ) + { + skip = 2; + start = 0; + mod = 1; + } + else + { + skip = 4; + start = mod = 0; + } + for( y = 0; y < celly; y++ ) + { + for( x = start + ( skip >> 1 ) * ( ( y & 1 ) ^ mod ); x < cellx; x += skip ) + hb_bm_point( x, y ); + } + if( usCh == HB_BOXCH_FILLER3 ) + hb_bm_invertrect( 0, 0, cellx, celly ); + break; + + case HB_BOXCH_ARROW_R: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + i = HB_MIN( ( celly >> 1 ), cellx ) - 3; + pts[ 0 ].x = ( ( cellx - i ) >> 1 ); + pts[ 0 ].y = ( celly >> 1 ) - i; + pts[ 1 ].x = pts[ 0 ].x + i; + pts[ 1 ].y = pts[ 0 ].y + i; + pts[ 2 ].x = pts[ 1 ].x - i; + pts[ 2 ].y = pts[ 1 ].y + i; + hb_bm_polygon( pts, 3 ); + break; + + case HB_BOXCH_ARROW_L: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + i = HB_MIN( ( celly >> 1 ), cellx ) - 3; + pts[ 0 ].x = ( ( cellx - i ) >> 1 ) + i; + pts[ 0 ].y = ( celly >> 1 ) - i; + pts[ 1 ].x = pts[ 0 ].x - i; + pts[ 1 ].y = pts[ 0 ].y + i; + pts[ 2 ].x = pts[ 1 ].x + i; + pts[ 2 ].y = pts[ 1 ].y + i; + hb_bm_polygon( pts, 3 ); + break; + + case HB_BOXCH_ARROW_U: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + i = HB_MIN( celly, cellx >> 1 ); + pts[ 0 ].x = ( cellx >> 1 ) - i; + pts[ 0 ].y = ( ( celly - i ) >> 1 ) + i; + pts[ 1 ].x = pts[ 0 ].x + i; + pts[ 1 ].y = pts[ 0 ].y - i; + pts[ 2 ].x = pts[ 1 ].x + i; + pts[ 2 ].y = pts[ 1 ].y + i; + hb_bm_polygon( pts, 3 ); + break; + + case HB_BOXCH_ARROW_D: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + i = HB_MIN( celly, cellx >> 1 ); + pts[ 0 ].x = ( cellx >> 1 ) - i; + pts[ 0 ].y = ( ( celly - i ) >> 1 ); + pts[ 1 ].x = pts[ 0 ].x + i; + pts[ 1 ].y = pts[ 0 ].y + i; + pts[ 2 ].x = pts[ 1 ].x + i; + pts[ 2 ].y = pts[ 1 ].y - i; + hb_bm_polygon( pts, 3 ); + break; + + case HB_BOXCH_FULL: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_rect( 0, 0, cellx, celly ); + break; + + case HB_BOXCH_FULL_B: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_rect( 0, celly / 2 + 1, cellx, ( celly + 1 ) / 2 ); + break; + + case HB_BOXCH_FULL_T: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_rect( 0, 0, cellx, celly / 2 ); + break; + + case HB_BOXCH_FULL_R: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_rect( cellx / 2 + 1, 0, ( cellx + 1 ) / 2, celly ); + break; + + case HB_BOXCH_FULL_L: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_rect( 0, 0, cellx / 2, celly ); + break; + + case HB_BOXCH_SNG_LT: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, celly - 1, cellx / 2, celly / 2 ); + hb_bm_line( cellx / 2, celly / 2, cellx - 1, celly / 2 ); + break; + + case HB_BOXCH_SNG_TD: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + hb_bm_line( cellx / 2, celly / 2, cellx / 2, celly - 1 ); + break; + + case HB_BOXCH_SNG_RT: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, celly - 1, cellx / 2, celly / 2 ); + hb_bm_line( cellx / 2, celly / 2, 0, celly / 2 ); + break; + + case HB_BOXCH_SNG_LB: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly / 2 ); + hb_bm_line( cellx / 2, celly / 2, cellx - 1, celly / 2 ); + break; + + case HB_BOXCH_SNG_BU: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly / 2 ); + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + break; + + case HB_BOXCH_SNG_RB: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly / 2 ); + hb_bm_line( cellx / 2, celly / 2, 0, celly / 2 ); + break; + + case HB_BOXCH_SNG_VL: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly - 1 ); + hb_bm_line( cellx / 2, celly / 2, cellx - 1, celly / 2 ); + break; + + case HB_BOXCH_SNG_VR: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly - 1 ); + hb_bm_line( cellx / 2, celly / 2, 0, celly / 2 ); + break; + + case HB_BOXCH_SNG_CRS: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly - 1 ); + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + break; + + case HB_BOXCH_SNG_HOR: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + break; + + case HB_BOXCH_SNG_VRT: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly - 1 ); + break; + + case HB_BOXCH_DBL_LT: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, celly - 1, cellx / 2 - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 + 1, celly - 1, cellx / 2 + 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + break; + + case HB_BOXCH_DBL_TD: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( 0, celly / 2 + 1, cellx / 2 - 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 + 1, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 + 1, cellx / 2 + 1, celly - 1 ); + break; + + case HB_BOXCH_DBL_RT: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, celly - 1, cellx / 2 - 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 + 1, 0, celly / 2 + 1 ); + hb_bm_line( cellx / 2 + 1, celly - 1, cellx / 2 + 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 - 1, 0, celly / 2 - 1 ); + break; + + case HB_BOXCH_DBL_LB: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + break; + + case HB_BOXCH_DBL_BU: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + hb_bm_line( 0, celly / 2 - 1, cellx / 2 - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 - 1, cellx / 2 - 1, 0 ); + hb_bm_line( cellx / 2 + 1, celly / 2 - 1, cellx / 2 + 1, 0 ); + break; + + case HB_BOXCH_DBL_RB: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 - 1, 0, celly / 2 - 1 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 + 1, 0, celly / 2 + 1 ); + break; + + case HB_BOXCH_DBL_VL: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 + 1, cellx / 2 + 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + break; + + case HB_BOXCH_DBL_VR: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly - 1 ); + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 + 1, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 - 1, 0, celly / 2 - 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 + 1, 0, celly / 2 + 1 ); + break; + + case HB_BOXCH_DBL_CRS: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 + 1, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 - 1, 0, celly / 2 - 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2 + 1, 0, celly / 2 + 1 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 + 1, cellx / 2 + 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + break; + + case HB_BOXCH_DBL_HOR: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( 0, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + break; + + case HB_BOXCH_DBL_VRT: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly - 1 ); + break; + + case HB_BOXCH_SNG_L_DBL_T: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2, celly / 2 - 1, cellx / 2, celly - 1 ); + break; + + case HB_BOXCH_SNG_T_DBL_D: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + hb_bm_line( cellx / 2 - 1, celly / 2, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2, cellx / 2 + 1, celly - 1 ); + break; + + case HB_BOXCH_SNG_R_DBL_T: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2, cellx / 2 + 1, celly / 2 ); + hb_bm_line( cellx / 2 - 1, celly / 2, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2, cellx / 2 + 1, celly - 1 ); + break; + + case HB_BOXCH_SNG_L_DBL_B: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2, 0, cellx / 2, celly / 2 + 1 ); + break; + + case HB_BOXCH_SNG_B_DBL_U: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly / 2 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly / 2 ); + break; + + case HB_BOXCH_SNG_R_DBL_B: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2, cellx / 2 + 1, celly / 2 ); + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly / 2 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly / 2 ); + break; + + case HB_BOXCH_SNG_V_DBL_L: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly - 1 ); + hb_bm_line( cellx / 2, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( cellx / 2, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + break; + + case HB_BOXCH_SNG_V_DBL_R: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly - 1 ); + hb_bm_line( 0, celly / 2 - 1, cellx / 2, celly / 2 - 1 ); + hb_bm_line( 0, celly / 2 + 1, cellx / 2, celly / 2 + 1 ); + break; + + case HB_BOXCH_SNG_DBL_CRS: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2, 0, cellx / 2, celly - 1 ); + hb_bm_line( 0, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( 0, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + break; + + case HB_BOXCH_DBL_L_SNG_T: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, celly / 2, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2, cellx / 2 + 1, celly - 1 ); + hb_bm_line( cellx / 2 - 1, celly / 2, cellx - 1, celly / 2 ); + break; + + case HB_BOXCH_DBL_T_SNG_D: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( 0, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2, celly / 2 + 1, cellx / 2, celly - 1 ); + break; + + case HB_BOXCH_DBL_R_SNG_T: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2 - 1, cellx / 2, celly / 2 - 1 ); + hb_bm_line( 0, celly / 2 + 1, cellx / 2, celly / 2 + 1 ); + hb_bm_line( cellx / 2, celly / 2 - 1, cellx / 2, celly - 1 ); + break; + + case HB_BOXCH_DBL_L_SNG_B: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly / 2 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly / 2 ); + hb_bm_line( cellx / 2 - 1, celly / 2, cellx - 1, celly / 2 ); + break; + + case HB_BOXCH_DBL_B_SNG_U: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2 - 1, cellx - 1, celly / 2 - 1 ); + hb_bm_line( 0, celly / 2 + 1, cellx - 1, celly / 2 + 1 ); + hb_bm_line( cellx / 2, 0, cellx / 2, celly / 2 - 1 ); + break; + + case HB_BOXCH_DBL_R_SNG_B: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( 0, celly / 2 - 1, cellx / 2, celly / 2 - 1 ); + hb_bm_line( 0, celly / 2 + 1, cellx / 2, celly / 2 + 1 ); + hb_bm_line( cellx / 2, 0, cellx / 2, celly / 2 + 1 ); + break; + + case HB_BOXCH_DBL_V_SNG_L: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, celly / 2, cellx - 1, celly / 2 ); + break; + + case HB_BOXCH_DBL_V_SNG_R: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly - 1 ); + hb_bm_line( 0, celly / 2, cellx / 2 - 1, celly / 2 ); + break; + + case HB_BOXCH_DBL_SNG_CRS: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + hb_bm_line( cellx / 2 - 1, 0, cellx / 2 - 1, celly - 1 ); + hb_bm_line( cellx / 2 + 1, 0, cellx / 2 + 1, celly - 1 ); + hb_bm_line( 0, celly / 2, cellx - 1, celly / 2 ); + break; + + case HB_BOXCH_SQUARE: + hBitMap = hb_gt_wvt_bitmap_char( pWVT, cellx, celly ); + + xx = yy = cellx - HB_MAX( cellx >> 2, 2 ); + hb_bm_rect( ( cellx - xx ) >> 1, ( celly - yy ) >> 1, xx, yy ); + break; + } + + return hBitMap; +} + +/* *********************************************************************** */ + +static void hb_gt_wvt_ResetBoxCharBitmaps( PHB_GTWVT pWVT ) +{ + int i; + + for( i = 1; i <= pWVT->boxCount; i++ ) + DeleteObject( pWVT->boxImage[ i ] ); + + memset( pWVT->boxImage, 0, sizeof( pWVT->boxImage ) ); + pWVT->boxCount = 0; + + for( i = 0; i < HB_BOXCH_TRANS_COUNT; ++i ) + pWVT->boxIndex[ i ] = HB_BOXCH_TRANS_MAX; +} + +/* *********************************************************************** */ + +static HBITMAP hb_gt_wvt_GetBoxChar( PHB_GTWVT pWVT, HB_USHORT * puc16 ) +{ + HB_USHORT uc16 = *puc16; + int iPos, iTrans; + + if( ( pWVT->fontAttribute & HB_GTI_FONTA_DRAWBOX ) == 0 ) + return NULL; + + if( uc16 >= HB_BOXCH_RC_0 && uc16 <= HB_BOXCH_RC_ACC ) + { + switch( uc16 ) + { + case HB_BOXCH_RC_0: + *puc16 = '0'; + break; + case HB_BOXCH_RC_1: + *puc16 = '1'; + break; + case HB_BOXCH_RC_2: + *puc16 = '2'; + break; + case HB_BOXCH_RC_3: + *puc16 = '3'; + break; + case HB_BOXCH_RC_4: + *puc16 = '4'; + break; + case HB_BOXCH_RC_5: + *puc16 = '5'; + break; + case HB_BOXCH_RC_6: + *puc16 = '6'; + break; + case HB_BOXCH_RC_7: + *puc16 = '7'; + break; + case HB_BOXCH_RC_8: + *puc16 = '8'; + break; + case HB_BOXCH_RC_9: + *puc16 = '9'; + break; + case HB_BOXCH_RC_DOT: + *puc16 = '.'; + break; + case HB_BOXCH_RC_ACC: + *puc16 = '\''; + break; + } + return NULL; + } + + if ( uc16 == HB_BOXCH_ARROW_R ) + iPos = 0; + else if( uc16 == HB_BOXCH_ARROW_L ) + iPos = 1; + else if( uc16 == HB_BOXCH_ARROW_U ) + iPos = 2; + else if( uc16 == HB_BOXCH_ARROW_D ) + iPos = 3; + else if( uc16 >= HB_BOXCH_BOX_MIN && uc16 <= HB_BOXCH_BOX_MAX ) + iPos = HB_BOXCH_CHR_BASE + + ( uc16 - HB_BOXCH_BOX_MIN ); + else if( uc16 >= HB_BOXCH_RC_MIN && uc16 <= HB_BOXCH_RC_MAX ) + iPos = HB_BOXCH_CHR_BASE + ( HB_BOXCH_BOX_MAX - HB_BOXCH_BOX_MIN + 1 ) + + ( uc16 - HB_BOXCH_RC_MIN ); + else + return NULL; + + iTrans = pWVT->boxIndex[ iPos ]; + if( iTrans == HB_BOXCH_TRANS_MAX ) + { + if( pWVT->boxCount < HB_BOXCH_TRANS_MAX - 1 ) + { + iTrans = pWVT->boxCount + 1; + pWVT->boxImage[ iTrans ] = hb_gt_wvt_DefineBoxChar( pWVT, uc16 ); + if( pWVT->boxImage[ iTrans ] ) + pWVT->boxCount = iTrans; + else + iTrans = 0; + } + else + iTrans = 0; + pWVT->boxIndex[ iPos ] = iTrans; + } + + return pWVT->boxImage[ iTrans ]; +} +#endif /* UNICODE */ + /* * use the standard fixed OEM font, unless the caller has requested set size fonts */ @@ -523,18 +1626,22 @@ static void hb_gt_wvt_AddCharToInputQueue( PHB_GTWVT pWVT, int iKey ) { int iPos = pWVT->keyPointerIn; - if( iKey == K_MOUSEMOVE || iKey == K_NCMOUSEMOVE ) + if( pWVT->keyPointerIn != pWVT->keyPointerOut && + HB_INKEY_ISMOUSEPOS( iKey ) ) { - /* Clipper strips repeated mouse movemnt - let's do the same */ - if( pWVT->keyLast == iKey && pWVT->keyPointerIn != pWVT->keyPointerOut ) + int iLastKey = pWVT->Keys[ pWVT->keyLastPos ]; + if( HB_INKEY_ISMOUSEPOS( iLastKey ) ) + { + pWVT->Keys[ pWVT->keyLastPos ] = iKey; return; + } } /* * When the buffer is full new event overwrite the last one * in the buffer - it's Clipper behavior, [druzus] */ - pWVT->Keys[ iPos ] = pWVT->keyLast = iKey; + pWVT->Keys[ pWVT->keyLastPos = iPos ] = iKey; if( ++iPos >= WVT_CHAR_QUEUE_SIZE ) iPos = 0; if( iPos != pWVT->keyPointerOut ) @@ -556,28 +1663,6 @@ static HB_BOOL hb_gt_wvt_GetCharFromInputQueue( PHB_GTWVT pWVT, int * iKey ) return HB_FALSE; } -static void hb_gt_wvt_TranslateKey( PHB_GTWVT pWVT, int key, int shiftkey, int altkey, int controlkey ) -{ - int nVirtKey = GetKeyState( VK_MENU ); - - if( nVirtKey & 0x8000 ) /* alt + key */ - hb_gt_wvt_AddCharToInputQueue( pWVT, altkey ); - else - { - nVirtKey = GetKeyState( VK_CONTROL ); - if( nVirtKey & 0x8000 ) /* control + key */ - hb_gt_wvt_AddCharToInputQueue( pWVT, controlkey ); - else - { - nVirtKey = GetKeyState( VK_SHIFT ); - if( nVirtKey & 0x8000 ) /* shift + key */ - hb_gt_wvt_AddCharToInputQueue( pWVT, shiftkey ); - else /* just key */ - hb_gt_wvt_AddCharToInputQueue( pWVT, key ); - } - } -} - #if ! defined( UNICODE ) static int hb_gt_wvt_key_ansi_to_oem( int c ) { @@ -716,6 +1801,11 @@ static void hb_gt_wvt_FitSize( PHB_GTWVT pWVT ) pWVT->PTEXTSIZE.x = tm.tmAveCharWidth; pWVT->PTEXTSIZE.y = tm.tmHeight; +#if defined( UNICODE ) + /* reset character bitmap tables (after font selection) */ + hb_gt_wvt_ResetBoxCharBitmaps( pWVT ); +#endif + #if defined( HB_OS_WIN_CE ) pWVT->FixedFont = HB_FALSE; #else @@ -852,6 +1942,11 @@ static void hb_gt_wvt_ResetWindowSize( PHB_GTWVT pWVT, HFONT hFont ) tm.tmAveCharWidth; /* For fixed FONT should == tm.tmMaxCharWidth */ pWVT->PTEXTSIZE.y = tm.tmHeight; /* but seems to be a problem on Win9X so */ /* assume proportional fonts always for Win9X */ +#if defined( UNICODE ) + /* reset character bitmaps (after font selection) */ + hb_gt_wvt_ResetBoxCharBitmaps( pWVT ); +#endif + #if defined( HB_OS_WIN_CE ) pWVT->FixedFont = HB_FALSE; #else @@ -1032,10 +2127,28 @@ static RECT hb_gt_wvt_GetColRowFromXYRect( PHB_GTWVT pWVT, RECT xy ) return colrow; } -static void hb_gt_wvt_SetMousePos( PHB_GTWVT pWVT, int iRow, int iCol ) +static HB_BOOL hb_gt_wvt_SetMousePos( PHB_GTWVT pWVT, int iRow, int iCol ) { - pWVT->MousePos.y = iRow; - pWVT->MousePos.x = iCol; + if( pWVT->MousePos.y != iRow || pWVT->MousePos.x != iCol ) + { + pWVT->MousePos.y = iRow; + pWVT->MousePos.x = iCol; + return HB_TRUE; + } + return HB_FALSE; +} + +static int hb_gt_wvt_GetKeyFlags( void ) +{ + int iFlags = 0; + if( GetKeyState( VK_SHIFT ) & 0x8000 ) + iFlags |= HB_KF_SHIFT; + if( GetKeyState( VK_CONTROL ) & 0x8000 ) + iFlags |= HB_KF_CTRL; + if( GetKeyState( VK_MENU ) & 0x8000 ) + iFlags |= HB_KF_ALT; + + return iFlags; } static void hb_gt_wvt_Composited( PHB_GTWVT pWVT, HB_BOOL fEnable ) @@ -1057,19 +2170,16 @@ static void hb_gt_wvt_Composited( PHB_GTWVT pWVT, HB_BOOL fEnable ) static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, LPARAM lParam ) { - POINT xy, colrow; SHORT keyCode = 0; - - HB_SYMBOL_UNUSED( wParam ); - - if( ! pWVT->bBeginMarked && ! pWVT->MouseMove && ( message == WM_MOUSEMOVE || message == WM_NCMOUSEMOVE ) ) - return; + POINT xy, colrow; xy.x = LOWORD( lParam ); xy.y = HIWORD( lParam ); colrow = hb_gt_wvt_GetColRowFromXY( pWVT, xy.x, xy.y ); - hb_gt_wvt_SetMousePos( pWVT, colrow.y, colrow.x ); + if( hb_gt_wvt_SetMousePos( pWVT, colrow.y, colrow.x ) ) + hb_gt_wvt_AddCharToInputQueue( pWVT, + HB_INKEY_NEW_MPOS( pWVT->MousePos.x, pWVT->MousePos.y ) ); switch( message ) { @@ -1082,7 +2192,6 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L break; case WM_LBUTTONDOWN: - if( pWVT->bBeginMarked ) { pWVT->bBeingMarked = HB_TRUE; @@ -1101,11 +2210,9 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L return; } - else - { - keyCode = K_LBUTTONDOWN; - break; - } + keyCode = K_LBUTTONDOWN; + break; + case WM_RBUTTONDOWN: keyCode = K_RBUTTONDOWN; break; @@ -1129,59 +2236,57 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L cdpBox = HB_GTSELF_BOXCP( pWVT->pGT ); #endif TCHAR * sBuffer; - HB_SIZE nSize; - int irow, icol, j, top, left, bottom, right; - RECT rect = { 0, 0, 0, 0 }; - RECT colrowRC = { 0, 0, 0, 0 }; + HB_SIZE nSize, n; + int row, col; + RECT rect; rect.left = HB_MIN( pWVT->sRectNew.left, pWVT->sRectNew.right ); rect.top = HB_MIN( pWVT->sRectNew.top , pWVT->sRectNew.bottom ); rect.right = HB_MAX( pWVT->sRectNew.left, pWVT->sRectNew.right ); rect.bottom = HB_MAX( pWVT->sRectNew.top , pWVT->sRectNew.bottom ); - colrowRC = hb_gt_wvt_GetColRowFromXYRect( pWVT, rect ); + rect = hb_gt_wvt_GetColRowFromXYRect( pWVT, rect ); - left = colrowRC.left; - top = colrowRC.top; - right = colrowRC.right; - bottom = colrowRC.bottom; - - nSize = ( ( bottom - top + 1 ) * ( right - left + 1 + 2 ) ); + nSize = ( ( rect.bottom - rect.top + 1 ) * + ( rect.right - rect.left + 1 + 2 ) ); sBuffer = ( TCHAR * ) hb_xgrab( nSize * sizeof( TCHAR ) + 1 ); - for( j = 0, irow = top; irow <= bottom; irow++ ) + for( n = 0, row = rect.top; row <= rect.bottom; row++ ) { - for( icol = left; icol <= right; icol++ ) + for( col = rect.left; col <= rect.right; col++ ) { int iColor; HB_BYTE bAttr; HB_USHORT usChar; - if( ! HB_GTSELF_GETSCRCHAR( pWVT->pGT, irow, icol, &iColor, &bAttr, &usChar ) ) + if( ! HB_GTSELF_GETSCRCHAR( pWVT->pGT, row, col, &iColor, &bAttr, &usChar ) ) break; #if defined( UNICODE ) usChar = hb_cdpGetU16Ctrl( usChar ); #else usChar = hb_cdpGetUC( bAttr & HB_GT_ATTR_BOX ? cdpBox : cdpHost, usChar, '?' ); #endif - sBuffer[ j++ ] = ( TCHAR ) usChar; + sBuffer[ n++ ] = ( TCHAR ) usChar; + } + if( rect.top < rect.bottom ) + { + sBuffer[ n++ ] = '\r'; + sBuffer[ n++ ] = '\n'; } - sBuffer[ j++ ] = '\r'; - sBuffer[ j++ ] = '\n'; } #if defined( UNICODE ) - if( j > 0 ) + if( n > 0 ) { - PHB_ITEM pItem = hb_itemPutStrLenU16( NULL, HB_CDP_ENDIAN_NATIVE, sBuffer, j ); + PHB_ITEM pItem = hb_itemPutStrLenU16( NULL, HB_CDP_ENDIAN_NATIVE, sBuffer, n ); hb_gt_winapi_setClipboard( CF_UNICODETEXT, pItem ); hb_itemRelease( pItem ); } hb_xfree( sBuffer ); #else - if( j > 0 ) + if( n > 0 ) { - PHB_ITEM pItem = hb_itemPutCLPtr( NULL, sBuffer, j ); + PHB_ITEM pItem = hb_itemPutCLPtr( NULL, sBuffer, n ); hb_gt_winapi_setClipboard( pWVT->CodePage == OEM_CHARSET ? CF_OEMTEXT : CF_TEXT, pItem ); hb_itemRelease( pItem ); @@ -1192,14 +2297,11 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L } hb_gt_wvt_Composited( pWVT, HB_TRUE ); - return; } - else - { - keyCode = K_LBUTTONUP; - break; - } + keyCode = K_LBUTTONUP; + break; + case WM_MBUTTONDOWN: keyCode = K_MBUTTONDOWN; break; @@ -1216,8 +2318,7 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L if( pWVT->bBeingMarked ) { - RECT rect = { 0, 0, 0, 0 }; - RECT colrowRC = { 0, 0, 0, 0 }; + RECT rect; pWVT->sRectNew.right = xy.x; pWVT->sRectNew.bottom = xy.y; @@ -1226,9 +2327,18 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L rect.top = HB_MIN( pWVT->sRectNew.top , pWVT->sRectNew.bottom ); rect.right = HB_MAX( pWVT->sRectNew.left, pWVT->sRectNew.right ); rect.bottom = HB_MAX( pWVT->sRectNew.top , pWVT->sRectNew.bottom ); + /* out of band cords may appear due to margins in maximized mode */ + if( rect.left < 0 ) + rect.left = 0; + if( rect.top < 0 ) + rect.top = 0; + if( rect.right > pWVT->COLS * pWVT->PTEXTSIZE.x ) + rect.right = pWVT->COLS * pWVT->PTEXTSIZE.x; + if( rect.bottom > pWVT->ROWS * pWVT->PTEXTSIZE.y ) + rect.bottom = pWVT->ROWS * pWVT->PTEXTSIZE.y; - colrowRC = hb_gt_wvt_GetColRowFromXYRect( pWVT, rect ); - rect = hb_gt_wvt_GetXYFromColRowRect( pWVT, colrowRC ); + rect = hb_gt_wvt_GetXYFromColRowRect( pWVT, + hb_gt_wvt_GetColRowFromXYRect( pWVT, rect ) ); if( rect.left != pWVT->sRectOld.left || rect.top != pWVT->sRectOld.top || @@ -1251,6 +2361,11 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L DeleteObject( rgn1 ); DeleteObject( rgn2 ); DeleteObject( rgn3 ); +#else + HDC hdc = GetDC( pWVT->hWnd ); + InvertRect( hdc, &pWVT->sRectOld ); + InvertRect( hdc, &rect ); + ReleaseDC( pWVT->hWnd, hdc ); #endif pWVT->sRectOld.left = rect.left; pWVT->sRectOld.top = rect.top; @@ -1259,354 +2374,255 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L } return; } - else - { - keyCode = K_MOUSEMOVE; - break; - } + break; case WM_MOUSEWHEEL: - { - SHORT keyState = ( SHORT ) HIWORD( wParam ); - keyCode = keyState > 0 ? K_MWFORWARD : K_MWBACKWARD; - break; - } - case WM_NCMOUSEMOVE: - keyCode = K_NCMOUSEMOVE; + keyCode = ( SHORT ) HIWORD( wParam ) > 0 ? K_MWFORWARD : K_MWBACKWARD; break; } if( keyCode != 0 ) - hb_gt_wvt_AddCharToInputQueue( pWVT, keyCode ); + hb_gt_wvt_AddCharToInputQueue( pWVT, + HB_INKEY_NEW_MKEY( keyCode, hb_gt_wvt_GetKeyFlags() ) ); } static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, LPARAM lParam ) { + int iKey = 0, iFlags = pWVT->keyFlags; + switch( message ) { case WM_KEYDOWN: case WM_SYSKEYDOWN: - { - HB_BOOL bAlt = GetKeyState( VK_MENU ) & 0x8000; - pWVT->IgnoreWM_SYSCHAR = HB_FALSE; - + iFlags = hb_gt_wvt_GetKeyFlags(); switch( wParam ) { + case VK_BACK: + pWVT->IgnoreWM_SYSCHAR = HB_TRUE; + iKey = HB_KX_BS; + break; + case VK_TAB: + pWVT->IgnoreWM_SYSCHAR = HB_TRUE; + iKey = HB_KX_TAB; + break; case VK_RETURN: - /* in WM_CHAR i was unable to read Alt key state */ - if( bAlt && pWVT->bAltEnter ) + pWVT->IgnoreWM_SYSCHAR = HB_TRUE; + if( pWVT->bAltEnter && ( iFlags & HB_KF_ALT ) != 0 ) + hb_gt_wvt_FullScreen( pWVT->pGT ); + else { - pWVT->IgnoreWM_SYSCHAR = HB_TRUE; /* this must be FIRST, otherwise some process in hb_gt_wvt_FullScreen posts the ENTER key to the InputQueue */ - hb_gt_wvt_FullScreen( pWVT->pGT ); /* this must be last, otherwise some process in hb_gt_wvt_FullScreen posts the ENTER key to the InputQueue */ + iKey = HB_KX_ENTER; + if( lParam & WVT_EXTKEY_FLAG ) + iFlags |= HB_KF_KEYPAD; } break; - case VK_LEFT: - hb_gt_wvt_TranslateKey( pWVT, K_LEFT , K_SH_LEFT , K_ALT_LEFT , K_CTRL_LEFT ); - break; - case VK_RIGHT: - hb_gt_wvt_TranslateKey( pWVT, K_RIGHT, K_SH_RIGHT, K_ALT_RIGHT, K_CTRL_RIGHT ); + case VK_ESCAPE: + pWVT->IgnoreWM_SYSCHAR = HB_TRUE; + iKey = HB_KX_ESC; break; + case VK_UP: - hb_gt_wvt_TranslateKey( pWVT, K_UP , K_SH_UP , K_ALT_UP , K_CTRL_UP ); + iKey = HB_KX_UP; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + iFlags |= HB_KF_KEYPAD; break; case VK_DOWN: - hb_gt_wvt_TranslateKey( pWVT, K_DOWN , K_SH_DOWN , K_ALT_DOWN , K_CTRL_DOWN ); + iKey = HB_KX_DOWN; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + iFlags |= HB_KF_KEYPAD; + break; + case VK_LEFT: + iKey = HB_KX_LEFT; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + iFlags |= HB_KF_KEYPAD; + break; + case VK_RIGHT: + iKey = HB_KX_RIGHT; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + iFlags |= HB_KF_KEYPAD; break; case VK_HOME: - hb_gt_wvt_TranslateKey( pWVT, K_HOME , K_SH_HOME , K_ALT_HOME , K_CTRL_HOME ); + iKey = HB_KX_HOME; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + iFlags |= HB_KF_KEYPAD; break; case VK_END: - hb_gt_wvt_TranslateKey( pWVT, K_END , K_SH_END , K_ALT_END , K_CTRL_END ); - break; - case VK_DELETE: - hb_gt_wvt_TranslateKey( pWVT, K_DEL , K_SH_DEL , K_ALT_DEL , K_CTRL_DEL ); - break; - case VK_INSERT: - hb_gt_wvt_TranslateKey( pWVT, K_INS , K_SH_INS , K_ALT_INS , K_CTRL_INS ); + iKey = HB_KX_END; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + iFlags |= HB_KF_KEYPAD; break; case VK_PRIOR: - hb_gt_wvt_TranslateKey( pWVT, K_PGUP , K_SH_PGUP , K_ALT_PGUP , K_CTRL_PGUP ); + iKey = HB_KX_PGUP; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + iFlags |= HB_KF_KEYPAD; break; case VK_NEXT: - hb_gt_wvt_TranslateKey( pWVT, K_PGDN , K_SH_PGDN , K_ALT_PGDN , K_CTRL_PGDN ); + iKey = HB_KX_PGDN; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + iFlags |= HB_KF_KEYPAD; + break; + case VK_INSERT: + iKey = HB_KX_INS; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + iFlags |= HB_KF_KEYPAD; + break; + case VK_DELETE: + iKey = HB_KX_DEL; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + iFlags |= HB_KF_KEYPAD; break; case VK_F1: - hb_gt_wvt_TranslateKey( pWVT, K_F1 , K_SH_F1, K_ALT_F1 , K_CTRL_F1 ); + iKey = HB_KX_F1; break; case VK_F2: - hb_gt_wvt_TranslateKey( pWVT, K_F2 , K_SH_F2, K_ALT_F2 , K_CTRL_F2 ); + iKey = HB_KX_F2; break; case VK_F3: - hb_gt_wvt_TranslateKey( pWVT, K_F3 , K_SH_F3, K_ALT_F3 , K_CTRL_F3 ); + iKey = HB_KX_F3; break; case VK_F4: - if( pWVT->AltF4Close && bAlt ) - return DefWindowProc( pWVT->hWnd, message, wParam, lParam ) != 0; - hb_gt_wvt_TranslateKey( pWVT, K_F4 , K_SH_F4, K_ALT_F4 , K_CTRL_F4 ); + iKey = HB_KX_F4; break; case VK_F5: - hb_gt_wvt_TranslateKey( pWVT, K_F5 , K_SH_F5, K_ALT_F5 , K_CTRL_F5 ); + iKey = HB_KX_F5; break; case VK_F6: - hb_gt_wvt_TranslateKey( pWVT, K_F6 , K_SH_F6, K_ALT_F6 , K_CTRL_F6 ); + iKey = HB_KX_F6; break; case VK_F7: - hb_gt_wvt_TranslateKey( pWVT, K_F7 , K_SH_F7, K_ALT_F7 , K_CTRL_F7 ); + iKey = HB_KX_F7; break; case VK_F8: - hb_gt_wvt_TranslateKey( pWVT, K_F8 , K_SH_F8, K_ALT_F8 , K_CTRL_F8 ); + iKey = HB_KX_F8; break; case VK_F9: - hb_gt_wvt_TranslateKey( pWVT, K_F9 , K_SH_F9, K_ALT_F9 , K_CTRL_F9 ); + iKey = HB_KX_F9; break; case VK_F10: - hb_gt_wvt_TranslateKey( pWVT, K_F10 , K_SH_F10,K_ALT_F10 , K_CTRL_F10 ); + iKey = HB_KX_F10; break; case VK_F11: - hb_gt_wvt_TranslateKey( pWVT, K_F11 , K_SH_F11,K_ALT_F11 , K_CTRL_F11 ); + iKey = HB_KX_F11; break; case VK_F12: - hb_gt_wvt_TranslateKey( pWVT, K_F12 , K_SH_F12,K_ALT_F12 , K_CTRL_F12 ); + iKey = HB_KX_F12; break; - default: - { - HB_BOOL bCtrl = GetKeyState( VK_CONTROL ) & 0x8000; - HB_BOOL bShift = GetKeyState( VK_SHIFT ) & 0x8000; - int iScanCode = HIWORD( lParam ) & 0xFF; - if( bCtrl && iScanCode == 76 ) /* CTRL_VK_NUMPAD5 */ - hb_gt_wvt_AddCharToInputQueue( pWVT, KP_CTRL_5 ); - else if( bCtrl && wParam == VK_TAB ) /* K_CTRL_TAB */ - hb_gt_wvt_AddCharToInputQueue( pWVT, bShift ? K_CTRL_SH_TAB : K_CTRL_TAB ); - else if( iScanCode == 70 ) /* Ctrl_Break key OR Scroll Lock Key */ - { - if( bCtrl ) /* Not scroll lock */ - { - hb_gt_wvt_AddCharToInputQueue( pWVT, HB_BREAK_FLAG ); /* Pretend Alt+C pressed */ - pWVT->IgnoreWM_SYSCHAR = HB_TRUE; - } - else - DefWindowProc( pWVT->hWnd, message, wParam, lParam ); /* Let windows handle ScrollLock */ - } - else if( bCtrl && iScanCode == 53 && bShift ) - hb_gt_wvt_AddCharToInputQueue( pWVT, K_CTRL_QUESTION ); - else if( ( bAlt || bCtrl ) && ( - wParam == VK_MULTIPLY || wParam == VK_ADD || - wParam == VK_SUBTRACT || wParam == VK_DIVIDE ) ) - { - if( bAlt ) - pWVT->IgnoreWM_SYSCHAR = HB_TRUE; + case VK_SNAPSHOT: + iKey = HB_KX_PRTSCR; + break; + case VK_CANCEL: + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + break; + iFlags |= HB_KF_CTRL; + case VK_PAUSE: + pWVT->IgnoreWM_SYSCHAR = HB_TRUE; + iKey = HB_KX_PAUSE; + break; - switch( wParam ) - { - case VK_MULTIPLY: - hb_gt_wvt_TranslateKey( pWVT, '*', '*', KP_ALT_ASTERISK, KP_CTRL_ASTERISK ); - break; - case VK_ADD: - hb_gt_wvt_TranslateKey( pWVT, '+', '+', KP_ALT_PLUS, KP_CTRL_PLUS ); - break; - case VK_SUBTRACT: - hb_gt_wvt_TranslateKey( pWVT, '-', '-', KP_ALT_MINUS, KP_CTRL_MINUS ); - break; - case VK_DIVIDE: - hb_gt_wvt_TranslateKey( pWVT, '/', '/', KP_ALT_SLASH, KP_CTRL_SLASH ); - break; - } + case VK_CLEAR: + iKey = HB_KX_CENTER; + iFlags |= HB_KF_KEYPAD; + break; + + case VK_NUMPAD0: + case VK_NUMPAD1: + case VK_NUMPAD2: + case VK_NUMPAD3: + case VK_NUMPAD4: + case VK_NUMPAD5: + case VK_NUMPAD6: + case VK_NUMPAD7: + case VK_NUMPAD8: + case VK_NUMPAD9: + iFlags |= HB_KF_KEYPAD; + if( iFlags & HB_KF_CTRL ) + { + pWVT->IgnoreWM_SYSCHAR = HB_TRUE; + iKey = wParam - VK_NUMPAD0 + '0'; } - } + break; + case VK_DECIMAL: + case VK_SEPARATOR: + iFlags |= HB_KF_KEYPAD; + if( iFlags & HB_KF_CTRL ) + { + pWVT->IgnoreWM_SYSCHAR = HB_TRUE; + iKey = '.'; + } + break; + + case VK_DIVIDE: + iFlags |= HB_KF_KEYPAD; + if( iFlags & HB_KF_CTRL ) + iKey = '/'; + break; + case VK_MULTIPLY: + iFlags |= HB_KF_KEYPAD; + if( iFlags & HB_KF_CTRL ) + iKey = '*'; + break; + case VK_SUBTRACT: + iFlags |= HB_KF_KEYPAD; + if( iFlags & HB_KF_CTRL ) + iKey = '-'; + break; + case VK_ADD: + iFlags |= HB_KF_KEYPAD; + if( iFlags & HB_KF_CTRL ) + iKey = '+'; + break; + + case VK_OEM_2: + if( ( iFlags & HB_KF_CTRL ) != 0 && ( iFlags & HB_KF_SHIFT ) != 0 ) + iKey = '?'; + break; } + pWVT->keyFlags = iFlags; + if( iKey != 0 ) + iKey = HB_INKEY_NEW_KEY( iKey, iFlags ); break; - } case WM_CHAR: - { - HB_BOOL bCtrl = GetKeyState( VK_CONTROL ) & 0x8000; - int iScanCode = HIWORD( lParam ) & 0xFF; - int c = ( int ) wParam; - + case WM_SYSCHAR: if( ! pWVT->IgnoreWM_SYSCHAR ) { - if( bCtrl && iScanCode == 28 ) /* K_CTRL_RETURN */ - hb_gt_wvt_AddCharToInputQueue( pWVT, K_CTRL_RETURN ); - else if( bCtrl && ( c >= 1 && c <= 26 ) ) /* K_CTRL_A - Z */ - hb_gt_wvt_AddCharToInputQueue( pWVT, K_Ctrl[ c - 1 ] ); + iKey = ( int ) wParam; + + if( ( iFlags & HB_KF_CTRL ) != 0 && ( iKey >= 0 && iKey < 32 ) ) + { + iKey += 'A' - 1; + iKey = HB_INKEY_NEW_KEY( iKey, iFlags ); + } else { - switch( c ) - { - /* handle special characters */ - case VK_BACK: - hb_gt_wvt_TranslateKey( pWVT, K_BS, K_SH_BS, K_ALT_BS, K_CTRL_BS ); - break; - case VK_TAB: - hb_gt_wvt_TranslateKey( pWVT, K_TAB, K_SH_TAB, K_ALT_TAB, K_CTRL_TAB ); - break; - case VK_RETURN: - hb_gt_wvt_TranslateKey( pWVT, K_RETURN, K_SH_RETURN, K_ALT_RETURN, K_CTRL_RETURN ); - break; - case VK_ESCAPE: - hb_gt_wvt_AddCharToInputQueue( pWVT, K_ESC ); - break; - default: #if defined( UNICODE ) - if( c >= 127 ) - c = HB_INKEY_NEW_UNICODE( c ); + if( iKey >= 128 ) + iKey = HB_INKEY_NEW_UNICODEF( iKey, iFlags ); + else + iKey = HB_INKEY_NEW_KEY( iKey, iFlags ); #else - { - int u = HB_GTSELF_KEYTRANS( pWVT->pGT, c ); - if( u ) - c = HB_INKEY_NEW_UNICODE( u ); - else if( pWVT->CodePage == OEM_CHARSET ) - c = hb_gt_wvt_key_ansi_to_oem( c ); - } -#endif - hb_gt_wvt_AddCharToInputQueue( pWVT, c ); - break; + int u = HB_GTSELF_KEYTRANS( pWVT->pGT, iKey ); + if( u ) + iKey = HB_INKEY_NEW_UNICODEF( u, iFlags ); + else + { + if( pWVT->CodePage == OEM_CHARSET ) + iKey = hb_gt_wvt_key_ansi_to_oem( iKey ); + iKey = HB_INKEY_NEW_KEY( iKey, iFlags ); } +#endif } } - pWVT->IgnoreWM_SYSCHAR = HB_FALSE; /* As Suggested by Peter */ - break; - } - - case WM_SYSCHAR: - - if( ! pWVT->IgnoreWM_SYSCHAR ) - { - int c, iScanCode = HIWORD( lParam ) & 0xFF; - switch( iScanCode ) - { - case 2: - c = K_ALT_1; - break; - case 3: - c = K_ALT_2; - break; - case 4: - c = K_ALT_3; - break; - case 5: - c = K_ALT_4; - break; - case 6: - c = K_ALT_5; - break; - case 7: - c = K_ALT_6; - break; - case 8: - c = K_ALT_7; - break; - case 9: - c = K_ALT_8; - break; - case 10: - c = K_ALT_9; - break; - case 11: - c = K_ALT_0; - break; - case 13: - c = K_ALT_EQUALS; - break; - case 14: - c = K_ALT_BS; - break; - case 16: - c = K_ALT_Q; - break; - case 17: - c = K_ALT_W; - break; - case 18: - c = K_ALT_E; - break; - case 19: - c = K_ALT_R; - break; - case 20: - c = K_ALT_T; - break; - case 21: - c = K_ALT_Y; - break; - case 22: - c = K_ALT_U; - break; - case 23: - c = K_ALT_I; - break; - case 24: - c = K_ALT_O; - break; - case 25: - c = K_ALT_P; - break; - case 30: - c = K_ALT_A; - break; - case 31: - c = K_ALT_S; - break; - case 32: - c = K_ALT_D; - break; - case 33: - c = K_ALT_F; - break; - case 34: - c = K_ALT_G; - break; - case 35: - c = K_ALT_H; - break; - case 36: - c = K_ALT_J; - break; - case 37: - c = K_ALT_K; - break; - case 38: - c = K_ALT_L; - break; - case 44: - c = K_ALT_Z; - break; - case 45: - c = K_ALT_X; - break; - case 46: - c = K_ALT_C; - break; - case 47: - c = K_ALT_V; - break; - case 48: - c = K_ALT_B; - break; - case 49: - c = K_ALT_N; - break; - case 50: - c = K_ALT_M; - break; - case 51: - c = K_ALT_COMMA; - break; - case 52: - c = K_ALT_PERIOD; - break; - default: - c = ( int ) wParam; - break; - } - hb_gt_wvt_AddCharToInputQueue( pWVT, c ); - } pWVT->IgnoreWM_SYSCHAR = HB_FALSE; + break; } + if( iKey != 0 ) + hb_gt_wvt_AddCharToInputQueue( pWVT, iKey ); + return 0; } @@ -1614,23 +2630,33 @@ static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, * hb_gt_wvt_TextOut converts col and row to x and y ( pixels ) and calls * the Windows function TextOut with the expected coordinates */ -static HB_BOOL hb_gt_wvt_TextOut( PHB_GTWVT pWVT, HDC hdc, int col, int row, int iColor, LPCTSTR lpString, UINT cbString ) +static void hb_gt_wvt_TextOut( PHB_GTWVT pWVT, HDC hdc, int col, int row, int iColor, LPCTSTR lpString, UINT cbString ) { POINT xy; RECT rClip; - - /* set foreground color */ - SetTextColor( hdc, pWVT->COLORS[ iColor & 0x0F ] ); - /* set background color */ - SetBkColor( hdc, pWVT->COLORS[ ( iColor >> 4 ) & 0x0F ] ); - - SetTextAlign( hdc, TA_LEFT ); + UINT fuOptions = ETO_CLIPPED; xy = hb_gt_wvt_GetXYFromColRow( pWVT, col, row ); SetRect( &rClip, xy.x, xy.y, xy.x + cbString * pWVT->PTEXTSIZE.x, xy.y + pWVT->PTEXTSIZE.y ); - return ExtTextOut( hdc, xy.x, xy.y, ETO_CLIPPED | ETO_OPAQUE, &rClip, - lpString, cbString, pWVT->FixedFont ? NULL : pWVT->FixedSize ); + if( ( pWVT->fontAttribute & HB_GTI_FONTA_CLRBKG ) != 0 ) + { + HBRUSH hBrush = CreateSolidBrush( pWVT->COLORS[ ( iColor >> 4 ) & 0x0F ] ); + FillRect( hdc, &rClip, hBrush ); + DeleteObject( hBrush ); + } + else + fuOptions |= ETO_OPAQUE; + + /* set background color */ + SetBkColor( hdc, pWVT->COLORS[ ( iColor >> 4 ) & 0x0F ] ); + /* set foreground color */ + SetTextColor( hdc, pWVT->COLORS[ iColor & 0x0F ] ); + + SetTextAlign( hdc, TA_LEFT ); + + ExtTextOut( hdc, xy.x, xy.y, fuOptions, &rClip, + lpString, cbString, pWVT->FixedFont ? NULL : pWVT->FixedSize ); } static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT ) @@ -1638,10 +2664,10 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT ) PAINTSTRUCT ps; HDC hdc; RECT rcRect; - HBRUSH hBrush = CreateSolidBrush( pWVT->COLORS[ 0 ] ); int iRow, iCol, startCol, len; int iColor, iOldColor = 0; HB_BYTE bAttr; + HB_BOOL fFixMetric = ( pWVT->fontAttribute & HB_GTI_FONTA_FIXMETRIC ) != 0; #if ! defined( UNICODE ) HFONT hFont, hOldFont = NULL; @@ -1654,6 +2680,7 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT ) */ if( pWVT->bMaximized ) { + HBRUSH hBrush = CreateSolidBrush( pWVT->COLORS[ 0 ] ); RECT ciNew = ps.rcPaint; RECT ciTemp = ps.rcPaint; if( pWVT->MarginLeft > 0 ) @@ -1678,6 +2705,7 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT ) * WM_PAINT message which caused a Browse scroll to flicker badly under XP. * Now, only repaints the margin areas as required. */ + DeleteObject( hBrush ); } else if( pWVT->bAlreadySizing ) { @@ -1690,6 +2718,7 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT ) * Client area coordinates before Window sized, this is set in the WM_ENTERSIZEMOVE * message and then used here to calculate the size changed areas to paint black. */ + HBRUSH hBrush = CreateSolidBrush( pWVT->COLORS[ 0 ] ); RECT ciNew = ps.rcPaint; RECT ciTemp = ps.rcPaint; if( ciNew.bottom > pWVT->ciLast.bottom ) @@ -1698,12 +2727,12 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT ) FillRect( hdc, &ciTemp, hBrush ); ciTemp.top = ciNew.top; } - if( ciNew.right > pWVT->ciLast.right ) { ciTemp.left = pWVT->ciLast.right; FillRect( hdc, &ciTemp, hBrush ); } + DeleteObject( hBrush ); } #if defined( UNICODE ) @@ -1720,7 +2749,9 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT ) while( iCol <= rcRect.right ) { #if defined( UNICODE ) + HBITMAP hBitMap; HB_USHORT usChar; + if( ! HB_GTSELF_GETSCRCHAR( pWVT->pGT, iRow, iCol, &iColor, &bAttr, &usChar ) ) break; if( ( pWVT->fontAttribute & HB_GTI_FONTA_CTRLCHARS ) == 0 ) @@ -1738,16 +2769,33 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT ) * and not divide output when it does not change anythings */ iColor &= 0xff; - if( len == 0 ) - iOldColor = iColor; - else if( iColor != iOldColor ) + hBitMap = hb_gt_wvt_GetBoxChar( pWVT, &usChar ); + if( len > 0 && ( iColor != iOldColor || fFixMetric || hBitMap ) ) { hb_gt_wvt_TextOut( pWVT, hdc, startCol, iRow, iOldColor, pWVT->TextLine, ( UINT ) len ); - iOldColor = iColor; - startCol = iCol; len = 0; } - pWVT->TextLine[ len++ ] = ( TCHAR ) usChar; + if( hBitMap ) + { + POINT xy; + /* set foreground color */ + SetTextColor( hdc, pWVT->COLORS[ iColor & 0x0F ] ); + /* set background color */ + SetBkColor( hdc, pWVT->COLORS[ ( iColor >> 4 ) & 0x0F ] ); + xy = hb_gt_wvt_GetXYFromColRow( pWVT, iCol, iRow ); + SelectObject( pWVT->hBmpDC, hBitMap ); + BitBlt( hdc, xy.x, xy.y, pWVT->PTEXTSIZE.x + 1, pWVT->PTEXTSIZE.y + 1, + pWVT->hBmpDC, 0, 0, SRCCOPY ); + } + else + { + if( len == 0 ) + { + iOldColor = iColor; + startCol = iCol; + } + pWVT->TextLine[ len++ ] = ( TCHAR ) usChar; + } #else HB_UCHAR uc; if( ! HB_GTSELF_GETSCRUC( pWVT->pGT, iRow, iCol, &iColor, &bAttr, &uc, HB_TRUE ) ) @@ -1762,7 +2810,7 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT ) } iOldColor = iColor; } - else if( iColor != iOldColor || hFont != hOldFont ) + else if( iColor != iOldColor || hFont != hOldFont || fFixMetric ) { hb_gt_wvt_TextOut( pWVT, hdc, startCol, iRow, iOldColor, pWVT->TextLine, ( UINT ) len ); if( hFont != hOldFont ) @@ -1782,7 +2830,6 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT ) hb_gt_wvt_TextOut( pWVT, hdc, startCol, iRow, iOldColor, pWVT->TextLine, ( UINT ) len ); } EndPaint( pWVT->hWnd, &ps ); - DeleteObject( hBrush ); } static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) @@ -1875,7 +2922,7 @@ static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wPara /* Pritpal Bedi - 2008-06-06 */ case WM_ACTIVATE: - hb_gt_wvt_AddCharToInputQueue( pWVT, ( LOWORD( wParam ) == WA_INACTIVE ? HB_K_LOSTFOCUS : HB_K_GOTFOCUS ) ); + hb_gt_wvt_AddCharToInputQueue( pWVT, LOWORD( wParam ) == WA_INACTIVE ? HB_K_LOSTFOCUS : HB_K_GOTFOCUS ); return 0; case WM_ENTERSIZEMOVE: @@ -2527,7 +3574,11 @@ static HB_BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) case HB_GTI_FONTATTRIBUTE: pInfo->pResult = hb_itemPutNI( pInfo->pResult, pWVT->fontAttribute ); if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) - pWVT->fontAttribute = hb_itemGetNI( pInfo->pNewVal ) & HB_GTI_FONTA_CTRLCHARS; + pWVT->fontAttribute = hb_itemGetNI( pInfo->pNewVal ) & + ( HB_GTI_FONTA_FIXMETRIC | + HB_GTI_FONTA_CLRBKG | + HB_GTI_FONTA_CTRLCHARS | + HB_GTI_FONTA_DRAWBOX ); break; case HB_GTI_FONTSEL: @@ -2811,13 +3862,13 @@ static HB_BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) case HB_GTI_CURSORBLINKRATE: pInfo->pResult = hb_itemPutNI( pInfo->pResult, GetCaretBlinkTime() ); if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) - SetCaretBlinkTime( hb_itemGetNI( pInfo->pNewVal ) ); + { + iVal = hb_itemGetNI( pInfo->pNewVal ); + SetCaretBlinkTime( HB_MAX( iVal, 0 ) ); + } break; case HB_GTI_SCREENSIZE: - { - int iX, iY; - if( ! pInfo->pResult ) pInfo->pResult = hb_itemNew( NULL ); @@ -2827,6 +3878,8 @@ static HB_BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) if( ( hb_itemType( pInfo->pNewVal ) & HB_IT_ARRAY ) && hb_arrayLen( pInfo->pNewVal ) == 2 ) { + int iX, iY; + iY = hb_arrayGetNI( pInfo->pNewVal, 2 ); iX = hb_arrayGetNI( pInfo->pNewVal, 1 ); @@ -2846,7 +3899,7 @@ static HB_BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) } } break; - } + case HB_GTI_RESIZABLE: pInfo->pResult = hb_itemPutL( pInfo->pResult, pWVT->bResizable ); if( pInfo->pNewVal ) @@ -3027,6 +4080,10 @@ static HB_BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) break; } + case HB_GTI_WINHANDLE: + pInfo->pResult = hb_itemPutPtr( pInfo->pResult, pWVT->hWnd ); + break; + default: return HB_GTSUPER_INFO( pGT, iType, pInfo ); } diff --git a/src/rtl/gtwvt/gtwvt.h b/src/rtl/gtwvt/gtwvt.h index c512bb90d5..684ad5ec93 100644 --- a/src/rtl/gtwvt/gtwvt.h +++ b/src/rtl/gtwvt/gtwvt.h @@ -86,6 +86,8 @@ #define WVT_DEFAULT_FONT_ATTR 0 #define WVT_DEFAULT_FONT_NAME TEXT( "Courier New" ) +#define WVT_EXTKEY_FLAG ( 1 << 24 ) + #define BLACK RGB( 0x00, 0x00, 0x00 ) #define BLUE RGB( 0x00, 0x00, 0xAA ) #define GREEN RGB( 0x00, 0xAA, 0x00 ) @@ -105,6 +107,153 @@ #define WM_MY_UPDATE_CARET ( WM_USER + 0x0101 ) +/* Box char unicode values */ +#define HB_BOXCH_ARROW_R 0x0010 /* ARROW RIGHT */ +#define HB_BOXCH_ARROW_L 0x0011 /* ARROW LEFT */ +#define HB_BOXCH_ARROW_U 0x001E /* ARROW UP */ +#define HB_BOXCH_ARROW_D 0x001F /* ARROW DOWN */ + +#define HB_BOXCH_CHR_BASE 4 + +#define HB_BOXCH_DBL_LT 0x2554 /* BOX DRAWINGS DOUBLE DOWN AND RIGHT (Double left top angle) */ +#define HB_BOXCH_DBL_TD 0x2566 /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL (Double top with junction down) */ +#define HB_BOXCH_DBL_RT 0x2557 /* BOX DRAWINGS DOUBLE DOWN AND LEFT (Double right top angle) */ + +#define HB_BOXCH_DBL_LB 0x255A /* BOX DRAWINGS DOUBLE UP AND RIGHT (Double left bottom angle) */ +#define HB_BOXCH_DBL_BU 0x2569 /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL (Double bottom with junction up) */ +#define HB_BOXCH_DBL_RB 0x255D /* BOX DRAWINGS DOUBLE DOWN AND LEFT (Double right bottom angle) */ + +#define HB_BOXCH_DBL_VL 0x2560 /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT (Double Vertical with left junction) */ +#define HB_BOXCH_DBL_VR 0x2563 /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT (Double vertical with right junction) */ +#define HB_BOXCH_DBL_CRS 0x256C /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL (Double cross) */ + +#define HB_BOXCH_DBL_HOR 0x2550 /* BOX DRAWINGS DOUBLE HORIZONTAL (Double Horizontal bar) */ +#define HB_BOXCH_DBL_VRT 0x2551 /* BOX DRAWINGS DOUBLE VERTICAL (Double Vertical bar) */ + +#define HB_BOXCH_SNG_LT 0x250C /* BOX DRAWINGS LIGHT DOWN AND RIGHT (Single left top angle) */ +#define HB_BOXCH_SNG_TD 0x252C /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL (Single top with junction down) */ +#define HB_BOXCH_SNG_RT 0x2510 /* BOX DRAWINGS LIGHT DOWN AND LEFT (Single right top angle) */ + +#define HB_BOXCH_SNG_LB 0x2514 /* BOX DRAWINGS LIGHT UP AND RIGHT (Single left bottom angle) */ +#define HB_BOXCH_SNG_BU 0x2534 /* BOX DRAWINGS LIGHT UP AND HORIZONTAL (Single bottom with junction up) */ +#define HB_BOXCH_SNG_RB 0x2518 /* BOX DRAWINGS LIGHT UP AND LEFT (Single right bottom angle) */ + +#define HB_BOXCH_SNG_VL 0x251C /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT (Single Vertical with left junction) */ +#define HB_BOXCH_SNG_VR 0x2524 /* BOX DRAWINGS LIGHT VERTICAL AND LEFT (Single vertical with right junction) */ +#define HB_BOXCH_SNG_CRS 0x253C /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL (Single cross) */ + +#define HB_BOXCH_SNG_HOR 0x2500 /* BOX DRAWINGS LIGHT HORIZONTAL (Single Horizontal bar) */ +#define HB_BOXCH_SNG_VRT 0x2502 /* BOX DRAWINGS LIGHT VERTICAL (Single Vertical bar) */ + + +#define HB_BOXCH_SNG_L_DBL_T 0x2552 /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE (Single left double top angle) */ +#define HB_BOXCH_SNG_T_DBL_D 0x2565 /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE (Single top with double junction down) */ +#define HB_BOXCH_SNG_R_DBL_T 0x2556 /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE (Single right double top angle) */ + +#define HB_BOXCH_SNG_L_DBL_B 0x2558 /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE (Single left double bottom angle) */ +#define HB_BOXCH_SNG_B_DBL_U 0x2568 /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE (Single bottom double with junction up) */ +#define HB_BOXCH_SNG_R_DBL_B 0x255C /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE (Single right double bottom angle) */ + +#define HB_BOXCH_SNG_V_DBL_L 0x255E /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE (Single Vertical double left junction) */ +#define HB_BOXCH_SNG_V_DBL_R 0x2561 /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE (Single vertical double right junction) */ +#define HB_BOXCH_SNG_DBL_CRS 0x256A /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE (Single cross (double horiz) */ + + +#define HB_BOXCH_DBL_L_SNG_T 0x2553 /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE (Double left single top angle) */ +#define HB_BOXCH_DBL_T_SNG_D 0x2564 /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE (Double top signle junction down) */ +#define HB_BOXCH_DBL_R_SNG_T 0x2555 /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE (Double right single top angle) */ + +#define HB_BOXCH_DBL_L_SNG_B 0x2559 /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE (Double left single bottom angle) */ +#define HB_BOXCH_DBL_B_SNG_U 0x2567 /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE (Double bottom single junction up) */ +#define HB_BOXCH_DBL_R_SNG_B 0x255B /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE (Double right single bottom angle) */ + +#define HB_BOXCH_DBL_V_SNG_R 0x2562 /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE (Double Vertical single left junction) */ +#define HB_BOXCH_DBL_V_SNG_L 0x255F /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE (Double vertical single right junction) */ +#define HB_BOXCH_DBL_SNG_CRS 0x256B /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE (Double cross (single horiz) */ + +#define HB_BOXCH_FULL 0x2588 /* FULL BLOCK */ +#define HB_BOXCH_FULL_B 0x2584 /* LOWER HALF BLOCK */ +#define HB_BOXCH_FULL_L 0x258C /* LEFT HALF BLOCK */ +#define HB_BOXCH_FULL_R 0x2590 /* RIGHT HALF BLOCK */ +#define HB_BOXCH_FULL_T 0x2580 /* UPPER HALF BLOCK */ + +#define HB_BOXCH_FILLER1 0x2591 /* LIGHT SHADE */ +#define HB_BOXCH_FILLER2 0x2592 /* MEDIUM SHADE */ +#define HB_BOXCH_FILLER3 0x2593 /* DARK SHADE */ + +#define HB_BOXCH_SQUARE 0x25A0 /* BLACK SQUARE */ + +#define HB_BOXCH_BOX_MIN 0x2500 +#define HB_BOXCH_BOX_MAX 0x25A0 + +#define HB_BOXCH_RC_ARROW_DL 0xE040 /* USER ARROW DOWN (LEFT) */ +#define HB_BOXCH_RC_ARROW_DR 0xE041 /* USER ARROW DOWN (RIGHT) */ +#define HB_BOXCH_RC_ARROW_UL 0xE042 /* USER ARROW UP (LEFT) */ +#define HB_BOXCH_RC_ARROW_UR 0xE043 /* USER ARROW UP (RIGHT) */ +#define HB_BOXCH_RC_ARROW_VL 0xE044 /* USER ARROWS UP/DOWN (LEFT) */ +#define HB_BOXCH_RC_ARROW_VR 0xE045 /* USER ARROWS UP/DOWN (RIGHT) */ +#define HB_BOXCH_RC_BUTTON_L 0xE046 /* USER BUTTON (LEFT) */ +#define HB_BOXCH_RC_BUTTON_R 0xE047 /* USER BUTTON (RIGHT) */ +#define HB_BOXCH_RC_ARROW_LL 0xE048 /* USER ARROW LEFT (LEFT) */ +#define HB_BOXCH_RC_ARROW_LR 0xE049 /* USER ARROW LEFT (RIGHT) */ +#define HB_BOXCH_RC_ARROW_RL 0xE04A /* USER ARROW RIGHT (LEFT) */ +#define HB_BOXCH_RC_ARROW_RR 0xE04B /* USER ARROW RIGHT (RIGHT) */ +#define HB_BOXCH_RC_ENTER1 0xE04C /* USER ENTER (LEFT) */ +#define HB_BOXCH_RC_ENTER2 0xE04D /* USER ENTER (MIDDLE) */ +#define HB_BOXCH_RC_ENTER3 0xE04E /* USER ENTER (RIGHT) */ +#define HB_BOXCH_RC_VSCRL_LD 0xE04F /* USER VERTICAL SCROLL (LEFT-DOWN) */ +#define HB_BOXCH_RC_VSCRL_RD 0xE050 /* USER VERTICAL SCROLL (RIGHT-DOWN) */ +#define HB_BOXCH_RC_VSCRL_LU 0xE051 /* USER VERTICAL SCROLL (LEFT-UP) */ +#define HB_BOXCH_RC_VSCRL_RU 0xE052 /* USER VERTICAL SCROLL (RIGHT-UP) */ +#define HB_BOXCH_RC_VSCRL_L 0xE053 /* USER VERTICAL SCROLL (LEFT) */ +#define HB_BOXCH_RC_VSCRL_R 0xE054 /* USER VERTICAL SCROLL (RIGHT) */ +#define HB_BOXCH_RC_HSCRL 0xE055 /* USER HORIZONTAL SCROLL */ + +#define HB_BOXCH_RC_0 0xE056 /* USER BIG 0 */ +#define HB_BOXCH_RC_1 0xE057 /* USER BIG 1 */ +#define HB_BOXCH_RC_2 0xE058 /* USER BIG 2 */ +#define HB_BOXCH_RC_3 0xE059 /* USER BIG 3 */ +#define HB_BOXCH_RC_4 0xE05A /* USER BIG 4 */ +#define HB_BOXCH_RC_5 0xE05B /* USER BIG 5 */ +#define HB_BOXCH_RC_6 0xE05C /* USER BIG 6 */ +#define HB_BOXCH_RC_7 0xE05D /* USER BIG 7 */ +#define HB_BOXCH_RC_8 0xE05E /* USER BIG 8 */ +#define HB_BOXCH_RC_9 0xE05F /* USER BIG 9 */ +#define HB_BOXCH_RC_DOT 0xE060 /* USER BIG DOT */ +#define HB_BOXCH_RC_ACC 0xE061 /* USER BIG ACCENT */ + +#define HB_BOXCH_RC_BOX_ML 0xE062 /* USER BOX MIDDLE LEFT */ +#define HB_BOXCH_RC_BOX_MR 0xE063 /* USER BOX MIDDLE RIGHT */ +#define HB_BOXCH_RC_HWND_L 0xE064 /* USER WINDOW HANDLE LEFT */ +#define HB_BOXCH_RC_HWND_R 0xE065 /* USER WINDOW HANDLE RIGHT */ +#define HB_BOXCH_RC_BOX_TL 0xE066 /* USER BOX TOP LEFT */ +#define HB_BOXCH_RC_BOX_T 0xE067 /* USER BOX TOP */ +#define HB_BOXCH_RC_BOX_TR 0xE068 /* USER BOX TOP RIGHT */ +#define HB_BOXCH_RC_BOX_R 0xE069 /* USER BOX RIGHT */ +#define HB_BOXCH_RC_BOX_BR 0xE06A /* USER BOX BOTTOM RIGHT */ +#define HB_BOXCH_RC_BOX_B 0xE06B /* USER BOX BOTTOM */ +#define HB_BOXCH_RC_BOX_BL 0xE06C /* USER BOX BOTTOM LEFT */ +#define HB_BOXCH_RC_BOX_L 0xE06D /* USER BOX LEFT */ +#define HB_BOXCH_RC_BOX_MT 0xE06E /* USER BOX MIDDLE TOP */ +#define HB_BOXCH_RC_BOX_MB 0xE06F /* USER BOX MIDDLE BOTTOM */ + +#define HB_BOXCH_RC_BUTTON_CL 0xE070 /* USER BUTTON CHECK (LEFT) */ +#define HB_BOXCH_RC_BUTTON_CR 0xE071 /* USER BUTTON CHECK (RIGHT) */ + +#define HB_BOXCH_RC_FARROW_DL 0xE072 /* USER FAT ARROW DOWN (LEFT) */ +#define HB_BOXCH_RC_FARROW_DR 0xE073 /* USER FAT ARROW DOWN (RIGHT) */ + +#define HB_BOXCH_RC_DOTS 0xE074 /* USER DOTS */ +#define HB_BOXCH_RC_DOTS_L 0xE075 /* USER BIG DOTS (LEFT) */ +#define HB_BOXCH_RC_DOTS_R 0xE076 /* USER BIG DOTS (RIGHT) */ + +#define HB_BOXCH_RC_MIN 0xE040 +#define HB_BOXCH_RC_MAX 0xE076 + +#define HB_BOXCH_TRANS_COUNT ( HB_BOXCH_CHR_BASE + ( HB_BOXCH_BOX_MAX - HB_BOXCH_BOX_MIN + 1 ) + ( HB_BOXCH_RC_MAX - HB_BOXCH_RC_MIN + 1 ) ) +#define HB_BOXCH_TRANS_MAX 0xFF + + typedef struct { PHB_GT pGT; /* core GT pointer */ @@ -126,12 +275,12 @@ typedef struct int CaretWidth; /* Width of solid caret */ POINT MousePos; /* the last mouse position */ - HB_BOOL MouseMove; /* Flag to say whether to return mouse movement events */ int Keys[ WVT_CHAR_QUEUE_SIZE ]; /* Array to hold the characters & events */ int keyPointerIn; /* Offset into key array for character to be placed */ int keyPointerOut; /* Offset into key array of next character to read */ - int keyLast; /* last inkey code value in buffer */ + int keyLastPos; /* last inkey code position in buffer */ + int keyFlags; /* keyboard modifiers */ POINT PTEXTSIZE; /* size of the fixed width font */ HB_BOOL FixedFont; /* HB_TRUE if current font is a fixed font */ @@ -162,9 +311,15 @@ typedef struct #else HB_WCHAR * wcTrans; /* unicode character translation table */ HB_SIZE wcTransLen; /* size of unicode character translation table */ + + HBITMAP boxImage[ HB_BOXCH_TRANS_MAX ]; + HB_UCHAR boxIndex[ HB_BOXCH_TRANS_COUNT ]; + int boxCount; + HDC hBmpDC; + HPEN hPen; + HBRUSH hBrush; #endif HB_BOOL Win9X; /* Flag to say if running on Win9X not NT/2000/XP */ - HB_BOOL AltF4Close; /* Can use Alt+F4 to close application */ HB_BOOL CentreWindow; /* HB_TRUE if window is to be Reset into centre of window */ HB_BOOL IgnoreWM_SYSCHAR; @@ -201,22 +356,6 @@ typedef struct } HB_GTWVT, * PHB_GTWVT; -/* xHarbour compatible definitions */ -#if ! defined( K_SH_LEFT ) -#define K_SH_LEFT K_LEFT /* Shift-Left == Left */ -#define K_SH_UP K_UP /* Shift-Up == Up */ -#define K_SH_RIGHT K_RIGHT /* Shift-Right == Right */ -#define K_SH_DOWN K_DOWN /* Shift-Down == Down */ -#define K_SH_INS K_INS /* Shift-Ins == Ins */ -#define K_SH_DEL K_DEL /* Shift-Del == Del */ -#define K_SH_HOME K_HOME /* Shift-Home == Home */ -#define K_SH_END K_END /* Shift-End == End */ -#define K_SH_PGUP K_PGUP /* Shift-PgUp == PgUp */ -#define K_SH_PGDN K_PGDN /* Shift-PgDn == PgDn */ -#define K_SH_RETURN K_RETURN /* Shift-Enter == Enter */ -#define K_SH_ENTER K_ENTER /* Shift-Enter == Enter */ -#endif - #ifndef WM_MOUSEWHEEL # define WM_MOUSEWHEEL 0x020A #endif diff --git a/src/rtl/gtxwc/gtxwc.c b/src/rtl/gtxwc/gtxwc.c index b00012968b..b66eb3abe7 100644 --- a/src/rtl/gtxwc/gtxwc.c +++ b/src/rtl/gtxwc/gtxwc.c @@ -82,150 +82,6 @@ static const int s_mousePressKeys[ XWC_MAX_BUTTONS ] = { K_LBUTTONDOWN, K_MBU static const int s_mouseReleaseKeys[ XWC_MAX_BUTTONS ] = { K_LBUTTONUP, K_MBUTTONUP, K_RBUTTONUP }; static const int s_mouseDblPressKeys[ XWC_MAX_BUTTONS ] = { K_LDBLCLK, K_MDBLCLK, K_RDBLCLK , K_MWFORWARD, K_MWBACKWARD }; -typedef struct -{ - int key; - int alt_key; - int ctrl_key; - int shift_key; -} ClipKeyCode; - -/* The tables below are indexed by internal key value, - * It cause that we don't have to make any linear scans - * to access proper ClipKeyCode entry - */ -static const ClipKeyCode s_stdKeyTab[ CLIP_STDKEY_COUNT ] = { - { K_SPACE, 0, 0, 0 }, /* 32 */ - { '!', 0, 0, 0 }, /* 33 */ - { '"', 0, 0, 0 }, /* 34 */ - { '#', 0, 0, 0 }, /* 35 */ - { '$', 0, 0, 0 }, /* 36 */ - { '%', 0, 0, 0 }, /* 37 */ - { '&', 0, 0, 0 }, /* 38 */ - { '\'', 296, 7, 0 }, /* 39 */ - { '(', 0, 0, 0 }, /* 40 */ - { ')', 0, 0, 0 }, /* 41 */ - { '*', 0, 0, 0 }, /* 42 */ - { '+', 0, 0, 0 }, /* 43 */ - { ',', 307, 0, 0 }, /* 44 */ - { '-', 386, 31, 0 }, /* 45 */ - { '.', 308, 0, 0 }, /* 46 */ - { '/', K_CTRL_QUESTION, 127, 0 }, /* 47 */ - { '0', K_ALT_0, 0, 0 }, /* 48 */ - { '1', K_ALT_1, 0, 0 }, /* 49 */ - { '2', K_ALT_2, 259, 0 }, /* 50 */ - { '3', K_ALT_3, 27, 0 }, /* 51 */ - { '4', K_ALT_4, 28, 0 }, /* 52 */ - { '5', K_ALT_5, 29, 0 }, /* 53 */ - { '6', K_ALT_6, 30, 0 }, /* 54 */ - { '7', K_ALT_7, 31, 0 }, /* 55 */ - { '8', K_ALT_8, 127, 0 }, /* 56 */ - { '9', K_ALT_9, 0, 0 }, /* 57 */ - { ':', 0, 0, 0 }, /* 58 */ - { ';', 295, 0, 0 }, /* 59 */ - { '<', 0, 0, 0 }, /* 60 */ - { '=', K_ALT_EQUALS, 0, 0 }, /* 61 */ - { '>', 0, 0, 0 }, /* 62 */ - { '?', 0, K_CTRL_QUESTION, 0 }, /* 63 */ - { '@', 0, 0, 0 }, /* 64 */ - { 'A', K_ALT_A, K_CTRL_A, 0 }, /* 65 */ - { 'B', K_ALT_B, K_CTRL_B, 0 }, /* 66 */ - { 'C', K_ALT_C, K_CTRL_C, 0 }, /* 67 */ - { 'D', K_ALT_D, K_CTRL_D, 0 }, /* 68 */ - { 'E', K_ALT_E, K_CTRL_E, 0 }, /* 69 */ - { 'F', K_ALT_F, K_CTRL_F, 0 }, /* 70 */ - { 'G', K_ALT_G, K_CTRL_G, 0 }, /* 71 */ - { 'H', K_ALT_H, K_CTRL_H, 0 }, /* 72 */ - { 'I', K_ALT_I, K_CTRL_I, 0 }, /* 73 */ - { 'J', K_ALT_J, K_CTRL_J, 0 }, /* 74 */ - { 'K', K_ALT_K, K_CTRL_K, 0 }, /* 75 */ - { 'L', K_ALT_L, K_CTRL_L, 0 }, /* 76 */ - { 'M', K_ALT_M, K_CTRL_M, 0 }, /* 77 */ - { 'N', K_ALT_N, K_CTRL_N, 0 }, /* 78 */ - { 'O', K_ALT_O, K_CTRL_O, 0 }, /* 79 */ - { 'P', K_ALT_P, K_CTRL_P, 0 }, /* 80 */ - { 'Q', K_ALT_Q, K_CTRL_Q, 0 }, /* 81 */ - { 'R', K_ALT_R, K_CTRL_R, 0 }, /* 82 */ - { 'S', K_ALT_S, K_CTRL_S, 0 }, /* 83 */ - { 'T', K_ALT_T, K_CTRL_T, 0 }, /* 84 */ - { 'U', K_ALT_U, K_CTRL_U, 0 }, /* 85 */ - { 'V', K_ALT_V, K_CTRL_V, 0 }, /* 86 */ - { 'W', K_ALT_W, K_CTRL_W, 0 }, /* 87 */ - { 'X', K_ALT_X, K_CTRL_X, 0 }, /* 88 */ - { 'Y', K_ALT_Y, K_CTRL_Y, 0 }, /* 89 */ - { 'Z', K_ALT_Z, K_CTRL_Z, 0 }, /* 90 */ - { '[', 282, 27, 0 }, /* 91 */ - { '\\', 299, 28, 0 }, /* 92 */ - { ']', 283, 29, 0 }, /* 93 */ - { '^', K_ALT_6, 30, 0 }, /* 94 */ - { '_', 386, 31, 0 }, /* 95 */ - { '`', 297, 297, 0 }, /* 96 */ - { 'a', K_ALT_A, K_CTRL_A, 0 }, /* 97 */ - { 'b', K_ALT_B, K_CTRL_B, 0 }, /* 98 */ - { 'c', K_ALT_C, K_CTRL_C, 0 }, /* 99 */ - { 'd', K_ALT_D, K_CTRL_D, 0 }, /* 100 */ - { 'e', K_ALT_E, K_CTRL_E, 0 }, /* 101 */ - { 'f', K_ALT_F, K_CTRL_F, 0 }, /* 102 */ - { 'g', K_ALT_G, K_CTRL_G, 0 }, /* 103 */ - { 'h', K_ALT_H, K_CTRL_H, 0 }, /* 104 */ - { 'i', K_ALT_I, K_CTRL_I, 0 }, /* 105 */ - { 'j', K_ALT_J, K_CTRL_J, 0 }, /* 106 */ - { 'k', K_ALT_K, K_CTRL_K, 0 }, /* 107 */ - { 'l', K_ALT_L, K_CTRL_L, 0 }, /* 108 */ - { 'm', K_ALT_M, K_CTRL_M, 0 }, /* 109 */ - { 'n', K_ALT_N, K_CTRL_N, 0 }, /* 110 */ - { 'o', K_ALT_O, K_CTRL_O, 0 }, /* 111 */ - { 'p', K_ALT_P, K_CTRL_P, 0 }, /* 112 */ - { 'q', K_ALT_Q, K_CTRL_Q, 0 }, /* 113 */ - { 'r', K_ALT_R, K_CTRL_R, 0 }, /* 114 */ - { 's', K_ALT_S, K_CTRL_S, 0 }, /* 115 */ - { 't', K_ALT_T, K_CTRL_T, 0 }, /* 116 */ - { 'u', K_ALT_U, K_CTRL_U, 0 }, /* 117 */ - { 'v', K_ALT_V, K_CTRL_V, 0 }, /* 118 */ - { 'w', K_ALT_W, K_CTRL_W, 0 }, /* 119 */ - { 'x', K_ALT_X, K_CTRL_X, 0 }, /* 120 */ - { 'y', K_ALT_Y, K_CTRL_Y, 0 }, /* 121 */ - { 'z', K_ALT_Z, K_CTRL_Z, 0 }, /* 122 */ - { '{', 282, 27, 0 }, /* 123 */ - { '|', 299, 28, 0 }, /* 124 */ - { '}', 283, 29, 0 }, /* 125 */ - { '~', 297, 297, 0 }, /* 126 */ - { K_CTRL_BS, K_ALT_BS, 127, 0 }, /* 127 */ -}; - -static const ClipKeyCode s_extKeyTab[ CLIP_EXTKEY_COUNT ] = { - {K_F1, K_ALT_F1, K_CTRL_F1, K_SH_F1}, /* 00 */ - {K_F2, K_ALT_F2, K_CTRL_F2, K_SH_F2}, /* 01 */ - {K_F3, K_ALT_F3, K_CTRL_F3, K_SH_F3}, /* 02 */ - {K_F4, K_ALT_F4, K_CTRL_F4, K_SH_F4}, /* 03 */ - {K_F5, K_ALT_F5, K_CTRL_F5, K_SH_F5}, /* 04 */ - {K_F6, K_ALT_F6, K_CTRL_F6, K_SH_F6}, /* 05 */ - {K_F7, K_ALT_F7, K_CTRL_F7, K_SH_F7}, /* 06 */ - {K_F8, K_ALT_F8, K_CTRL_F8, K_SH_F8}, /* 07 */ - {K_F9, K_ALT_F9, K_CTRL_F9, K_SH_F9}, /* 08 */ - {K_F10, K_ALT_F10, K_CTRL_F10, K_SH_F10}, /* 09 */ - {K_F11, K_ALT_F11, K_CTRL_F11, K_SH_F11}, /* 10 */ - {K_F12, K_ALT_F12, K_CTRL_F12, K_SH_F12}, /* 11 */ - {K_UP, K_ALT_UP, K_CTRL_UP, K_SH_UP}, /* 12 */ - {K_DOWN, K_ALT_DOWN, K_CTRL_DOWN, K_SH_DOWN}, /* 13 */ - {K_LEFT, K_ALT_LEFT, K_CTRL_LEFT, K_SH_LEFT}, /* 14 */ - {K_RIGHT, K_ALT_RIGHT, K_CTRL_RIGHT, K_SH_RIGHT}, /* 15 */ - {K_INS, K_ALT_INS, K_CTRL_INS, K_SH_INS}, /* 16 */ - {K_DEL, K_ALT_DEL, K_CTRL_DEL, K_SH_DEL}, /* 17 */ - {K_HOME, K_ALT_HOME, K_CTRL_HOME, K_SH_HOME}, /* 18 */ - {K_END, K_ALT_END, K_CTRL_END, K_SH_END}, /* 19 */ - {K_PGUP, K_ALT_PGUP, K_CTRL_PGUP, K_SH_PGUP}, /* 20 */ - {K_PGDN, K_ALT_PGDN, K_CTRL_PGDN, K_SH_PGDN}, /* 21 */ - {K_BS, K_ALT_BS, 127, K_SH_BS}, /* 22 */ - {K_TAB, K_ALT_TAB, K_CTRL_TAB, K_SH_TAB}, /* 23 */ - {K_ESC, K_ALT_ESC, K_ESC, 0}, /* 24 */ - {K_ENTER, K_ALT_ENTER, K_CTRL_ENTER, 0}, /* 25 */ - {K_ENTER, KP_ALT_ENTER, K_CTRL_ENTER, 0}, /* 26 */ - {KP_CENTER, 0, KP_CTRL_5, 0}, /* 27 */ - {0, 0, K_CTRL_PRTSCR, 0}, /* 28 */ - {0, 0, HB_BREAK_FLAG, 0} /* 29 */ -}; - /* these are standard PC console colors in RGB */ static const int s_rgb_values[] = { 0x000000, /* black "rgb:00/00/00" */ @@ -399,9 +255,9 @@ typedef struct HB_ULONG * pCurrScr; /* character translation table, it changes some characters in screen buffer into graphs primitives */ - XWC_CharTrans boxTrans[ HB_GTXWC_TRANS_MAX ]; - HB_UCHAR boxIndex[ HB_GTXWC_TRANS_COUNT ]; - int transCount; + XWC_CharTrans boxTrans[ HB_BOXCH_TRANS_MAX ]; + HB_UCHAR boxIndex[ HB_BOXCH_TRANS_COUNT ]; + int boxCount; HB_BOOL fInvalidChr; XWC_RECT rInvalidChr; @@ -599,10 +455,10 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT int celly = wnd->fontHeight; int i, y, x, yy, xx, skip, start, mod; - if( usCh >= HB_GTXWC_RC_MIN && usCh <= HB_GTXWC_RC_MAX ) + if( usCh >= HB_BOXCH_RC_MIN && usCh <= HB_BOXCH_RC_MAX ) switch( usCh ) { - case HB_GTXWC_RC_ARROW_DL: + case HB_BOXCH_RC_ARROW_DL: size = hb_gt_xwc_DefineBoxButtonL( segs, cellx, celly ); yy = celly / 2 - 1; for( y = celly - 4, x = cellx - 1; x >= 3 && y >= yy && size < XWC_MAX_CHAR_SEGS; --x, --y ) @@ -625,7 +481,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_ARROW_DR: + case HB_BOXCH_RC_ARROW_DR: size = hb_gt_xwc_DefineBoxButtonR( segs, cellx, celly ); yy = ( celly + 1 ) / 2; for( y = celly - 5, x = 0; x < cellx - 4 && y >= yy && size < XWC_MAX_CHAR_SEGS; ++x, --y ) @@ -648,7 +504,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_ARROW_UL: + case HB_BOXCH_RC_ARROW_UL: size = hb_gt_xwc_DefineBoxButtonL( segs, cellx, celly ); yy = ( celly + 1 ) / 2; for( y = 3, x = cellx - 1; x >= 3 && y <= yy && size < XWC_MAX_CHAR_SEGS; --x, ++y ) @@ -671,7 +527,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_ARROW_UR: + case HB_BOXCH_RC_ARROW_UR: size = hb_gt_xwc_DefineBoxButtonR( segs, cellx, celly ); yy = ( celly + 1 ) / 2; for( y = 4, x = 0; x < cellx - 4 && y <= yy && size < XWC_MAX_CHAR_SEGS; ++x, ++y ) @@ -694,7 +550,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_ARROW_VL: + case HB_BOXCH_RC_ARROW_VL: size = hb_gt_xwc_DefineBoxButtonL( segs, cellx, celly ); yy = ( celly - 1 ) / 2; for( y = 3, x = cellx - 1; x >= 3 && y < yy && size < XWC_MAX_CHAR_SEGS; --x, ++y ) @@ -716,7 +572,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_ARROW_VR: + case HB_BOXCH_RC_ARROW_VR: size = hb_gt_xwc_DefineBoxButtonR( segs, cellx, celly ); yy = ( celly - 1 ) / 2; for( y = 4, x = 0; x < cellx - 4 && y < yy && size < XWC_MAX_CHAR_SEGS; ++x, ++y ) @@ -727,7 +583,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT segs[ size ].y2 = y; size++; } - for( y += 2, --x; x >= 0 && y < celly - 3 && size < XWC_MAX_CHAR_SEGS; --x, ++y ) + for( y = yy + 2, --x; x >= 0 && y < celly - 3 && size < XWC_MAX_CHAR_SEGS; --x, ++y ) { segs[ size ].x1 = 0; segs[ size ].y1 = y; @@ -738,17 +594,17 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BUTTON_L: + case HB_BOXCH_RC_BUTTON_L: size = hb_gt_xwc_DefineBoxButtonL( segs, cellx, celly ); type = CH_SEG; break; - case HB_GTXWC_RC_BUTTON_R: + case HB_BOXCH_RC_BUTTON_R: size = hb_gt_xwc_DefineBoxButtonR( segs, cellx, celly ); type = CH_SEG; break; - case HB_GTXWC_RC_ARROW_LL: + case HB_BOXCH_RC_ARROW_LL: size = hb_gt_xwc_DefineBoxButtonL( segs, cellx, celly ); yy = ( celly - 1 ) / 2; for( x = 3, y = 0; x < cellx && size < XWC_MAX_CHAR_SEGS; ++x, ++y ) @@ -762,7 +618,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_ARROW_LR: + case HB_BOXCH_RC_ARROW_LR: size = hb_gt_xwc_DefineBoxButtonR( segs, cellx, celly ); yy = HB_MAX( celly / 5, 3 ) | 1; for( y = ( celly - yy ) / 2; yy-- && size < XWC_MAX_CHAR_SEGS; ++y ) @@ -776,7 +632,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_ARROW_RL: + case HB_BOXCH_RC_ARROW_RL: size = hb_gt_xwc_DefineBoxButtonL( segs, cellx, celly ); yy = HB_MAX( celly / 5, 3 ) | 1; for( y = ( celly - yy ) / 2; yy-- && size < XWC_MAX_CHAR_SEGS; ++y ) @@ -790,7 +646,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_ARROW_RR: + case HB_BOXCH_RC_ARROW_RR: size = hb_gt_xwc_DefineBoxButtonR( segs, cellx, celly ); yy = ( celly - 1 ) / 2; for( x = cellx - 4, y = 0; x >= 0 && size < XWC_MAX_CHAR_SEGS; --x, ++y ) @@ -804,17 +660,17 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_ENTER1: + case HB_BOXCH_RC_ENTER1: /* TODO */ break; - case HB_GTXWC_RC_ENTER2: + case HB_BOXCH_RC_ENTER2: /* TODO */ break; - case HB_GTXWC_RC_ENTER3: + case HB_BOXCH_RC_ENTER3: /* TODO */ break; - case HB_GTXWC_RC_VSCRL_LD: + case HB_BOXCH_RC_VSCRL_LD: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -846,7 +702,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT } break; - case HB_GTXWC_RC_VSCRL_RD: + case HB_BOXCH_RC_VSCRL_RD: segs[ 0 ].x1 = cellx - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -883,7 +739,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT } break; - case HB_GTXWC_RC_VSCRL_LU: + case HB_BOXCH_RC_VSCRL_LU: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -910,7 +766,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT } break; - case HB_GTXWC_RC_VSCRL_RU: + case HB_BOXCH_RC_VSCRL_RU: segs[ 0 ].x1 = cellx - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -942,7 +798,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT } break; - case HB_GTXWC_RC_VSCRL_L: + case HB_BOXCH_RC_VSCRL_L: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -964,7 +820,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT } break; - case HB_GTXWC_RC_VSCRL_R: + case HB_BOXCH_RC_VSCRL_R: segs[ 0 ].x1 = cellx - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -986,7 +842,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT } break; - case HB_GTXWC_RC_HSCRL: + case HB_BOXCH_RC_HSCRL: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = cellx - 1; @@ -1013,68 +869,68 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT } break; - case HB_GTXWC_RC_0: + case HB_BOXCH_RC_0: type = CH_CHAR; usCh = '0'; /* TODO */ break; - case HB_GTXWC_RC_1: + case HB_BOXCH_RC_1: type = CH_CHAR; usCh = '1'; /* TODO */ break; - case HB_GTXWC_RC_2: + case HB_BOXCH_RC_2: type = CH_CHAR; usCh = '2'; /* TODO */ break; - case HB_GTXWC_RC_3: + case HB_BOXCH_RC_3: type = CH_CHAR; usCh = '3'; /* TODO */ break; - case HB_GTXWC_RC_4: + case HB_BOXCH_RC_4: type = CH_CHAR; usCh = '4'; /* TODO */ break; - case HB_GTXWC_RC_5: + case HB_BOXCH_RC_5: type = CH_CHAR; usCh = '5'; /* TODO */ break; - case HB_GTXWC_RC_6: + case HB_BOXCH_RC_6: type = CH_CHAR; usCh = '6'; /* TODO */ break; - case HB_GTXWC_RC_7: + case HB_BOXCH_RC_7: type = CH_CHAR; usCh = '7'; /* TODO */ break; - case HB_GTXWC_RC_8: + case HB_BOXCH_RC_8: type = CH_CHAR; usCh = '8'; /* TODO */ break; - case HB_GTXWC_RC_9: + case HB_BOXCH_RC_9: type = CH_CHAR; usCh = '9'; /* TODO */ break; - case HB_GTXWC_RC_DOT: + case HB_BOXCH_RC_DOT: type = CH_CHAR; usCh = '.'; /* TODO */ break; - case HB_GTXWC_RC_ACC: + case HB_BOXCH_RC_ACC: type = CH_CHAR; usCh = '\''; /* TODO */ break; - case HB_GTXWC_RC_BOX_ML: + case HB_BOXCH_RC_BOX_ML: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2; segs[ 0 ].x2 = cellx - 1; @@ -1089,7 +945,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_MR: + case HB_BOXCH_RC_BOX_MR: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2; segs[ 0 ].x2 = cellx - 1; @@ -1104,7 +960,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_HWND_L: + case HB_BOXCH_RC_HWND_L: segs[ 0 ].x1 = cellx - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = 0; @@ -1144,7 +1000,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_HWND_R: + case HB_BOXCH_RC_HWND_R: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = cellx - 1; @@ -1189,7 +1045,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_TL: + case HB_BOXCH_RC_BOX_TL: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = cellx - 1; @@ -1204,7 +1060,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_T: + case HB_BOXCH_RC_BOX_T: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = cellx - 1; @@ -1214,7 +1070,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_TR: + case HB_BOXCH_RC_BOX_TR: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = cellx - 1; @@ -1229,7 +1085,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_R: + case HB_BOXCH_RC_BOX_R: segs[ 0 ].x1 = cellx - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1239,7 +1095,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_BR: + case HB_BOXCH_RC_BOX_BR: segs[ 0 ].x1 = cellx - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1254,7 +1110,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_B: + case HB_BOXCH_RC_BOX_B: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly - 1; segs[ 0 ].x2 = cellx - 1; @@ -1264,7 +1120,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_BL: + case HB_BOXCH_RC_BOX_BL: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1279,7 +1135,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_L: + case HB_BOXCH_RC_BOX_L: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1289,7 +1145,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_MT: + case HB_BOXCH_RC_BOX_MT: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1304,7 +1160,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BOX_MB: + case HB_BOXCH_RC_BOX_MB: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1319,7 +1175,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BUTTON_CL: + case HB_BOXCH_RC_BUTTON_CL: size = hb_gt_xwc_DefineBoxButtonL( segs, cellx, celly ); yy = celly - 2 / 3; xx = cellx - 4; @@ -1348,7 +1204,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_BUTTON_CR: + case HB_BOXCH_RC_BUTTON_CR: size = hb_gt_xwc_DefineBoxButtonR( segs, cellx, celly ); yy = celly - 2 / 3; xx = cellx - 4; @@ -1368,7 +1224,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_FARROW_DL: + case HB_BOXCH_RC_FARROW_DL: size = hb_gt_xwc_DefineBoxButtonL( segs, cellx, celly ); yy = ( celly - cellx ) / 2 + 1; yy = HB_MAX( yy, 2 ); @@ -1383,7 +1239,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_FARROW_DR: + case HB_BOXCH_RC_FARROW_DR: size = hb_gt_xwc_DefineBoxButtonR( segs, cellx, celly ); yy = ( celly - cellx ) / 2 + 1; yy = HB_MAX( yy, 2 ); @@ -1398,7 +1254,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_RC_DOTS: + case HB_BOXCH_RC_DOTS: pts[ 0 ].x = 1; pts[ 0 ].y = celly / 2; size++; @@ -1411,7 +1267,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_PTS; break; - case HB_GTXWC_RC_DOTS_L: + case HB_BOXCH_RC_DOTS_L: i = cellx / 2; xx = i - i / 2; yy = HB_MAX( 2, xx - 1 ); @@ -1430,7 +1286,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_RECT; break; - case HB_GTXWC_RC_DOTS_R: + case HB_BOXCH_RC_DOTS_R: i = cellx / 2; xx = i - i / 2; yy = HB_MAX( 2, xx - 1 ); @@ -1452,15 +1308,15 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT else switch( usCh ) { - case HB_GTXWC_FILLER1: - case HB_GTXWC_FILLER2: - case HB_GTXWC_FILLER3: - if( usCh == HB_GTXWC_FILLER1 ) + case HB_BOXCH_FILLER1: + case HB_BOXCH_FILLER2: + case HB_BOXCH_FILLER3: + if( usCh == HB_BOXCH_FILLER1 ) { skip = 4; start = mod = 1; } - else if( usCh == HB_GTXWC_FILLER2 ) + else if( usCh == HB_BOXCH_FILLER2 ) { skip = 2; start = 0; @@ -1493,7 +1349,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = size == 0 ? CH_NONE : CH_PTS; break; - case HB_GTXWC_ARROW_R: + case HB_BOXCH_ARROW_R: i = HB_MIN( ( celly >> 1 ), cellx ) - 3; pts[ 0 ].x = ( ( cellx - i ) >> 1 ); pts[ 0 ].y = ( celly >> 1 ) - i; @@ -1505,7 +1361,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_POLY; break; - case HB_GTXWC_ARROW_L: + case HB_BOXCH_ARROW_L: i = HB_MIN( ( celly >> 1 ), cellx ) - 3; pts[ 0 ].x = ( ( cellx - i ) >> 1 ) + i; pts[ 0 ].y = ( celly >> 1 ) - i; @@ -1517,7 +1373,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_POLY; break; - case HB_GTXWC_ARROW_U: + case HB_BOXCH_ARROW_U: i = HB_MIN( celly, cellx >> 1 ); pts[ 0 ].x = ( cellx >> 1 ) - i; pts[ 0 ].y = ( ( celly - i ) >> 1 ) + i; @@ -1529,7 +1385,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_POLY; break; - case HB_GTXWC_ARROW_D: + case HB_BOXCH_ARROW_D: i = HB_MIN( celly, cellx >> 1 ); pts[ 0 ].x = ( cellx >> 1 ) - i; pts[ 0 ].y = ( ( celly - i ) >> 1 ); @@ -1541,14 +1397,14 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_POLY; break; - case HB_GTXWC_FULL: + case HB_BOXCH_FULL: inverse = HB_TRUE; type = CH_NONE; break; - case HB_GTXWC_FULL_B: + case HB_BOXCH_FULL_B: inverse = HB_TRUE; - case HB_GTXWC_FULL_T: + case HB_BOXCH_FULL_T: rect[ 0 ].x = 0; rect[ 0 ].y = 0; rect[ 0 ].width = cellx; @@ -1557,9 +1413,9 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_RECT; break; - case HB_GTXWC_FULL_R: + case HB_BOXCH_FULL_R: inverse = HB_TRUE; - case HB_GTXWC_FULL_L: + case HB_BOXCH_FULL_L: rect[ 0 ].x = 0; rect[ 0 ].y = 0; rect[ 0 ].width = cellx / 2; @@ -1568,7 +1424,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_RECT; break; - case HB_GTXWC_SNG_LT: + case HB_BOXCH_SNG_LT: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = celly - 1; segs[ 0 ].x2 = cellx / 2; @@ -1583,7 +1439,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_TD: + case HB_BOXCH_SNG_TD: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2; segs[ 0 ].x2 = cellx - 1; @@ -1598,7 +1454,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_RT: + case HB_BOXCH_SNG_RT: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = celly - 1; segs[ 0 ].x2 = cellx / 2; @@ -1613,7 +1469,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_LB: + case HB_BOXCH_SNG_LB: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = cellx / 2; @@ -1628,7 +1484,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_BU: + case HB_BOXCH_SNG_BU: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = cellx / 2; @@ -1643,7 +1499,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_RB: + case HB_BOXCH_SNG_RB: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = cellx / 2; @@ -1658,7 +1514,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_VL: + case HB_BOXCH_SNG_VL: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1673,7 +1529,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_VR: + case HB_BOXCH_SNG_VR: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1688,7 +1544,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_CRS: + case HB_BOXCH_SNG_CRS: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1703,7 +1559,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_HOR: + case HB_BOXCH_SNG_HOR: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2; segs[ 0 ].x2 = cellx - 1; @@ -1713,7 +1569,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_VRT: + case HB_BOXCH_SNG_VRT: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1723,7 +1579,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_LT: + case HB_BOXCH_DBL_LT: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = celly - 1; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1748,7 +1604,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_TD: + case HB_BOXCH_DBL_TD: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2 - 1; segs[ 0 ].x2 = cellx - 1; @@ -1778,7 +1634,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_RT: + case HB_BOXCH_DBL_RT: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = celly - 1; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1803,7 +1659,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_LB: + case HB_BOXCH_DBL_LB: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1828,7 +1684,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_BU: + case HB_BOXCH_DBL_BU: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2 + 1; segs[ 0 ].x2 = cellx - 1; @@ -1858,7 +1714,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_RB: + case HB_BOXCH_DBL_RB: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1883,7 +1739,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_VL: + case HB_BOXCH_DBL_VL: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1914,7 +1770,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT break; - case HB_GTXWC_DBL_VR: + case HB_BOXCH_DBL_VR: segs[ 0 ].x1 = cellx / 2 + 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1944,7 +1800,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_CRS: + case HB_BOXCH_DBL_CRS: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -1989,7 +1845,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_HOR: + case HB_BOXCH_DBL_HOR: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2 + 1; segs[ 0 ].x2 = cellx - 1; @@ -2004,7 +1860,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_VRT: + case HB_BOXCH_DBL_VRT: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -2019,7 +1875,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_L_DBL_T: + case HB_BOXCH_SNG_L_DBL_T: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = celly / 2 - 1; segs[ 0 ].x2 = cellx - 1; @@ -2039,7 +1895,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_T_DBL_D: + case HB_BOXCH_SNG_T_DBL_D: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2; segs[ 0 ].x2 = cellx - 1; @@ -2059,7 +1915,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_R_DBL_T: + case HB_BOXCH_SNG_R_DBL_T: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2; segs[ 0 ].x2 = cellx / 2 + 1; @@ -2079,7 +1935,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_L_DBL_B: + case HB_BOXCH_SNG_L_DBL_B: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = celly / 2 - 1; segs[ 0 ].x2 = cellx - 1; @@ -2099,7 +1955,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_B_DBL_U: + case HB_BOXCH_SNG_B_DBL_U: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2; segs[ 0 ].x2 = cellx - 1; @@ -2119,7 +1975,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_R_DBL_B: + case HB_BOXCH_SNG_R_DBL_B: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2; segs[ 0 ].x2 = cellx / 2 + 1; @@ -2139,7 +1995,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_V_DBL_L: + case HB_BOXCH_SNG_V_DBL_L: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -2159,7 +2015,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_V_DBL_R: + case HB_BOXCH_SNG_V_DBL_R: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -2179,7 +2035,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SNG_DBL_CRS: + case HB_BOXCH_SNG_DBL_CRS: segs[ 0 ].x1 = cellx / 2; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -2199,7 +2055,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_L_SNG_T: + case HB_BOXCH_DBL_L_SNG_T: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = celly / 2; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -2219,7 +2075,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_T_SNG_D: + case HB_BOXCH_DBL_T_SNG_D: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2 - 1; segs[ 0 ].x2 = cellx - 1; @@ -2239,7 +2095,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_R_SNG_T: + case HB_BOXCH_DBL_R_SNG_T: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2 - 1; segs[ 0 ].x2 = cellx / 2; @@ -2259,7 +2115,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_L_SNG_B: + case HB_BOXCH_DBL_L_SNG_B: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -2279,7 +2135,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_B_SNG_U: + case HB_BOXCH_DBL_B_SNG_U: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2 - 1; segs[ 0 ].x2 = cellx - 1; @@ -2299,7 +2155,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_R_SNG_B: + case HB_BOXCH_DBL_R_SNG_B: segs[ 0 ].x1 = 0; segs[ 0 ].y1 = celly / 2 - 1; segs[ 0 ].x2 = cellx / 2; @@ -2319,7 +2175,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_V_SNG_L: + case HB_BOXCH_DBL_V_SNG_L: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -2339,7 +2195,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_V_SNG_R: + case HB_BOXCH_DBL_V_SNG_R: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -2359,7 +2215,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_DBL_SNG_CRS: + case HB_BOXCH_DBL_SNG_CRS: segs[ 0 ].x1 = cellx / 2 - 1; segs[ 0 ].y1 = 0; segs[ 0 ].x2 = segs[ 0 ].x1; @@ -2379,7 +2235,7 @@ static HB_BOOL hb_gt_xwc_DefineBoxChar( PXWND_DEF wnd, HB_USHORT usCh, XWC_CharT type = CH_SEG; break; - case HB_GTXWC_SQUARE: + case HB_BOXCH_SQUARE: rect[ 0 ].width = cellx - HB_MAX( cellx >> 2, 2 ); rect[ 0 ].height = rect[ 0 ].width; rect[ 0 ].x = ( ( cellx - rect[ 0 ].width ) >> 1 ); @@ -2435,7 +2291,7 @@ static void hb_gt_xwc_ResetCharTrans( PXWND_DEF wnd ) { int i; - for( i = 0; i <= wnd->transCount; i++ ) + for( i = 0; i <= wnd->boxCount; i++ ) { switch( wnd->boxTrans[ i ].type ) { @@ -2458,15 +2314,15 @@ static void hb_gt_xwc_ResetCharTrans( PXWND_DEF wnd ) } } memset( wnd->boxTrans, 0, sizeof( wnd->boxTrans ) ); - wnd->transCount = 0; + wnd->boxCount = 0; wnd->boxTrans[ 0 ].type = CH_CHAR; wnd->boxTrans[ 0 ].u.ch16 = 0; wnd->boxTrans[ 0 ].size = 0; wnd->boxTrans[ 0 ].inverse = HB_FALSE; - for( i = 0; i < HB_GTXWC_TRANS_COUNT; ++i ) - wnd->boxIndex[ i ] = HB_GTXWC_TRANS_MAX; + for( i = 0; i < HB_BOXCH_TRANS_COUNT; ++i ) + wnd->boxIndex[ i ] = HB_BOXCH_TRANS_MAX; } /* *********************************************************************** */ @@ -2481,20 +2337,20 @@ static XWC_CharTrans * hb_gt_xwc_GetBoxChar( PXWND_DEF wnd, HB_USHORT uc16 ) return &wnd->boxTrans[ 0 ]; } - if ( uc16 == HB_GTXWC_ARROW_R ) + if ( uc16 == HB_BOXCH_ARROW_R ) iPos = 0; - else if( uc16 == HB_GTXWC_ARROW_L ) + else if( uc16 == HB_BOXCH_ARROW_L ) iPos = 1; - else if( uc16 == HB_GTXWC_ARROW_U ) + else if( uc16 == HB_BOXCH_ARROW_U ) iPos = 2; - else if( uc16 == HB_GTXWC_ARROW_D ) + else if( uc16 == HB_BOXCH_ARROW_D ) iPos = 3; - else if( uc16 >= HB_GTXWC_BOX_MIN && uc16 <= HB_GTXWC_BOX_MAX ) - iPos = HB_GTXWC_CHR_BASE + - ( uc16 - HB_GTXWC_BOX_MIN ); - else if( uc16 >= HB_GTXWC_RC_MIN && uc16 <= HB_GTXWC_RC_MAX ) - iPos = HB_GTXWC_CHR_BASE + ( HB_GTXWC_BOX_MAX - HB_GTXWC_BOX_MIN + 1 ) + - ( uc16 - HB_GTXWC_RC_MIN ); + else if( uc16 >= HB_BOXCH_BOX_MIN && uc16 <= HB_BOXCH_BOX_MAX ) + iPos = HB_BOXCH_CHR_BASE + + ( uc16 - HB_BOXCH_BOX_MIN ); + else if( uc16 >= HB_BOXCH_RC_MIN && uc16 <= HB_BOXCH_RC_MAX ) + iPos = HB_BOXCH_CHR_BASE + ( HB_BOXCH_BOX_MAX - HB_BOXCH_BOX_MIN + 1 ) + + ( uc16 - HB_BOXCH_RC_MIN ); else { wnd->boxTrans[ 0 ].u.ch16 = hb_cdpGetU16Ctrl( uc16 ); @@ -2502,13 +2358,13 @@ static XWC_CharTrans * hb_gt_xwc_GetBoxChar( PXWND_DEF wnd, HB_USHORT uc16 ) } iTrans = wnd->boxIndex[ iPos ]; - if( iTrans == HB_GTXWC_TRANS_MAX ) + if( iTrans == HB_BOXCH_TRANS_MAX ) { - if( wnd->transCount < HB_GTXWC_TRANS_MAX - 1 ) + if( wnd->boxCount < HB_BOXCH_TRANS_MAX - 1 ) { - iTrans = wnd->transCount + 1; + iTrans = wnd->boxCount + 1; if( hb_gt_xwc_DefineBoxChar( wnd, uc16, &wnd->boxTrans[ iTrans ] ) ) - wnd->transCount = iTrans; + wnd->boxCount = iTrans; else iTrans = 0; } @@ -2551,13 +2407,23 @@ static void hb_gt_xwc_MouseInit( PXWND_DEF wnd ) static void hb_gt_xwc_AddCharToInputQueue( PXWND_DEF wnd, int keyCode ) { + if( wnd->keyBuffNO > 0 && HB_INKEY_ISMOUSEPOS( keyCode ) ) + { + int index = wnd->keyBuffPointer - 1; + if( index < 0 ) + index += XWC_CHAR_QUEUE_SIZE; + if( HB_INKEY_ISMOUSEPOS( wnd->KeyBuff[ index ] ) ) + { + wnd->KeyBuff[ index ] = keyCode; + return; + } + } + if( wnd->keyBuffNO < XWC_CHAR_QUEUE_SIZE ) { wnd->KeyBuff[ wnd->keyBuffPointer++ ] = keyCode; if( wnd->keyBuffPointer == XWC_CHAR_QUEUE_SIZE ) - { wnd->keyBuffPointer = 0; - } wnd->keyBuffNO++; } } @@ -2571,9 +2437,7 @@ static HB_BOOL hb_gt_xwc_GetCharFromInputQueue( PXWND_DEF wnd, int * keyCode ) { int index = wnd->keyBuffPointer - wnd->keyBuffNO; if( index < 0 ) - { index += XWC_CHAR_QUEUE_SIZE; - } *keyCode = wnd->KeyBuff[ index ]; wnd->keyBuffNO--; return HB_TRUE; @@ -2583,64 +2447,20 @@ static HB_BOOL hb_gt_xwc_GetCharFromInputQueue( PXWND_DEF wnd, int * keyCode ) /* *********************************************************************** */ -static int hb_gt_xwc_LastCharInInputQueue( PXWND_DEF wnd ) +static int hb_gt_xwc_keyFlags( PXWND_DEF wnd, int flags ) { - if( wnd->keyBuffNO > 0 ) - { - int index = wnd->keyBuffPointer - 1; - if( index < 0 ) - { - index += XWC_CHAR_QUEUE_SIZE; - } - return wnd->KeyBuff[ index ]; - } - return 0; + if( wnd->keyModifiers.bShift ) + flags |= HB_KF_SHIFT; + if( wnd->keyModifiers.bCtrl ) + flags |= HB_KF_CTRL; + if( wnd->keyModifiers.bAlt ) + flags |= HB_KF_ALT; + + return flags; } /* *********************************************************************** */ -static void hb_gt_xwc_TranslateKey( PXWND_DEF wnd, int key ) -{ - const ClipKeyCode * clipKey = NULL; - - if( key >= K_SPACE && key <= K_CTRL_BS ) - { - clipKey = &s_stdKeyTab[ key - K_SPACE ]; - } - else if( key > 0 && key < K_SPACE && wnd->keyModifiers.bCtrl ) - { - clipKey = &s_stdKeyTab[ key + '@' ]; - } - else if( XWC_IS_EXTKEY( key ) ) - { - clipKey = &s_extKeyTab[ XWC_CLR_KEYMASK( key ) ]; - } - if( clipKey != NULL ) - { - if( wnd->keyModifiers.bAlt ) - { - key = clipKey->alt_key; - } - else if( wnd->keyModifiers.bCtrl ) - { - key = clipKey->ctrl_key; - } - else if( wnd->keyModifiers.bShift ) - { - key = clipKey->shift_key; - } - else - { - key = clipKey->key; - } - } - if( key != 0 ) - { - hb_gt_xwc_AddCharToInputQueue( wnd, key ); - } -} - -/* *********************************************************************** */ static void hb_gt_xwc_FullScreen( PXWND_DEF wnd ) { XEvent evt; @@ -2664,7 +2484,7 @@ static void hb_gt_xwc_ProcessKey( PXWND_DEF wnd, XKeyEvent * evt ) { char buf[ 32 ]; KeySym outISO = 0, out = XLookupKeysym( evt, 0 ); - int ikey = 0, i; + int ikey = 0, flags = hb_gt_xwc_keyFlags( wnd, 0 ), i; #ifdef X_HAVE_UTF8_STRING Status status_return = 0; #endif @@ -2713,43 +2533,43 @@ static void hb_gt_xwc_ProcessKey( PXWND_DEF wnd, XKeyEvent * evt ) /* Then we scan for movement */ case XK_Left: - ikey = EXKEY_LEFT; + ikey = HB_KX_LEFT; break; case XK_Right: - ikey = EXKEY_RIGHT; + ikey = HB_KX_RIGHT; break; case XK_Up: - ikey = EXKEY_UP; + ikey = HB_KX_UP; break; case XK_Down: - ikey = EXKEY_DOWN; + ikey = HB_KX_DOWN; break; /* case XK_Begin: case XK_KP_Begin: */ case XK_Home: - ikey = EXKEY_HOME; + ikey = HB_KX_HOME; break; case XK_End: - ikey = EXKEY_END; + ikey = HB_KX_END; break; case XK_Page_Up: - ikey = EXKEY_PGUP; + ikey = HB_KX_PGUP; break; case XK_Page_Down: - ikey = EXKEY_PGDN; + ikey = HB_KX_PGDN; break; /* Special cursor operations */ case XK_Delete: - ikey = EXKEY_DEL; + ikey = HB_KX_DEL; break; case XK_Insert: - ikey = EXKEY_INS; + ikey = HB_KX_INS; break; case XK_BackSpace: - ikey = EXKEY_BS; + ikey = HB_KX_BS; break; case XK_Tab: - ikey = EXKEY_TAB; + ikey = HB_KX_TAB; break; case XK_Linefeed: case XK_Return: @@ -2759,67 +2579,126 @@ static void hb_gt_xwc_ProcessKey( PXWND_DEF wnd, XKeyEvent * evt ) hb_gt_xwc_FullScreen( wnd ); return; } - ikey = EXKEY_ENTER; + ikey = HB_KX_ENTER; break; case XK_KP_Enter: - ikey = EXKEY_KPENTER; + ikey = HB_KX_ENTER; + flags |= HB_KF_KEYPAD; break; case XK_Escape: - ikey = EXKEY_ESC; + ikey = HB_KX_ESC; break; /* then we scan for function keys */ case XK_F1: - ikey = EXKEY_F1; + ikey = HB_KX_F1; break; case XK_F2: - ikey = EXKEY_F2; + ikey = HB_KX_F2; break; case XK_F3: - ikey = EXKEY_F3; + ikey = HB_KX_F3; break; case XK_F4: - ikey = EXKEY_F4; + ikey = HB_KX_F4; break; case XK_F5: - ikey = EXKEY_F5; + ikey = HB_KX_F5; break; case XK_F6: - ikey = EXKEY_F6; + ikey = HB_KX_F6; break; case XK_F7: - ikey = EXKEY_F7; + ikey = HB_KX_F7; break; case XK_F8: - ikey = EXKEY_F8; + ikey = HB_KX_F8; break; case XK_F9: - ikey = EXKEY_F9; + ikey = HB_KX_F9; break; case XK_F10: - ikey = EXKEY_F10; + ikey = HB_KX_F10; break; case XK_F11: - ikey = EXKEY_F11; + ikey = HB_KX_F11; break; case XK_F12: - ikey = EXKEY_F12; + ikey = HB_KX_F12; break; /* Keys with special meanings to clipper */ case XK_Pause: - ikey = EXKEY_PAUSE; + ikey = HB_KX_PAUSE; break; case XK_Print: - ikey = EXKEY_PRTSCR; + ikey = HB_KX_PRTSCR; break; } if( ikey ) { - hb_gt_xwc_TranslateKey( wnd, ikey ); + hb_gt_xwc_AddCharToInputQueue( wnd, HB_INKEY_NEW_KEY( ikey, flags ) ); return; } + /* look for keypad keys if they haven't been processed by XLookupString */ + flags |= HB_KF_KEYPAD; + switch( out ) + { + case XK_KP_Left: + ikey = HB_KX_LEFT; + break; + case XK_KP_Right: + ikey = HB_KX_RIGHT; + break; + case XK_KP_Up: + ikey = HB_KX_UP; + break; + case XK_KP_Down: + ikey = HB_KX_DOWN; + break; + case XK_KP_Home: + ikey = HB_KX_HOME; + break; + case XK_KP_End: + ikey = HB_KX_END; + break; + case XK_KP_Page_Up: + ikey = HB_KX_PGUP; + break; + case XK_KP_Page_Down: + ikey = HB_KX_PGDN; + break; + case XK_KP_Begin: + case XK_KP_5: + ikey = HB_KX_CENTER; + break; + case XK_KP_Insert: + ikey = HB_KX_INS; + break; + case XK_KP_Delete: + ikey = HB_KX_DEL; + break; + case XK_KP_Enter: + ikey = HB_KX_ENTER; + break; + case XK_KP_Multiply: + ikey = '*'; + break; + case XK_KP_Add: + ikey = '+'; + break; + case XK_KP_Subtract: + ikey = '-'; + break; + case XK_KP_Divide: + ikey = '/'; + break; + default: + flags ^= HB_KF_KEYPAD; + break; + } + /* First check if there is no string bound with with a key, because we not check all modifiers in all possible keyboards */ #ifdef X_HAVE_UTF8_STRING @@ -2845,7 +2724,7 @@ static void hb_gt_xwc_ProcessKey( PXWND_DEF wnd, XKeyEvent * evt ) { ikey = hb_cdpGetChar( HB_GTSELF_HOSTCP( wnd->pGT ), ( HB_WCHAR ) outISO ); if( ikey ) - hb_gt_xwc_AddCharToInputQueue( wnd, ikey ); + hb_gt_xwc_AddCharToInputQueue( wnd, HB_INKEY_NEW_CHAR( ikey ) ); return; } } @@ -2860,70 +2739,25 @@ static void hb_gt_xwc_ProcessKey( PXWND_DEF wnd, XKeyEvent * evt ) while( HB_CDPCHAR_GET( cdp, buf, i, &nI, &wc ) ) { - if( wc < 128 && ( wnd->keyModifiers.bAlt || wnd->keyModifiers.bCtrl ) ) - hb_gt_xwc_TranslateKey( wnd, wc ); + if( wc < 32 || + ( wc < 128 && ( flags & ( HB_KF_CTRL | HB_KF_ALT | HB_KF_KEYPAD ) ) ) ) + { + int fl = flags; + if( wc > 0 && wc < 32 ) + { + wc += 'A' - 1; + fl |= HB_KF_CTRL; + } + hb_gt_xwc_AddCharToInputQueue( wnd, HB_INKEY_NEW_KEY( wc, fl ) ); + } else - hb_gt_xwc_AddCharToInputQueue( wnd, HB_INKEY_NEW_UNICODE( wc ) ); + hb_gt_xwc_AddCharToInputQueue( wnd, HB_INKEY_NEW_UNICODEF( wc, flags ) ); } return; } - /* look for special keys if they haven't been processed by XLookupString, - mostly keypad keys */ - switch( out ) - { - case XK_KP_Left: - ikey = EXKEY_LEFT; - break; - case XK_KP_Right: - ikey = EXKEY_RIGHT; - break; - case XK_KP_Up: - ikey = EXKEY_UP; - break; - case XK_KP_Down: - ikey = EXKEY_DOWN; - break; - case XK_KP_Home: - ikey = EXKEY_HOME; - break; - case XK_KP_End: - ikey = EXKEY_END; - break; - case XK_KP_Page_Up: - ikey = EXKEY_PGUP; - break; - case XK_KP_Page_Down: - ikey = EXKEY_PGDN; - break; - case XK_KP_Begin: - case XK_KP_5: - ikey = EXKEY_CENTER; - break; - case XK_KP_Insert: - ikey = EXKEY_INS; - break; - case XK_KP_Delete: - ikey = EXKEY_DEL; - break; - case XK_KP_Enter: - ikey = EXKEY_KPENTER; - break; - case XK_KP_Multiply: - ikey = '*'; - break; - case XK_KP_Add: - ikey = '+'; - break; - case XK_KP_Subtract: - ikey = '-'; - break; - case XK_KP_Divide: - ikey = '/'; - break; - } if( ikey ) - hb_gt_xwc_TranslateKey( wnd, ikey ); + hb_gt_xwc_AddCharToInputQueue( wnd, HB_INKEY_NEW_KEY( ikey, flags ) ); } /* *********************************************************************** */ @@ -3033,8 +2867,9 @@ static void hb_gt_xwc_WndProc( PXWND_DEF wnd, XEvent * evt ) hb_gt_xwc_InvalidateChar( wnd, wnd->markLeft, wnd->markTop, wnd->markRight, wnd->markBottom ); } - else if( hb_gt_xwc_LastCharInInputQueue( wnd ) != K_MOUSEMOVE ) - hb_gt_xwc_AddCharToInputQueue( wnd, K_MOUSEMOVE ); + else + hb_gt_xwc_AddCharToInputQueue( wnd, + HB_INKEY_NEW_MPOS( wnd->mouseCol, wnd->mouseRow ) ); break; case ButtonPress: @@ -3103,7 +2938,8 @@ static void hb_gt_xwc_WndProc( PXWND_DEF wnd, XEvent * evt ) nI += hb_cdpTextPutU16( wnd->utf8CDP, pBuffer + nI, nSize - nI, usChar ); /* nI += hb_cdpU16CharToUTF8( pBuffer + nI, &usChar ); */ } - pBuffer[ nI++ ] = '\n'; + if( wnd->markTop < wnd->markBottom ) + pBuffer[ nI++ ] = '\n'; ++top; } if( nI > 0 ) @@ -3121,7 +2957,8 @@ static void hb_gt_xwc_WndProc( PXWND_DEF wnd, XEvent * evt ) } if( key != 0 ) { - hb_gt_xwc_AddCharToInputQueue( wnd, key ); + hb_gt_xwc_AddCharToInputQueue( wnd, + HB_INKEY_NEW_MKEY( key, hb_gt_xwc_keyFlags( wnd, 0 ) ) ); } } break; @@ -3223,7 +3060,8 @@ static void hb_gt_xwc_WndProc( PXWND_DEF wnd, XEvent * evt ) wnd->ClipboardSize = text.nitems; wnd->ClipboardData = ( unsigned char * ) - hb_xmemdup( text.value, text.nitems ); + hb_xmemdup( text.value, text.nitems + 1 ); + wnd->ClipboardData[ wnd->ClipboardSize ] = '\0'; wnd->ClipboardTime = evt->xselection.time; wnd->ClipboardRcvd = HB_TRUE; } @@ -3622,7 +3460,7 @@ static void hb_gt_xwc_RepaintChar( PXWND_DEF wnd, int colStart, int rowStart, in color = ( color << 4 ) | ( color >> 4 ); } if( len > 0 && ( chTrans->type != CH_CHAR || - color != oldColor || ulCurr == wnd->pCurrScr[index] ) ) + color != oldColor || ulCurr == wnd->pCurrScr[ index ] ) ) { hb_gt_xwc_DrawString( wnd, startCol, irow, oldColor, usChBuf, len ); len = 0; @@ -4017,7 +3855,7 @@ static void hb_gt_xwc_ProcessMessages( PXWND_DEF wnd, HB_BOOL fSync ) { HB_ULONG ulCurrentTime = hb_gt_xwc_CurrentTime(); - if( ulCurrentTime - wnd->cursorStateTime > wnd->cursorBlinkRate ) + if( ulCurrentTime - wnd->cursorStateTime > wnd->cursorBlinkRate >> 1 ) { wnd->cursorState = ! wnd->cursorState; wnd->cursorStateTime = ulCurrentTime; @@ -4096,7 +3934,7 @@ static void hb_gt_xwc_SetScrBuff( PXWND_DEF wnd, HB_USHORT cols, HB_USHORT rows if( wnd->pCurrScr != NULL ) hb_xfree( wnd->pCurrScr ); wnd->pCurrScr = ( HB_ULONG * ) hb_xgrab( iSize * sizeof( HB_ULONG ) ); - memset( wnd->pCurrScr, 0xFFFFFFFFL, iSize * sizeof( HB_ULONG ) ); + memset( wnd->pCurrScr, 0xFF, iSize * sizeof( HB_ULONG ) ); hb_gt_xwc_InvalidateChar( wnd, 0, 0, wnd->cols - 1, wnd->rows - 1 ); HB_GTSELF_RESIZE( wnd->pGT, wnd->rows, wnd->cols ); } @@ -4725,7 +4563,7 @@ static void hb_gt_xwc_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFil s_wnd = wnd; wnd->cursorState = HB_TRUE; - wnd->cursorBlinkRate = 350; + wnd->cursorBlinkRate = 700; wnd->cursorStateTime = 0; HB_GTSELF_RESIZE( pGT, wnd->rows, wnd->cols ); @@ -5166,7 +5004,10 @@ static HB_BOOL hb_gt_xwc_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) case HB_GTI_CURSORBLINKRATE: pInfo->pResult = hb_itemPutNI( pInfo->pResult, wnd->cursorBlinkRate ); if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) - wnd->cursorBlinkRate = hb_itemGetNI( pInfo->pNewVal ); + { + iVal = hb_itemGetNI( pInfo->pNewVal ); + wnd->cursorBlinkRate = HB_MAX( iVal, 0 ); + } break; case HB_GTI_KBDSHIFTS: @@ -5273,12 +5114,17 @@ static HB_BOOL hb_gt_xwc_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) pInfo->pResult = hb_itemNew( NULL ); hb_arrayNew( pInfo->pResult, 2 ); + if( iType == HB_GTI_SETPOS_ROWCOL ) + { + iVal = x; + x = y / wnd->fontHeight; + y = iVal / wnd->fontWidth; + } hb_arraySetNI( pInfo->pResult, 1, x ); hb_arraySetNI( pInfo->pResult, 2, y ); if( ( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) && ( hb_itemType( pInfo->pNewVal2 ) & HB_IT_NUMERIC ) ) - { x = hb_itemGetNI( pInfo->pNewVal ); y = hb_itemGetNI( pInfo->pNewVal2 ); @@ -5294,9 +5140,9 @@ static HB_BOOL hb_gt_xwc_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) if( iType == HB_GTI_SETPOS_ROWCOL ) { - iVal = y; - y = x * wnd->fontHeight; - x = iVal * wnd->fontWidth; + iVal = x; + x = y * wnd->fontWidth; + y = iVal * wnd->fontHeight; } if( wnd->window ) { @@ -5325,7 +5171,7 @@ static HB_BOOL hb_gt_xwc_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) wnd->colors[ iVal ].set = HB_FALSE; if( wnd->fInit && hb_gt_xwc_setPalette( wnd ) ) { - memset( wnd->pCurrScr, 0xFFFFFFFFL, wnd->cols * wnd->rows * sizeof( HB_ULONG ) ); + memset( wnd->pCurrScr, 0xFF, wnd->cols * wnd->rows * sizeof( HB_ULONG ) ); hb_gt_xwc_InvalidateChar( wnd, 0, 0, wnd->cols - 1, wnd->rows - 1 ); } } @@ -5353,7 +5199,7 @@ static HB_BOOL hb_gt_xwc_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) } if( wnd->fInit && hb_gt_xwc_setPalette( wnd ) ) { - memset( wnd->pCurrScr, 0xFFFFFFFFL, wnd->cols * wnd->rows * sizeof( HB_ULONG ) ); + memset( wnd->pCurrScr, 0xFF, wnd->cols * wnd->rows * sizeof( HB_ULONG ) ); hb_gt_xwc_InvalidateChar( wnd, 0, 0, wnd->cols - 1, wnd->rows - 1 ); } } diff --git a/src/rtl/gtxwc/gtxwc.h b/src/rtl/gtxwc/gtxwc.h index 239cab46a1..5242a97059 100644 --- a/src/rtl/gtxwc/gtxwc.h +++ b/src/rtl/gtxwc/gtxwc.h @@ -122,210 +122,155 @@ typedef HB_USHORT HB_GT_CELLTYPE; #define XWC_SYNC_UPDATE 0 #define XWC_ASYNC_UPDATE 1 -#define CLIP_STDKEY_COUNT 96 -#define CLIP_EXTKEY_COUNT 30 - -#define XWC_EXTKEYMASK 0x10000000 -#define XWC_KEYMASK 0xF0000000 -#define XWC_CLR_KEYMASK( x ) ( ( x ) & ~XWC_KEYMASK ) -#define XWC_IS_EXTKEY( x ) ( ( ( x ) & XWC_EXTKEYMASK ) != 0 ) - -#define EXKEY_F1 ( 0 | XWC_EXTKEYMASK ) -#define EXKEY_F2 ( 1 | XWC_EXTKEYMASK ) -#define EXKEY_F3 ( 2 | XWC_EXTKEYMASK ) -#define EXKEY_F4 ( 3 | XWC_EXTKEYMASK ) -#define EXKEY_F5 ( 4 | XWC_EXTKEYMASK ) -#define EXKEY_F6 ( 5 | XWC_EXTKEYMASK ) -#define EXKEY_F7 ( 6 | XWC_EXTKEYMASK ) -#define EXKEY_F8 ( 7 | XWC_EXTKEYMASK ) -#define EXKEY_F9 ( 8 | XWC_EXTKEYMASK ) -#define EXKEY_F10 ( 9 | XWC_EXTKEYMASK ) -#define EXKEY_F11 ( 10 | XWC_EXTKEYMASK ) -#define EXKEY_F12 ( 11 | XWC_EXTKEYMASK ) -#define EXKEY_UP ( 12 | XWC_EXTKEYMASK ) -#define EXKEY_DOWN ( 13 | XWC_EXTKEYMASK ) -#define EXKEY_LEFT ( 14 | XWC_EXTKEYMASK ) -#define EXKEY_RIGHT ( 15 | XWC_EXTKEYMASK ) -#define EXKEY_INS ( 16 | XWC_EXTKEYMASK ) -#define EXKEY_DEL ( 17 | XWC_EXTKEYMASK ) -#define EXKEY_HOME ( 18 | XWC_EXTKEYMASK ) -#define EXKEY_END ( 19 | XWC_EXTKEYMASK ) -#define EXKEY_PGUP ( 20 | XWC_EXTKEYMASK ) -#define EXKEY_PGDN ( 21 | XWC_EXTKEYMASK ) -#define EXKEY_BS ( 22 | XWC_EXTKEYMASK ) -#define EXKEY_TAB ( 23 | XWC_EXTKEYMASK ) -#define EXKEY_ESC ( 24 | XWC_EXTKEYMASK ) -#define EXKEY_ENTER ( 25 | XWC_EXTKEYMASK ) -#define EXKEY_KPENTER ( 26 | XWC_EXTKEYMASK ) -#define EXKEY_CENTER ( 27 | XWC_EXTKEYMASK ) -#define EXKEY_PRTSCR ( 28 | XWC_EXTKEYMASK ) -#define EXKEY_PAUSE ( 29 | XWC_EXTKEYMASK ) - -/* xHarbour compatible definitions */ -#if ! defined( K_SH_LEFT ) -#define K_SH_LEFT K_LEFT /* Shift-Left == Left */ -#define K_SH_UP K_UP /* Shift-Up == Up */ -#define K_SH_RIGHT K_RIGHT /* Shift-Right == Right */ -#define K_SH_DOWN K_DOWN /* Shift-Down == Down */ -#define K_SH_INS K_INS /* Shift-Ins == Ins */ -#define K_SH_DEL K_DEL /* Shift-Del == Del */ -#define K_SH_HOME K_HOME /* Shift-Home == Home */ -#define K_SH_END K_END /* Shift-End == End */ -#define K_SH_PGUP K_PGUP /* Shift-PgUp == PgUp */ -#define K_SH_PGDN K_PGDN /* Shift-PgDn == PgDn */ -#define K_SH_RETURN K_RETURN /* Shift-Enter == Enter */ -#define K_SH_ENTER K_ENTER /* Shift-Enter == Enter */ -#endif - #define XWC_STD_MASK ( ExposureMask | StructureNotifyMask | FocusChangeMask | \ ButtonPressMask | ButtonReleaseMask | PointerMotionMask | \ KeyPressMask | KeyReleaseMask ) /* Box char unicode values */ -#define HB_GTXWC_ARROW_R 0x0010 /* ARROW RIGHT */ -#define HB_GTXWC_ARROW_L 0x0011 /* ARROW LEFT */ -#define HB_GTXWC_ARROW_U 0x001E /* ARROW UP */ -#define HB_GTXWC_ARROW_D 0x001F /* ARROW DOWN */ +#define HB_BOXCH_ARROW_R 0x0010 /* ARROW RIGHT */ +#define HB_BOXCH_ARROW_L 0x0011 /* ARROW LEFT */ +#define HB_BOXCH_ARROW_U 0x001E /* ARROW UP */ +#define HB_BOXCH_ARROW_D 0x001F /* ARROW DOWN */ -#define HB_GTXWC_CHR_BASE 4 +#define HB_BOXCH_CHR_BASE 4 -#define HB_GTXWC_DBL_LT 0x2554 /* BOX DRAWINGS DOUBLE DOWN AND RIGHT (Double left top angle) */ -#define HB_GTXWC_DBL_TD 0x2566 /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL (Double top with junction down) */ -#define HB_GTXWC_DBL_RT 0x2557 /* BOX DRAWINGS DOUBLE DOWN AND LEFT (Double right top angle) */ +#define HB_BOXCH_DBL_LT 0x2554 /* BOX DRAWINGS DOUBLE DOWN AND RIGHT (Double left top angle) */ +#define HB_BOXCH_DBL_TD 0x2566 /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL (Double top with junction down) */ +#define HB_BOXCH_DBL_RT 0x2557 /* BOX DRAWINGS DOUBLE DOWN AND LEFT (Double right top angle) */ -#define HB_GTXWC_DBL_LB 0x255A /* BOX DRAWINGS DOUBLE UP AND RIGHT (Double left bottom angle) */ -#define HB_GTXWC_DBL_BU 0x2569 /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL (Double bottom with junction up) */ -#define HB_GTXWC_DBL_RB 0x255D /* BOX DRAWINGS DOUBLE DOWN AND LEFT (Double right bottom angle) */ +#define HB_BOXCH_DBL_LB 0x255A /* BOX DRAWINGS DOUBLE UP AND RIGHT (Double left bottom angle) */ +#define HB_BOXCH_DBL_BU 0x2569 /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL (Double bottom with junction up) */ +#define HB_BOXCH_DBL_RB 0x255D /* BOX DRAWINGS DOUBLE DOWN AND LEFT (Double right bottom angle) */ -#define HB_GTXWC_DBL_VL 0x2560 /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT (Double Vertical with left junction) */ -#define HB_GTXWC_DBL_VR 0x2563 /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT (Double vertical with right junction) */ -#define HB_GTXWC_DBL_CRS 0x256C /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL (Double cross) */ +#define HB_BOXCH_DBL_VL 0x2560 /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT (Double Vertical with left junction) */ +#define HB_BOXCH_DBL_VR 0x2563 /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT (Double vertical with right junction) */ +#define HB_BOXCH_DBL_CRS 0x256C /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL (Double cross) */ -#define HB_GTXWC_DBL_HOR 0x2550 /* BOX DRAWINGS DOUBLE HORIZONTAL (Double Horizontal bar) */ -#define HB_GTXWC_DBL_VRT 0x2551 /* BOX DRAWINGS DOUBLE VERTICAL (Double Vertical bar) */ +#define HB_BOXCH_DBL_HOR 0x2550 /* BOX DRAWINGS DOUBLE HORIZONTAL (Double Horizontal bar) */ +#define HB_BOXCH_DBL_VRT 0x2551 /* BOX DRAWINGS DOUBLE VERTICAL (Double Vertical bar) */ -#define HB_GTXWC_SNG_LT 0x250C /* BOX DRAWINGS LIGHT DOWN AND RIGHT (Single left top angle) */ -#define HB_GTXWC_SNG_TD 0x252C /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL (Single top with junction down) */ -#define HB_GTXWC_SNG_RT 0x2510 /* BOX DRAWINGS LIGHT DOWN AND LEFT (Single right top angle) */ +#define HB_BOXCH_SNG_LT 0x250C /* BOX DRAWINGS LIGHT DOWN AND RIGHT (Single left top angle) */ +#define HB_BOXCH_SNG_TD 0x252C /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL (Single top with junction down) */ +#define HB_BOXCH_SNG_RT 0x2510 /* BOX DRAWINGS LIGHT DOWN AND LEFT (Single right top angle) */ -#define HB_GTXWC_SNG_LB 0x2514 /* BOX DRAWINGS LIGHT UP AND RIGHT (Single left bottom angle) */ -#define HB_GTXWC_SNG_BU 0x2534 /* BOX DRAWINGS LIGHT UP AND HORIZONTAL (Single bottom with junction up) */ -#define HB_GTXWC_SNG_RB 0x2518 /* BOX DRAWINGS LIGHT UP AND LEFT (Single right bottom angle) */ +#define HB_BOXCH_SNG_LB 0x2514 /* BOX DRAWINGS LIGHT UP AND RIGHT (Single left bottom angle) */ +#define HB_BOXCH_SNG_BU 0x2534 /* BOX DRAWINGS LIGHT UP AND HORIZONTAL (Single bottom with junction up) */ +#define HB_BOXCH_SNG_RB 0x2518 /* BOX DRAWINGS LIGHT UP AND LEFT (Single right bottom angle) */ -#define HB_GTXWC_SNG_VL 0x251C /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT (Single Vertical with left junction) */ -#define HB_GTXWC_SNG_VR 0x2524 /* BOX DRAWINGS LIGHT VERTICAL AND LEFT (Single vertical with right junction) */ -#define HB_GTXWC_SNG_CRS 0x253C /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL (Single cross) */ +#define HB_BOXCH_SNG_VL 0x251C /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT (Single Vertical with left junction) */ +#define HB_BOXCH_SNG_VR 0x2524 /* BOX DRAWINGS LIGHT VERTICAL AND LEFT (Single vertical with right junction) */ +#define HB_BOXCH_SNG_CRS 0x253C /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL (Single cross) */ -#define HB_GTXWC_SNG_HOR 0x2500 /* BOX DRAWINGS LIGHT HORIZONTAL (Single Horizontal bar) */ -#define HB_GTXWC_SNG_VRT 0x2502 /* BOX DRAWINGS LIGHT VERTICAL (Single Vertical bar) */ +#define HB_BOXCH_SNG_HOR 0x2500 /* BOX DRAWINGS LIGHT HORIZONTAL (Single Horizontal bar) */ +#define HB_BOXCH_SNG_VRT 0x2502 /* BOX DRAWINGS LIGHT VERTICAL (Single Vertical bar) */ -#define HB_GTXWC_SNG_L_DBL_T 0x2552 /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE (Single left double top angle) */ -#define HB_GTXWC_SNG_T_DBL_D 0x2565 /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE (Single top with double junction down) */ -#define HB_GTXWC_SNG_R_DBL_T 0x2556 /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE (Single right double top angle) */ +#define HB_BOXCH_SNG_L_DBL_T 0x2552 /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE (Single left double top angle) */ +#define HB_BOXCH_SNG_T_DBL_D 0x2565 /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE (Single top with double junction down) */ +#define HB_BOXCH_SNG_R_DBL_T 0x2556 /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE (Single right double top angle) */ -#define HB_GTXWC_SNG_L_DBL_B 0x2558 /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE (Single left double bottom angle) */ -#define HB_GTXWC_SNG_B_DBL_U 0x2568 /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE (Single bottom double with junction up) */ -#define HB_GTXWC_SNG_R_DBL_B 0x255C /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE (Single right double bottom angle) */ +#define HB_BOXCH_SNG_L_DBL_B 0x2558 /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE (Single left double bottom angle) */ +#define HB_BOXCH_SNG_B_DBL_U 0x2568 /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE (Single bottom double with junction up) */ +#define HB_BOXCH_SNG_R_DBL_B 0x255C /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE (Single right double bottom angle) */ -#define HB_GTXWC_SNG_V_DBL_L 0x255E /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE (Single Vertical double left junction) */ -#define HB_GTXWC_SNG_V_DBL_R 0x2561 /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE (Single vertical double right junction) */ -#define HB_GTXWC_SNG_DBL_CRS 0x256A /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE (Single cross (double horiz) */ +#define HB_BOXCH_SNG_V_DBL_L 0x255E /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE (Single Vertical double left junction) */ +#define HB_BOXCH_SNG_V_DBL_R 0x2561 /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE (Single vertical double right junction) */ +#define HB_BOXCH_SNG_DBL_CRS 0x256A /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE (Single cross (double horiz) */ -#define HB_GTXWC_DBL_L_SNG_T 0x2553 /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE (Double left single top angle) */ -#define HB_GTXWC_DBL_T_SNG_D 0x2564 /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE (Double top signle junction down) */ -#define HB_GTXWC_DBL_R_SNG_T 0x2555 /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE (Double right single top angle) */ +#define HB_BOXCH_DBL_L_SNG_T 0x2553 /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE (Double left single top angle) */ +#define HB_BOXCH_DBL_T_SNG_D 0x2564 /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE (Double top signle junction down) */ +#define HB_BOXCH_DBL_R_SNG_T 0x2555 /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE (Double right single top angle) */ -#define HB_GTXWC_DBL_L_SNG_B 0x2559 /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE (Double left single bottom angle) */ -#define HB_GTXWC_DBL_B_SNG_U 0x2567 /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE (Double bottom single junction up) */ -#define HB_GTXWC_DBL_R_SNG_B 0x255B /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE (Double right single bottom angle) */ +#define HB_BOXCH_DBL_L_SNG_B 0x2559 /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE (Double left single bottom angle) */ +#define HB_BOXCH_DBL_B_SNG_U 0x2567 /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE (Double bottom single junction up) */ +#define HB_BOXCH_DBL_R_SNG_B 0x255B /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE (Double right single bottom angle) */ -#define HB_GTXWC_DBL_V_SNG_R 0x2562 /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE (Double Vertical single left junction) */ -#define HB_GTXWC_DBL_V_SNG_L 0x255F /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE (Double vertical single right junction) */ -#define HB_GTXWC_DBL_SNG_CRS 0x256B /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE (Double cross (single horiz) */ +#define HB_BOXCH_DBL_V_SNG_R 0x2562 /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE (Double Vertical single left junction) */ +#define HB_BOXCH_DBL_V_SNG_L 0x255F /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE (Double vertical single right junction) */ +#define HB_BOXCH_DBL_SNG_CRS 0x256B /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE (Double cross (single horiz) */ -#define HB_GTXWC_FULL 0x2588 /* FULL BLOCK */ -#define HB_GTXWC_FULL_B 0x2584 /* LOWER HALF BLOCK */ -#define HB_GTXWC_FULL_L 0x258C /* LEFT HALF BLOCK */ -#define HB_GTXWC_FULL_R 0x2590 /* RIGHT HALF BLOCK */ -#define HB_GTXWC_FULL_T 0x2580 /* UPPER HALF BLOCK */ +#define HB_BOXCH_FULL 0x2588 /* FULL BLOCK */ +#define HB_BOXCH_FULL_B 0x2584 /* LOWER HALF BLOCK */ +#define HB_BOXCH_FULL_L 0x258C /* LEFT HALF BLOCK */ +#define HB_BOXCH_FULL_R 0x2590 /* RIGHT HALF BLOCK */ +#define HB_BOXCH_FULL_T 0x2580 /* UPPER HALF BLOCK */ -#define HB_GTXWC_FILLER1 0x2591 /* LIGHT SHADE */ -#define HB_GTXWC_FILLER2 0x2592 /* MEDIUM SHADE */ -#define HB_GTXWC_FILLER3 0x2593 /* DARK SHADE */ +#define HB_BOXCH_FILLER1 0x2591 /* LIGHT SHADE */ +#define HB_BOXCH_FILLER2 0x2592 /* MEDIUM SHADE */ +#define HB_BOXCH_FILLER3 0x2593 /* DARK SHADE */ -#define HB_GTXWC_SQUARE 0x25A0 /* BLACK SQUARE */ +#define HB_BOXCH_SQUARE 0x25A0 /* BLACK SQUARE */ -#define HB_GTXWC_BOX_MIN 0x2500 -#define HB_GTXWC_BOX_MAX 0x25A0 +#define HB_BOXCH_BOX_MIN 0x2500 +#define HB_BOXCH_BOX_MAX 0x25A0 -#define HB_GTXWC_RC_ARROW_DL 0xE040 /* USER ARROW DOWN (LEFT) */ -#define HB_GTXWC_RC_ARROW_DR 0xE041 /* USER ARROW DOWN (RIGHT) */ -#define HB_GTXWC_RC_ARROW_UL 0xE042 /* USER ARROW UP (LEFT) */ -#define HB_GTXWC_RC_ARROW_UR 0xE043 /* USER ARROW UP (RIGHT) */ -#define HB_GTXWC_RC_ARROW_VL 0xE044 /* USER ARROWS UP/DOWN (LEFT) */ -#define HB_GTXWC_RC_ARROW_VR 0xE045 /* USER ARROWS UP/DOWN (RIGHT) */ -#define HB_GTXWC_RC_BUTTON_L 0xE046 /* USER BUTTON (LEFT) */ -#define HB_GTXWC_RC_BUTTON_R 0xE047 /* USER BUTTON (RIGHT) */ -#define HB_GTXWC_RC_ARROW_LL 0xE048 /* USER ARROW LEFT (LEFT) */ -#define HB_GTXWC_RC_ARROW_LR 0xE049 /* USER ARROW LEFT (RIGHT) */ -#define HB_GTXWC_RC_ARROW_RL 0xE04A /* USER ARROW RIGHT (LEFT) */ -#define HB_GTXWC_RC_ARROW_RR 0xE04B /* USER ARROW RIGHT (RIGHT) */ -#define HB_GTXWC_RC_ENTER1 0xE04C /* USER ENTER (LEFT) */ -#define HB_GTXWC_RC_ENTER2 0xE04D /* USER ENTER (MIDDLE) */ -#define HB_GTXWC_RC_ENTER3 0xE04E /* USER ENTER (RIGHT) */ -#define HB_GTXWC_RC_VSCRL_LD 0xE04F /* USER VERTICAL SCROLL (LEFT-DOWN) */ -#define HB_GTXWC_RC_VSCRL_RD 0xE050 /* USER VERTICAL SCROLL (RIGHT-DOWN) */ -#define HB_GTXWC_RC_VSCRL_LU 0xE051 /* USER VERTICAL SCROLL (LEFT-UP) */ -#define HB_GTXWC_RC_VSCRL_RU 0xE052 /* USER VERTICAL SCROLL (RIGHT-UP) */ -#define HB_GTXWC_RC_VSCRL_L 0xE053 /* USER VERTICAL SCROLL (LEFT) */ -#define HB_GTXWC_RC_VSCRL_R 0xE054 /* USER VERTICAL SCROLL (RIGHT) */ -#define HB_GTXWC_RC_HSCRL 0xE055 /* USER HORIZONTAL SCROLL */ +#define HB_BOXCH_RC_ARROW_DL 0xE040 /* USER ARROW DOWN (LEFT) */ +#define HB_BOXCH_RC_ARROW_DR 0xE041 /* USER ARROW DOWN (RIGHT) */ +#define HB_BOXCH_RC_ARROW_UL 0xE042 /* USER ARROW UP (LEFT) */ +#define HB_BOXCH_RC_ARROW_UR 0xE043 /* USER ARROW UP (RIGHT) */ +#define HB_BOXCH_RC_ARROW_VL 0xE044 /* USER ARROWS UP/DOWN (LEFT) */ +#define HB_BOXCH_RC_ARROW_VR 0xE045 /* USER ARROWS UP/DOWN (RIGHT) */ +#define HB_BOXCH_RC_BUTTON_L 0xE046 /* USER BUTTON (LEFT) */ +#define HB_BOXCH_RC_BUTTON_R 0xE047 /* USER BUTTON (RIGHT) */ +#define HB_BOXCH_RC_ARROW_LL 0xE048 /* USER ARROW LEFT (LEFT) */ +#define HB_BOXCH_RC_ARROW_LR 0xE049 /* USER ARROW LEFT (RIGHT) */ +#define HB_BOXCH_RC_ARROW_RL 0xE04A /* USER ARROW RIGHT (LEFT) */ +#define HB_BOXCH_RC_ARROW_RR 0xE04B /* USER ARROW RIGHT (RIGHT) */ +#define HB_BOXCH_RC_ENTER1 0xE04C /* USER ENTER (LEFT) */ +#define HB_BOXCH_RC_ENTER2 0xE04D /* USER ENTER (MIDDLE) */ +#define HB_BOXCH_RC_ENTER3 0xE04E /* USER ENTER (RIGHT) */ +#define HB_BOXCH_RC_VSCRL_LD 0xE04F /* USER VERTICAL SCROLL (LEFT-DOWN) */ +#define HB_BOXCH_RC_VSCRL_RD 0xE050 /* USER VERTICAL SCROLL (RIGHT-DOWN) */ +#define HB_BOXCH_RC_VSCRL_LU 0xE051 /* USER VERTICAL SCROLL (LEFT-UP) */ +#define HB_BOXCH_RC_VSCRL_RU 0xE052 /* USER VERTICAL SCROLL (RIGHT-UP) */ +#define HB_BOXCH_RC_VSCRL_L 0xE053 /* USER VERTICAL SCROLL (LEFT) */ +#define HB_BOXCH_RC_VSCRL_R 0xE054 /* USER VERTICAL SCROLL (RIGHT) */ +#define HB_BOXCH_RC_HSCRL 0xE055 /* USER HORIZONTAL SCROLL */ -#define HB_GTXWC_RC_0 0xE056 /* USER BIG 0 */ -#define HB_GTXWC_RC_1 0xE057 /* USER BIG 1 */ -#define HB_GTXWC_RC_2 0xE058 /* USER BIG 2 */ -#define HB_GTXWC_RC_3 0xE059 /* USER BIG 3 */ -#define HB_GTXWC_RC_4 0xE05A /* USER BIG 4 */ -#define HB_GTXWC_RC_5 0xE05B /* USER BIG 5 */ -#define HB_GTXWC_RC_6 0xE05C /* USER BIG 6 */ -#define HB_GTXWC_RC_7 0xE05D /* USER BIG 7 */ -#define HB_GTXWC_RC_8 0xE05E /* USER BIG 8 */ -#define HB_GTXWC_RC_9 0xE05F /* USER BIG 9 */ -#define HB_GTXWC_RC_DOT 0xE060 /* USER BIG DOT */ -#define HB_GTXWC_RC_ACC 0xE061 /* USER BIG ACCENT */ +#define HB_BOXCH_RC_0 0xE056 /* USER BIG 0 */ +#define HB_BOXCH_RC_1 0xE057 /* USER BIG 1 */ +#define HB_BOXCH_RC_2 0xE058 /* USER BIG 2 */ +#define HB_BOXCH_RC_3 0xE059 /* USER BIG 3 */ +#define HB_BOXCH_RC_4 0xE05A /* USER BIG 4 */ +#define HB_BOXCH_RC_5 0xE05B /* USER BIG 5 */ +#define HB_BOXCH_RC_6 0xE05C /* USER BIG 6 */ +#define HB_BOXCH_RC_7 0xE05D /* USER BIG 7 */ +#define HB_BOXCH_RC_8 0xE05E /* USER BIG 8 */ +#define HB_BOXCH_RC_9 0xE05F /* USER BIG 9 */ +#define HB_BOXCH_RC_DOT 0xE060 /* USER BIG DOT */ +#define HB_BOXCH_RC_ACC 0xE061 /* USER BIG ACCENT */ -#define HB_GTXWC_RC_BOX_ML 0xE062 /* USER BOX MIDDLE LEFT */ -#define HB_GTXWC_RC_BOX_MR 0xE063 /* USER BOX MIDDLE RIGHT */ -#define HB_GTXWC_RC_HWND_L 0xE064 /* USER WINDOW HANDLE LEFT */ -#define HB_GTXWC_RC_HWND_R 0xE065 /* USER WINDOW HANDLE RIGHT */ -#define HB_GTXWC_RC_BOX_TL 0xE066 /* USER BOX TOP LEFT */ -#define HB_GTXWC_RC_BOX_T 0xE067 /* USER BOX TOP */ -#define HB_GTXWC_RC_BOX_TR 0xE068 /* USER BOX TOP RIGHT */ -#define HB_GTXWC_RC_BOX_R 0xE069 /* USER BOX RIGHT */ -#define HB_GTXWC_RC_BOX_BR 0xE06A /* USER BOX BOTTOM RIGHT */ -#define HB_GTXWC_RC_BOX_B 0xE06B /* USER BOX BOTTOM */ -#define HB_GTXWC_RC_BOX_BL 0xE06C /* USER BOX BOTTOM LEFT */ -#define HB_GTXWC_RC_BOX_L 0xE06D /* USER BOX LEFT */ -#define HB_GTXWC_RC_BOX_MT 0xE06E /* USER BOX MIDDLE TOP */ -#define HB_GTXWC_RC_BOX_MB 0xE06F /* USER BOX MIDDLE BOTTOM */ +#define HB_BOXCH_RC_BOX_ML 0xE062 /* USER BOX MIDDLE LEFT */ +#define HB_BOXCH_RC_BOX_MR 0xE063 /* USER BOX MIDDLE RIGHT */ +#define HB_BOXCH_RC_HWND_L 0xE064 /* USER WINDOW HANDLE LEFT */ +#define HB_BOXCH_RC_HWND_R 0xE065 /* USER WINDOW HANDLE RIGHT */ +#define HB_BOXCH_RC_BOX_TL 0xE066 /* USER BOX TOP LEFT */ +#define HB_BOXCH_RC_BOX_T 0xE067 /* USER BOX TOP */ +#define HB_BOXCH_RC_BOX_TR 0xE068 /* USER BOX TOP RIGHT */ +#define HB_BOXCH_RC_BOX_R 0xE069 /* USER BOX RIGHT */ +#define HB_BOXCH_RC_BOX_BR 0xE06A /* USER BOX BOTTOM RIGHT */ +#define HB_BOXCH_RC_BOX_B 0xE06B /* USER BOX BOTTOM */ +#define HB_BOXCH_RC_BOX_BL 0xE06C /* USER BOX BOTTOM LEFT */ +#define HB_BOXCH_RC_BOX_L 0xE06D /* USER BOX LEFT */ +#define HB_BOXCH_RC_BOX_MT 0xE06E /* USER BOX MIDDLE TOP */ +#define HB_BOXCH_RC_BOX_MB 0xE06F /* USER BOX MIDDLE BOTTOM */ -#define HB_GTXWC_RC_BUTTON_CL 0xE070 /* USER BUTTON CHECK (LEFT) */ -#define HB_GTXWC_RC_BUTTON_CR 0xE071 /* USER BUTTON CHECK (RIGHT) */ +#define HB_BOXCH_RC_BUTTON_CL 0xE070 /* USER BUTTON CHECK (LEFT) */ +#define HB_BOXCH_RC_BUTTON_CR 0xE071 /* USER BUTTON CHECK (RIGHT) */ -#define HB_GTXWC_RC_FARROW_DL 0xE072 /* USER FAT ARROW DOWN (LEFT) */ -#define HB_GTXWC_RC_FARROW_DR 0xE073 /* USER FAT ARROW DOWN (RIGHT) */ +#define HB_BOXCH_RC_FARROW_DL 0xE072 /* USER FAT ARROW DOWN (LEFT) */ +#define HB_BOXCH_RC_FARROW_DR 0xE073 /* USER FAT ARROW DOWN (RIGHT) */ -#define HB_GTXWC_RC_DOTS 0xE074 /* USER DOTS */ -#define HB_GTXWC_RC_DOTS_L 0xE075 /* USER BIG DOTS (LEFT) */ -#define HB_GTXWC_RC_DOTS_R 0xE076 /* USER BIG DOTS (RIGHT) */ +#define HB_BOXCH_RC_DOTS 0xE074 /* USER DOTS */ +#define HB_BOXCH_RC_DOTS_L 0xE075 /* USER BIG DOTS (LEFT) */ +#define HB_BOXCH_RC_DOTS_R 0xE076 /* USER BIG DOTS (RIGHT) */ -#define HB_GTXWC_RC_MIN 0xE040 -#define HB_GTXWC_RC_MAX 0xE076 +#define HB_BOXCH_RC_MIN 0xE040 +#define HB_BOXCH_RC_MAX 0xE076 -#define HB_GTXWC_TRANS_COUNT ( HB_GTXWC_CHR_BASE + ( HB_GTXWC_BOX_MAX - HB_GTXWC_BOX_MIN + 1 ) + ( HB_GTXWC_RC_MAX - HB_GTXWC_RC_MIN + 1 ) ) -#define HB_GTXWC_TRANS_MAX 0xFF +#define HB_BOXCH_TRANS_COUNT ( HB_BOXCH_CHR_BASE + ( HB_BOXCH_BOX_MAX - HB_BOXCH_BOX_MIN + 1 ) + ( HB_BOXCH_RC_MAX - HB_BOXCH_RC_MIN + 1 ) ) +#define HB_BOXCH_TRANS_MAX 0xFF /********************** Unix to graphic box translation ******************/ diff --git a/src/rtl/hbgtcore.c b/src/rtl/hbgtcore.c index 8f7bc28bc9..bede936a77 100644 --- a/src/rtl/hbgtcore.c +++ b/src/rtl/hbgtcore.c @@ -2177,7 +2177,7 @@ static int hb_gt_def_Alert( PHB_GT pGT, PHB_ITEM pMessage, PHB_ITEM pOptions, HB_GTSELF_DISPEND( pGT ); HB_GTSELF_REFRESH( pGT ); - iKey = fKeyBoard ? HB_GTSELF_INKEYGET( pGT, HB_TRUE, dDelay, INKEY_ALL | HB_INKEY_EXT ) : 0; + iKey = fKeyBoard ? HB_GTSELF_INKEYGET( pGT, HB_TRUE, dDelay, INKEY_ALL ) : 0; if( iKey == K_ESC ) break; @@ -2277,7 +2277,7 @@ static int hb_gt_def_Alert( PHB_GT pGT, PHB_ITEM pMessage, PHB_ITEM pOptions, nChar = 0; while( iRet == 0 ) { - iKey = fKeyBoard ? HB_GTSELF_INKEYGET( pGT, HB_TRUE, dDelay, INKEY_ALL | HB_INKEY_EXT ) : 0; + iKey = fKeyBoard ? HB_GTSELF_INKEYGET( pGT, HB_TRUE, dDelay, INKEY_ALL ) : 0; if( iKey == 0 ) iRet = 1; else if( iKey == K_ESC ) @@ -2711,22 +2711,29 @@ static void hb_gt_def_InkeyPut( PHB_GT pGT, int iKey ) iHead = pGT->inkeyHead; - if( iKey == K_MOUSEMOVE ) + if( pGT->inkeyHead != pGT->inkeyTail && pGT->inkeyLastPos >= 0 && + ( iKey == K_MOUSEMOVE || HB_INKEY_ISMOUSEPOS( iKey ) ) ) { /* * Clipper does not store in buffer repeated mouse movement * IMHO it's good idea to reduce unnecessary inkey buffer * overloading so I also implemented it, [druzus] */ - if( pGT->iLastPut == iKey && pGT->inkeyHead != pGT->inkeyTail ) + int iLastKey = pGT->inkeyBuffer[ pGT->inkeyLastPos ]; + + if( iLastKey == K_MOUSEMOVE || HB_INKEY_ISMOUSEPOS( iLastKey ) ) + { + if( HB_INKEY_ISMOUSEPOS( iKey ) ) + pGT->inkeyBuffer[ pGT->inkeyLastPos ] = iKey; return; + } } /* * When the buffer is full new event overwrite the last one * in the buffer - it's Clipper behavior, [druzus] */ - pGT->inkeyBuffer[ iHead++ ] = pGT->iLastPut = iKey; + pGT->inkeyBuffer[ pGT->inkeyLastPos = iHead++ ] = iKey; if( iHead >= pGT->inkeyBufferSize ) iHead = 0; @@ -2751,6 +2758,7 @@ static void hb_gt_def_InkeyIns( PHB_GT pGT, int iKey ) { if( --pGT->inkeyHead < 0 ) pGT->inkeyHead = pGT->inkeyBufferSize - 1; + pGT->inkeyLastPos = -1; } } @@ -2979,6 +2987,7 @@ static void hb_gt_def_InkeyReset( PHB_GT pGT ) pGT->inkeyHead = 0; pGT->inkeyTail = 0; + pGT->inkeyLastPos = -1; iTypeAhead = hb_setGetTypeAhead(); @@ -3268,7 +3277,7 @@ static int hb_gt_def_MouseReadKey( PHB_GT pGT, int iEventMask ) { pGT->iMouseLastRow = iRow; pGT->iMouseLastCol = iCol; - iKey = K_MOUSEMOVE; + iKey = HB_INKEY_NEW_MPOS( iCol, iRow ); } } } diff --git a/src/rtl/inkey.c b/src/rtl/inkey.c index 985c8650eb..69606b78e4 100644 --- a/src/rtl/inkey.c +++ b/src/rtl/inkey.c @@ -257,3 +257,8 @@ HB_FUNC( HB_KEYSTD ) { hb_retni( hb_inkeyKeyStd( hb_parni( 1 ) ) ); } + +HB_FUNC( HB_KEYMOD ) +{ + hb_retni( hb_inkeyKeyMod( hb_parni( 1 ) ) ); +} diff --git a/src/rtl/inkeyapi.c b/src/rtl/inkeyapi.c index cb8e58e06c..3ce3b75e05 100644 --- a/src/rtl/inkeyapi.c +++ b/src/rtl/inkeyapi.c @@ -59,6 +59,166 @@ #include "hbgtcore.h" +/* xHarbour compatible definitions */ +#if !defined( K_SH_LEFT ) +#define K_SH_LEFT K_LEFT /* Shift-Left == Left */ +#define K_SH_UP K_UP /* Shift-Up == Up */ +#define K_SH_RIGHT K_RIGHT /* Shift-Right == Right */ +#define K_SH_DOWN K_DOWN /* Shift-Down == Down */ +#define K_SH_INS K_INS /* Shift-Ins == Ins */ +#define K_SH_DEL K_DEL /* Shift-Del == Del */ +#define K_SH_HOME K_HOME /* Shift-Home == Home */ +#define K_SH_END K_END /* Shift-End == End */ +#define K_SH_PGUP K_PGUP /* Shift-PgUp == PgUp */ +#define K_SH_PGDN K_PGDN /* Shift-PgDn == PgDn */ +#define K_SH_RETURN K_RETURN /* Shift-Enter == Enter */ +#define K_SH_ENTER K_ENTER /* Shift-Enter == Enter */ +#endif + +typedef struct +{ + short key; + short alt_key; + short ctrl_key; + short shift_key; +} HB_KEY_VALUE; + +static const int s_keyPadCtrl[] = { + K_CTRL_INS, K_CTRL_END, K_CTRL_DOWN, K_CTRL_PGDN, K_CTRL_LEFT, + KP_CTRL_5, K_CTRL_RIGHT, K_CTRL_HOME, K_CTRL_UP, K_CTRL_PGUP +}; + +static const HB_KEY_VALUE s_transKeyFun[] = { + { K_F1, K_ALT_F1, K_CTRL_F1, K_SH_F1 }, /* 01 */ + { K_F2, K_ALT_F2, K_CTRL_F2, K_SH_F2 }, /* 02 */ + { K_F3, K_ALT_F3, K_CTRL_F3, K_SH_F3 }, /* 03 */ + { K_F4, K_ALT_F4, K_CTRL_F4, K_SH_F4 }, /* 04 */ + { K_F5, K_ALT_F5, K_CTRL_F5, K_SH_F5 }, /* 05 */ + { K_F6, K_ALT_F6, K_CTRL_F6, K_SH_F6 }, /* 06 */ + { K_F7, K_ALT_F7, K_CTRL_F7, K_SH_F7 }, /* 07 */ + { K_F8, K_ALT_F8, K_CTRL_F8, K_SH_F8 }, /* 08 */ + { K_F9, K_ALT_F9, K_CTRL_F9, K_SH_F9 }, /* 09 */ + { K_F10, K_ALT_F10, K_CTRL_F10, K_SH_F10 }, /* 10 */ + { K_F11, K_ALT_F11, K_CTRL_F11, K_SH_F11 }, /* 11 */ + { K_F12, K_ALT_F12, K_CTRL_F12, K_SH_F12 }, /* 12 */ + { K_UP, K_ALT_UP, K_CTRL_UP, K_SH_UP }, /* 13 */ + { K_DOWN, K_ALT_DOWN, K_CTRL_DOWN, K_SH_DOWN }, /* 14 */ + { K_LEFT, K_ALT_LEFT, K_CTRL_LEFT, K_SH_LEFT }, /* 15 */ + { K_RIGHT, K_ALT_RIGHT, K_CTRL_RIGHT, K_SH_RIGHT }, /* 16 */ + { K_HOME, K_ALT_HOME, K_CTRL_HOME, K_SH_HOME }, /* 17 */ + { K_END, K_ALT_END, K_CTRL_END, K_SH_END }, /* 18 */ + { K_PGUP, K_ALT_PGUP, K_CTRL_PGUP, K_SH_PGUP }, /* 19 */ + { K_PGDN, K_ALT_PGDN, K_CTRL_PGDN, K_SH_PGDN }, /* 20 */ + { K_INS, K_ALT_INS, K_CTRL_INS, K_SH_INS }, /* 21 */ + { K_DEL, K_ALT_DEL, K_CTRL_DEL, K_SH_DEL }, /* 22 */ + { K_BS, K_ALT_BS, K_CTRL_BS, K_SH_BS }, /* 23 */ + { K_TAB, K_ALT_TAB, K_CTRL_TAB, K_SH_TAB }, /* 24 */ + { K_ESC, K_ALT_ESC, K_ESC, 0 }, /* 25 */ + { K_ENTER, K_ALT_ENTER, K_CTRL_ENTER, K_SH_ENTER }, /* 26 */ + { KP_CENTER, 0, KP_CTRL_5, '5' }, /* 27 */ + { 0, 0, K_CTRL_PRTSCR, 0 }, /* 28 */ + { 0, 0, HB_BREAK_FLAG, 0 } /* 29 */ +}; + +static const HB_KEY_VALUE s_transKeyStd[] = { + { K_SPACE, 0, 0, 0 }, /* 32 */ + { '!', 0, 0, 0 }, /* 33 */ + { '"', 0, 0, 0 }, /* 34 */ + { '#', 0, 0, 0 }, /* 35 */ + { '$', 0, 0, 0 }, /* 36 */ + { '%', 0, 0, 0 }, /* 37 */ + { '&', 0, 0, 0 }, /* 38 */ + { '\'', K_ALT_QUOTE, 7, 0 }, /* 39 */ + { '(', 0, 0, 0 }, /* 40 */ + { ')', 0, 0, 0 }, /* 41 */ + { '*', 0, 0, 0 }, /* 42 */ + { '+', 0, 0, 0 }, /* 43 */ + { ',', K_ALT_COMMA, 0, 0 }, /* 44 */ + { '-', K_ALT_MINUS, 31, 0 }, /* 45 */ + { '.', K_ALT_PERIOD, 0, 0 }, /* 46 */ + { '/', K_CTRL_QUESTION, K_CTRL_BS, 0 }, /* 47 */ + { '0', K_ALT_0, 0, 0 }, /* 48 */ + { '1', K_ALT_1, 0, 0 }, /* 49 */ + { '2', K_ALT_2, 259, 0 }, /* 50 */ + { '3', K_ALT_3, 27, 0 }, /* 51 */ + { '4', K_ALT_4, 28, 0 }, /* 52 */ + { '5', K_ALT_5, 29, 0 }, /* 53 */ + { '6', K_ALT_6, 30, 0 }, /* 54 */ + { '7', K_ALT_7, 31, 0 }, /* 55 */ + { '8', K_ALT_8, 127, 0 }, /* 56 */ + { '9', K_ALT_9, 0, 0 }, /* 57 */ + { ':', 0, 0, 0 }, /* 58 */ + { ';', K_ALT_SC, 0, 0 }, /* 59 */ + { '<', 0, 0, 0 }, /* 60 */ + { '=', K_ALT_EQUALS, 0, 0 }, /* 61 */ + { '>', 0, 0, 0 }, /* 62 */ + { '?', 0, K_CTRL_QUESTION, 0 }, /* 63 */ + { '@', 0, 0, 0 }, /* 64 */ + { 'A', K_ALT_A, K_CTRL_A, 0 }, /* 65 */ + { 'B', K_ALT_B, K_CTRL_B, 0 }, /* 66 */ + { 'C', K_ALT_C, K_CTRL_C, 0 }, /* 67 */ + { 'D', K_ALT_D, K_CTRL_D, 0 }, /* 68 */ + { 'E', K_ALT_E, K_CTRL_E, 0 }, /* 69 */ + { 'F', K_ALT_F, K_CTRL_F, 0 }, /* 70 */ + { 'G', K_ALT_G, K_CTRL_G, 0 }, /* 71 */ + { 'H', K_ALT_H, K_CTRL_H, 0 }, /* 72 */ + { 'I', K_ALT_I, K_CTRL_I, 0 }, /* 73 */ + { 'J', K_ALT_J, K_CTRL_J, 0 }, /* 74 */ + { 'K', K_ALT_K, K_CTRL_K, 0 }, /* 75 */ + { 'L', K_ALT_L, K_CTRL_L, 0 }, /* 76 */ + { 'M', K_ALT_M, K_CTRL_M, 0 }, /* 77 */ + { 'N', K_ALT_N, K_CTRL_N, 0 }, /* 78 */ + { 'O', K_ALT_O, K_CTRL_O, 0 }, /* 79 */ + { 'P', K_ALT_P, K_CTRL_P, 0 }, /* 80 */ + { 'Q', K_ALT_Q, K_CTRL_Q, 0 }, /* 81 */ + { 'R', K_ALT_R, K_CTRL_R, 0 }, /* 82 */ + { 'S', K_ALT_S, K_CTRL_S, 0 }, /* 83 */ + { 'T', K_ALT_T, K_CTRL_T, 0 }, /* 84 */ + { 'U', K_ALT_U, K_CTRL_U, 0 }, /* 85 */ + { 'V', K_ALT_V, K_CTRL_V, 0 }, /* 86 */ + { 'W', K_ALT_W, K_CTRL_W, 0 }, /* 87 */ + { 'X', K_ALT_X, K_CTRL_X, 0 }, /* 88 */ + { 'Y', K_ALT_Y, K_CTRL_Y, 0 }, /* 89 */ + { 'Z', K_ALT_Z, K_CTRL_Z, 0 }, /* 90 */ + { '[', K_ALT_OSB, 27, 0 }, /* 91 */ + { '\\', K_ALT_BACKSLASH, 28, 0 }, /* 92 */ + { ']', K_ALT_CSB, 29, 0 }, /* 93 */ + { '^', K_ALT_6, 30, 0 }, /* 94 */ + { '_', K_ALT_MINUS, 31, 0 }, /* 95 */ + { '`', K_ALT_BACKQUOTE, K_ALT_BACKQUOTE, 0 }, /* 96 */ + { 'a', K_ALT_A, K_CTRL_A, 0 }, /* 97 */ + { 'b', K_ALT_B, K_CTRL_B, 0 }, /* 98 */ + { 'c', K_ALT_C, K_CTRL_C, 0 }, /* 99 */ + { 'd', K_ALT_D, K_CTRL_D, 0 }, /* 100 */ + { 'e', K_ALT_E, K_CTRL_E, 0 }, /* 101 */ + { 'f', K_ALT_F, K_CTRL_F, 0 }, /* 102 */ + { 'g', K_ALT_G, K_CTRL_G, 0 }, /* 103 */ + { 'h', K_ALT_H, K_CTRL_H, 0 }, /* 104 */ + { 'i', K_ALT_I, K_CTRL_I, 0 }, /* 105 */ + { 'j', K_ALT_J, K_CTRL_J, 0 }, /* 106 */ + { 'k', K_ALT_K, K_CTRL_K, 0 }, /* 107 */ + { 'l', K_ALT_L, K_CTRL_L, 0 }, /* 108 */ + { 'm', K_ALT_M, K_CTRL_M, 0 }, /* 109 */ + { 'n', K_ALT_N, K_CTRL_N, 0 }, /* 110 */ + { 'o', K_ALT_O, K_CTRL_O, 0 }, /* 111 */ + { 'p', K_ALT_P, K_CTRL_P, 0 }, /* 112 */ + { 'q', K_ALT_Q, K_CTRL_Q, 0 }, /* 113 */ + { 'r', K_ALT_R, K_CTRL_R, 0 }, /* 114 */ + { 's', K_ALT_S, K_CTRL_S, 0 }, /* 115 */ + { 't', K_ALT_T, K_CTRL_T, 0 }, /* 116 */ + { 'u', K_ALT_U, K_CTRL_U, 0 }, /* 117 */ + { 'v', K_ALT_V, K_CTRL_V, 0 }, /* 118 */ + { 'w', K_ALT_W, K_CTRL_W, 0 }, /* 119 */ + { 'x', K_ALT_X, K_CTRL_X, 0 }, /* 120 */ + { 'y', K_ALT_Y, K_CTRL_Y, 0 }, /* 121 */ + { 'z', K_ALT_Z, K_CTRL_Z, 0 }, /* 122 */ + { '{', K_ALT_OSB, 27, 0 }, /* 123 */ + { '|', K_ALT_BACKSLASH, 28, 0 }, /* 124 */ + { '}', K_ALT_CSB, 29, 0 }, /* 125 */ + { '~', K_ALT_BACKQUOTE, K_ALT_BACKQUOTE, 0 }, /* 126 */ + { K_CTRL_BS, K_ALT_BS, K_CTRL_BS, 0 }, /* 127 */ +}; + int hb_inkey( HB_BOOL fWait, double dSeconds, int iEventMask ) { int iKey = 0; @@ -193,18 +353,6 @@ void hb_inkeyReset( void ) } } -void hb_inkeySetCancelKeys( int iCancelKey, int iCancelKeyEx ) -{ - HB_TRACE( HB_TR_DEBUG, ( "hb_inkeySetCancelKeys(%d,%d)", iCancelKey, iCancelKeyEx ) ); - -/* - s_InkeyAltC = iCancelKey; - s_InkeyAltCEx = iCancelKeyEx; - */ - HB_SYMBOL_UNUSED( iCancelKey ); - HB_SYMBOL_UNUSED( iCancelKeyEx ); -} - HB_SIZE hb_inkeyKeyString( int iKey, char * buffer, HB_SIZE nSize ) { HB_SIZE nLen = 0; @@ -229,28 +377,111 @@ HB_SIZE hb_inkeyKeyString( int iKey, char * buffer, HB_SIZE nSize ) return nLen; } +int s_inkeyTransChar( int iKey, int iFlags, const HB_KEY_VALUE * pKeyVal ) +{ + if( ( iFlags & HB_KF_KEYPAD ) != 0 && + ( iFlags & ( HB_KF_ALT | HB_KF_CTRL ) ) != 0 ) + { + switch( iKey ) + { + case HB_KX_ENTER: + if( iFlags & HB_KF_ALT ) + return KP_ALT_ENTER; + break; + case '+': + return iFlags & HB_KF_ALT ? KP_ALT_PLUS : KP_CTRL_PLUS; + case '-': + return iFlags & HB_KF_ALT ? KP_ALT_MINUS : KP_CTRL_MINUS; + case '*': + return iFlags & HB_KF_ALT ? KP_ALT_ASTERISK : KP_CTRL_ASTERISK; + case '/': + return iFlags & HB_KF_ALT ? KP_ALT_SLASH : KP_CTRL_SLASH; + case '.': + case ',': + if( iFlags & HB_KF_CTRL ) + return K_CTRL_DEL; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if( iFlags & HB_KF_CTRL ) + return s_keyPadCtrl[ iKey - '0' ]; + break; + } + } + + if( ( iFlags & HB_KF_ALT ) != 0 && pKeyVal->alt_key ) + return pKeyVal->alt_key; + else if( ( iFlags & HB_KF_CTRL ) != 0 && ( pKeyVal->ctrl_key || pKeyVal->key == '@' ) ) + return pKeyVal->ctrl_key; + else if( ( iFlags & HB_KF_SHIFT ) != 0 && pKeyVal->shift_key ) + return pKeyVal->shift_key; + else + return pKeyVal->key; +} + int hb_inkeyKeyStd( int iKey ) { HB_TRACE( HB_TR_DEBUG, ( "hb_inkeyKeyStd(%d)", iKey ) ); if( HB_INKEY_ISEXT( iKey ) ) { - if( HB_INKEY_ISUNICODE( iKey ) ) + int iFlags = HB_INKEY_FLAGS( iKey ); + + if( HB_INKEY_ISMOUSEPOS( iKey ) ) + iKey = K_MOUSEMOVE; + else if( HB_INKEY_ISKEY( iKey ) ) { - HB_WCHAR wc = ( HB_WCHAR ) HB_INKEY_VALUE( iKey ); - if( wc ) + iKey = HB_INKEY_VALUE( iKey ); + + if( iKey > 0 && iKey <= ( int ) HB_SIZEOFARRAY( s_transKeyFun ) ) + iKey = s_inkeyTransChar( iKey, iFlags, &s_transKeyFun[ iKey - 1 ] ); + else if( iKey >= 32 && iKey <= 127 ) + iKey = s_inkeyTransChar( iKey, iFlags, &s_transKeyStd[ iKey - 32 ] ); + } + else if( HB_INKEY_ISCHAR( iKey ) || HB_INKEY_ISUNICODE( iKey ) ) + { + int iVal = HB_INKEY_VALUE( iKey ); + + if( iVal >= 32 && iVal <= 127 && + ( iFlags & ( HB_KF_ALT | HB_KF_CTRL ) ) != 0 ) + iKey = s_inkeyTransChar( iVal, iFlags, &s_transKeyStd[ iVal - 32 ] ); + else if( HB_INKEY_ISUNICODE( iKey ) ) { - HB_UCHAR uc = hb_cdpGetUC( hb_vmCDP(), wc, 0 ); - if( uc != 0 ) - iKey = uc; + HB_WCHAR wc = ( HB_WCHAR ) iVal; + if( wc ) + { + HB_UCHAR uc = hb_cdpGetUC( hb_vmCDP(), wc, 0 ); + if( uc != 0 ) + iKey = uc; + } + else + iKey = 0; } else - iKey = 0; + iKey = iVal; } - else if( HB_INKEY_ISMOUSEPOS( iKey ) ) - iKey = K_MOUSEMOVE; - else + else /* HB_INKEY_ISMOUSEKEY | HB_INKEY_ISEVENT */ iKey = HB_INKEY_VALUE( iKey ); } return iKey; } + +int hb_inkeyKeyMod( int iKey ) +{ + int iFlags = 0; + + HB_TRACE( HB_TR_DEBUG, ( "hb_inkeyKeyMod(%d)", iKey ) ); + + if( HB_INKEY_ISEXT( iKey ) && ! HB_INKEY_ISMOUSEPOS( iKey ) ) + iFlags = HB_INKEY_FLAGS( iKey ); + + return iFlags; +} diff --git a/src/vm/cmdarg.c b/src/vm/cmdarg.c index a8b8e38330..70cac6048c 100644 --- a/src/vm/cmdarg.c +++ b/src/vm/cmdarg.c @@ -802,11 +802,9 @@ HB_FUNC( HB_CMDLINE ) } /* Check for command line internal arguments */ -HB_U32 hb_cmdargProcessVM( int * pCancelKey, int * pCancelKeyEx ) +void hb_cmdargProcess( void ) { - char * cFlags; - HB_U32 ulFlags = HB_VMFLAG_HARBOUR; - int iHandles, iVal; + int iHandles; if( hb_cmdargCheck( "INFO" ) ) { @@ -850,49 +848,6 @@ HB_U32 hb_cmdargProcessVM( int * pCancelKey, int * pCancelKeyEx ) #endif #endif } - - if( ( cFlags = hb_cmdargString( "FLAGS" ) ) != NULL ) - { - int i = 0; - while( cFlags[ i ] ) - { - switch( cFlags[ i++ ] ) - { - case 'c': - /* clear all flags - minimal set of features */ - ulFlags = 0; - break; - - case 'h': - /* default Harbour mode */ - ulFlags |= HB_VMFLAG_HARBOUR; - break; -#if 0 - case 'x': - ulFlags |= HB_VMFLAG_XBASE; - break; - - case 'r': - ulFlags |= HB_VMFLAG_RT_MACRO; - break; -#endif - case 's': - ulFlags |= HB_VMFLAG_ARRSTR; - break; - } - } - hb_xfree( cFlags ); - } - - iVal = hb_cmdargNum( "CANCEL" ); - if( iVal ) - *pCancelKey = iVal; - - iVal = hb_cmdargNum( "CANCELEX" ); - if( iVal ) - *pCancelKeyEx = iVal; - - return ulFlags; } /* Source repository revision number */ diff --git a/src/vm/hvm.c b/src/vm/hvm.c index e1ddf4a16f..2de31e2792 100644 --- a/src/vm/hvm.c +++ b/src/vm/hvm.c @@ -81,8 +81,6 @@ #include "hbset.h" #include "hbdate.h" #include "hbmath.h" -#include "hbinkey.ch" -#include "inkey.ch" #include "hbdebug.ch" #if defined( HB_MT_VM ) # include "hbthread.h" @@ -272,17 +270,6 @@ static HB_BOOL s_fCloneSym = HB_FALSE;/* clone registered symbol tables */ /* main VM thread stack ID */ static void * s_main_thread = NULL; -/* Various compatibility flags - */ -static HB_U32 s_VMFlags = HB_VMFLAG_HARBOUR; -#undef hb_vmFlagEnabled -#define hb_vmFlagEnabled( flag ) ( s_VMFlags & ( flag ) ) - -/* Keycodes to stop virtual machine - */ -static int s_VMCancelKey = K_ALT_C; -static int s_VMCancelKeyEx = HB_K_ALT_C; - /* SEQUENCE envelope items position from stack top active */ #define HB_RECOVER_STATE -1 @@ -1009,8 +996,7 @@ void hb_vmInit( HB_BOOL bStartMainProc ) hb_conInit(); /* Check for some internal switches */ - s_VMFlags = hb_cmdargProcessVM( &s_VMCancelKey, &s_VMCancelKeyEx ); - hb_inkeySetCancelKeys( s_VMCancelKey, s_VMCancelKeyEx ); + hb_cmdargProcess(); hb_i18n_init(); /* initialize i18n module */ @@ -11766,24 +11752,6 @@ void hb_xvmWithObjectMessage( PHB_SYMB pSymbol ) hb_stackAllocItem()->type = HB_IT_NIL; } - - -#undef hb_vmFlagEnabled -HB_U32 hb_vmFlagEnabled( HB_U32 flags ) -{ - return s_VMFlags & flags; -} - -void hb_vmFlagSet( HB_U32 flags ) -{ - s_VMFlags |= flags; -} - -void hb_vmFlagClear( HB_U32 flags ) -{ - s_VMFlags &= ~flags; -} - /* ------------------------------------------------------------------------ */ /* The debugger support functions */ /* ------------------------------------------------------------------------ */ diff --git a/tests/gtkeys.prg b/tests/gtkeys.prg index 5869a54947..30b562f171 100644 --- a/tests/gtkeys.prg +++ b/tests/gtkeys.prg @@ -20,6 +20,9 @@ REQUEST HB_CODEPAGE_PLWIN #define hb_keyChar( c ) Chr( c ) #define hb_ntos( n ) LTrim( Str( n ) ) #endif +#ifndef HB_K_RESIZE +#define HB_K_RESIZE 1101 +#endif PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) @@ -57,11 +60,21 @@ PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) { "K_CTRL_RETURN", 10, "Ctrl-Return" }, ; { "K_CTRL_RET", 10, "Ctrl-Return (Compat.)" }, ; { "K_CTRL_PRTSCR", 379, "Ctrl-Print Screen" }, ; - { "K_CTRL_QUESTION", 309, "Ctrl-?" }, ; + { "K_ALT_COMMA", 307, "Alt-," }, ; + { "K_ALT_PERIOD", 308, "Alt-." }, ; + { "K_CTRL_QUESTION", 309, "Ctrl-?, Alt-Slash" }, ; + { "K_ALT_SLASH", 309, "Alt-Slash" }, ; + { "K_ALT_BACKSLASH", 299, "Alt-Backslash" }, ; { "K_ALT_ENTER", 284, "Alt-Enter" }, ; { "K_ALT_RETURN", 284, "Alt-Return" }, ; + { "K_ALT_MINUS", 386, "Alt-Minus" }, ; { "K_ALT_EQUALS", 387, "Alt-Equals" }, ; { "K_ALT_ESC", 257, "Alt-Esc" }, ; + { "K_ALT_BACKQUOTE", 297, "Alt-backquote" }, ; + { "K_ALT_OSB", 282, "Alt-[" }, ; + { "K_ALT_CSB", 283, "Alt-]" }, ; + { "K_ALT_SC", 295, "Alt-;" }, ; + { "K_ALT_QUOTE", 296, "Alt-'" }, ; { "KP_CENTER", 332, "Keypad CENTER (5)" }, ; { "KP_ALT_ENTER", 422, "Keypad Alt-Enter" }, ; { "KP_CTRL_5", 399, "Keypad Ctrl-5" }, ; @@ -77,6 +90,8 @@ PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) { "K_INS", 22, "Ins, Ctrl-V" }, ; { "K_DEL", 7, "Del, Ctrl-G" }, ; { "K_BS", 8, "Backspace, Ctrl-H" }, ; + { "K_SH_BS", 423, "Shift-Backspace, Ctrl-Shift-Tab" }, ; + { "K_CTRL_SH_TAB", 423, "Ctrl-Shift-Tab" }, ; { "K_TAB", 9, "Tab, Ctrl-I" }, ; { "K_SH_TAB", 271, "Shift-Tab" }, ; { "K_CTRL_INS", 402, "Ctrl-Ins" }, ; @@ -86,151 +101,163 @@ PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) { "K_ALT_INS", 418, "Alt-Ins" }, ; { "K_ALT_DEL", 419, "Alt-Del" }, ; { "K_ALT_BS", 270, "Alt-Backspace" }, ; - { "K_ALT_TAB", 421, "Alt-Tab" }, ; - { "K_CTRL_A", 1, "Ctrl-A, Home" }, ; - { "K_CTRL_B", 2, "Ctrl-B, Ctrl-Right arrow" }, ; - { "K_CTRL_C", 3, "Ctrl-C, PgDn, Ctrl-ScrollLock" }, ; - { "K_CTRL_D", 4, "Ctrl-D, Right arrow" }, ; - { "K_CTRL_E", 5, "Ctrl-E, Up arrow" }, ; - { "K_CTRL_F", 6, "Ctrl-F, End" }, ; - { "K_CTRL_G", 7, "Ctrl-G, Del" }, ; - { "K_CTRL_H", 8, "Ctrl-H, Backspace" }, ; - { "K_CTRL_I", 9, "Ctrl-I, Tab" }, ; - { "K_CTRL_J", 10, "Ctrl-J" }, ; - { "K_CTRL_K", 11, "Ctrl-K" }, ; - { "K_CTRL_L", 12, "Ctrl-L" }, ; - { "K_CTRL_M", 13, "Ctrl-M, Return" }, ; - { "K_CTRL_N", 14, "Ctrl-N" }, ; - { "K_CTRL_O", 15, "Ctrl-O" }, ; - { "K_CTRL_P", 16, "Ctrl-P" }, ; - { "K_CTRL_Q", 17, "Ctrl-Q" }, ; - { "K_CTRL_R", 18, "Ctrl-R, PgUp" }, ; - { "K_CTRL_S", 19, "Ctrl-S, Left arrow" }, ; - { "K_CTRL_T", 20, "Ctrl-T" }, ; - { "K_CTRL_U", 21, "Ctrl-U" }, ; - { "K_CTRL_V", 22, "Ctrl-V, Ins" }, ; - { "K_CTRL_W", 23, "Ctrl-W, Ctrl-End" }, ; - { "K_CTRL_X", 24, "Ctrl-X, Down arrow" }, ; - { "K_CTRL_Y", 25, "Ctrl-Y" }, ; - { "K_CTRL_Z", 26, "Ctrl-Z, Ctrl-Left arrow" } } + { "K_ALT_TAB", 421, "Alt-Tab" } } - AAdd( aKeys, { "K_ALT_A", 286, "Alt-A" } ) - AAdd( aKeys, { "K_ALT_B", 304, "Alt-B" } ) - AAdd( aKeys, { "K_ALT_C", 302, "Alt-C" } ) - AAdd( aKeys, { "K_ALT_D", 288, "Alt-D" } ) - AAdd( aKeys, { "K_ALT_E", 274, "Alt-E" } ) - AAdd( aKeys, { "K_ALT_F", 289, "Alt-F" } ) - AAdd( aKeys, { "K_ALT_G", 290, "Alt-G" } ) - AAdd( aKeys, { "K_ALT_H", 291, "Alt-H" } ) - AAdd( aKeys, { "K_ALT_I", 279, "Alt-I" } ) - AAdd( aKeys, { "K_ALT_J", 292, "Alt-J" } ) - AAdd( aKeys, { "K_ALT_K", 293, "Alt-K" } ) - AAdd( aKeys, { "K_ALT_L", 294, "Alt-L" } ) - AAdd( aKeys, { "K_ALT_M", 306, "Alt-M" } ) - AAdd( aKeys, { "K_ALT_N", 305, "Alt-N" } ) - AAdd( aKeys, { "K_ALT_O", 280, "Alt-O" } ) - AAdd( aKeys, { "K_ALT_P", 281, "Alt-P" } ) - AAdd( aKeys, { "K_ALT_Q", 272, "Alt-Q" } ) - AAdd( aKeys, { "K_ALT_R", 275, "Alt-R" } ) - AAdd( aKeys, { "K_ALT_S", 287, "Alt-S" } ) - AAdd( aKeys, { "K_ALT_T", 276, "Alt-T" } ) - AAdd( aKeys, { "K_ALT_U", 278, "Alt-U" } ) - AAdd( aKeys, { "K_ALT_V", 303, "Alt-V" } ) - AAdd( aKeys, { "K_ALT_W", 273, "Alt-W" } ) - AAdd( aKeys, { "K_ALT_X", 301, "Alt-X" } ) - AAdd( aKeys, { "K_ALT_Y", 277, "Alt-Y" } ) - AAdd( aKeys, { "K_ALT_Z", 300, "Alt-Z" } ) - AAdd( aKeys, { "K_ALT_1", 376, "Alt-1" } ) - AAdd( aKeys, { "K_ALT_2", 377, "Alt-2" } ) - AAdd( aKeys, { "K_ALT_3", 378, "Alt-3" } ) - AAdd( aKeys, { "K_ALT_4", 379, "Alt-4" } ) - AAdd( aKeys, { "K_ALT_5", 380, "Alt-5" } ) - AAdd( aKeys, { "K_ALT_6", 381, "Alt-6" } ) - AAdd( aKeys, { "K_ALT_7", 382, "Alt-7" } ) - AAdd( aKeys, { "K_ALT_8", 383, "Alt-8" } ) - AAdd( aKeys, { "K_ALT_9", 384, "Alt-9" } ) - AAdd( aKeys, { "K_ALT_0", 385, "Alt-0" } ) - AAdd( aKeys, { "K_F1", 28, "F1, Ctrl-Backslash" } ) - AAdd( aKeys, { "K_F2", - 1, "F2" } ) - AAdd( aKeys, { "K_F3", - 2, "F3" } ) - AAdd( aKeys, { "K_F4", - 3, "F4" } ) - AAdd( aKeys, { "K_F5", - 4, "F5" } ) - AAdd( aKeys, { "K_F6", - 5, "F6" } ) - AAdd( aKeys, { "K_F7", - 6, "F7" } ) - AAdd( aKeys, { "K_F8", - 7, "F8" } ) - AAdd( aKeys, { "K_F9", - 8, "F9" } ) - AAdd( aKeys, { "K_F10", - 9, "F10" } ) - AAdd( aKeys, { "K_F11", - 40, "F11" } ) - AAdd( aKeys, { "K_F12", - 41, "F12" } ) - AAdd( aKeys, { "K_CTRL_F1", - 20, "Ctrl-F1" } ) - AAdd( aKeys, { "K_CTRL_F2", - 21, "Ctrl-F2" } ) - AAdd( aKeys, { "K_CTRL_F3", - 22, "Ctrl-F4" } ) - AAdd( aKeys, { "K_CTRL_F4", - 23, "Ctrl-F3" } ) - AAdd( aKeys, { "K_CTRL_F5", - 24, "Ctrl-F5" } ) - AAdd( aKeys, { "K_CTRL_F6", - 25, "Ctrl-F6" } ) - AAdd( aKeys, { "K_CTRL_F7", - 26, "Ctrl-F7" } ) - AAdd( aKeys, { "K_CTRL_F8", - 27, "Ctrl-F8" } ) - AAdd( aKeys, { "K_CTRL_F9", - 28, "Ctrl-F9" } ) - AAdd( aKeys, { "K_CTRL_F10", - 29, "Ctrl-F10" } ) - AAdd( aKeys, { "K_CTRL_F11", - 44, "Ctrl-F11" } ) - AAdd( aKeys, { "K_CTRL_F12", - 45, "Ctrl-F12" } ) - AAdd( aKeys, { "K_ALT_F1", - 30, "Alt-F1" } ) - AAdd( aKeys, { "K_ALT_F2", - 31, "Alt-F2" } ) - AAdd( aKeys, { "K_ALT_F3", - 32, "Alt-F3" } ) - AAdd( aKeys, { "K_ALT_F4", - 33, "Alt-F4" } ) - AAdd( aKeys, { "K_ALT_F5", - 34, "Alt-F5" } ) - AAdd( aKeys, { "K_ALT_F6", - 35, "Alt-F6" } ) - AAdd( aKeys, { "K_ALT_F7", - 36, "Alt-F7" } ) - AAdd( aKeys, { "K_ALT_F8", - 37, "Alt-F8" } ) - AAdd( aKeys, { "K_ALT_F9", - 38, "Alt-F9" } ) - AAdd( aKeys, { "K_ALT_F10", - 39, "Alt-F10" } ) - AAdd( aKeys, { "K_ALT_F11", - 46, "Alt-F11" } ) - AAdd( aKeys, { "K_ALT_F12", - 47, "Alt-F12" } ) - AAdd( aKeys, { "K_SH_F1", - 10, "Shift-F1" } ) - AAdd( aKeys, { "K_SH_F2", - 11, "Shift-F2" } ) - AAdd( aKeys, { "K_SH_F3", - 12, "Shift-F3" } ) - AAdd( aKeys, { "K_SH_F4", - 13, "Shift-F4" } ) - AAdd( aKeys, { "K_SH_F5", - 14, "Shift-F5" } ) - AAdd( aKeys, { "K_SH_F6", - 15, "Shift-F6" } ) - AAdd( aKeys, { "K_SH_F7", - 16, "Shift-F7" } ) - AAdd( aKeys, { "K_SH_F8", - 17, "Shift-F8" } ) - AAdd( aKeys, { "K_SH_F9", - 18, "Shift-F9" } ) - AAdd( aKeys, { "K_SH_F10", - 19, "Shift-F10" } ) - AAdd( aKeys, { "K_SH_F11", - 42, "Shift-F11" } ) - AAdd( aKeys, { "K_SH_F12", - 43, "Shift-F12" } ) - AAdd( aKeys, { "K_MOUSEMOVE", 1001, "mouse move" } ) - AAdd( aKeys, { "K_LBUTTONDOWN", 1002, "mouse left button down" } ) - AAdd( aKeys, { "K_LBUTTONUP", 1003, "mouse left button up" } ) - AAdd( aKeys, { "K_RBUTTONDOWN", 1004, "mouse right button down" } ) - AAdd( aKeys, { "K_RBUTTONUP", 1005, "mouse right button up" } ) - AAdd( aKeys, { "K_LDBLCLK", 1006, "mouse left button double click" } ) - AAdd( aKeys, { "K_RDBLCLK", 1007, "mouse right button double click" } ) - AAdd( aKeys, { "K_MBUTTONDOWN", 1008, "mouse middle button down" } ) - AAdd( aKeys, { "K_MBUTTONUP", 1009, "mouse middle button up" } ) - AAdd( aKeys, { "K_MDBLCLK", 1010, "mouse middle button double click" } ) - AAdd( aKeys, { "K_MMLEFTDOWN", 1011, "Mouse Move Left Down" } ) - AAdd( aKeys, { "K_MMRIGHTDOWN", 1012, "Mouse Move Right Down" } ) - AAdd( aKeys, { "K_MMMIDDLEDOWN", 1013, "Mouse Move Middle Down" } ) - AAdd( aKeys, { "K_MWFORWARD", 1014, "Mouse Wheel Forward" } ) - AAdd( aKeys, { "K_MWBACKWARD", 1015, "Mouse Wheel Backward" } ) - AAdd( aKeys, { "K_NCMOUSEMOVE", 1016, "Non-Client Area Mouse Movement" } ) - AAdd( aKeys, { "HB_K_RESIZE", 1101, "screen dimension changed" } ) - AAdd( aKeys, { "HB_K_CLOSE", 1102, "close button hit" } ) - AAdd( aKeys, { "HB_K_GETFOCUS", 1103, "focus restored" } ) - AAdd( aKeys, { "HB_K_LOSTFOCUS", 1104, "focus lost" } ) - AAdd( aKeys, { "HB_K_CONNECT", 1105, "remote terminal connected" } ) - AAdd( aKeys, { "HB_K_DISCONNECT", 1106, "remote terminal disconnected" } ) + AAdd( aKeys, { "K_CTRL_A", 1, "Ctrl-A, Home" } ) + AAdd( aKeys, { "K_CTRL_B", 2, "Ctrl-B, Ctrl-Right arrow" } ) + AAdd( aKeys, { "K_CTRL_C", 3, "Ctrl-C, PgDn, Ctrl-ScrollLock" } ) + AAdd( aKeys, { "K_CTRL_D", 4, "Ctrl-D, Right arrow" } ) + AAdd( aKeys, { "K_CTRL_E", 5, "Ctrl-E, Up arrow" } ) + AAdd( aKeys, { "K_CTRL_F", 6, "Ctrl-F, End" } ) + AAdd( aKeys, { "K_CTRL_G", 7, "Ctrl-G, Del" } ) + AAdd( aKeys, { "K_CTRL_H", 8, "Ctrl-H, Backspace" } ) + AAdd( aKeys, { "K_CTRL_I", 9, "Ctrl-I, Tab" } ) + AAdd( aKeys, { "K_CTRL_J", 10, "Ctrl-J" } ) + AAdd( aKeys, { "K_CTRL_K", 11, "Ctrl-K" } ) + AAdd( aKeys, { "K_CTRL_L", 12, "Ctrl-L" } ) + AAdd( aKeys, { "K_CTRL_M", 13, "Ctrl-M, Return" } ) + AAdd( aKeys, { "K_CTRL_N", 14, "Ctrl-N" } ) + AAdd( aKeys, { "K_CTRL_O", 15, "Ctrl-O" } ) + AAdd( aKeys, { "K_CTRL_P", 16, "Ctrl-P" } ) + AAdd( aKeys, { "K_CTRL_Q", 17, "Ctrl-Q" } ) + AAdd( aKeys, { "K_CTRL_R", 18, "Ctrl-R, PgUp" } ) + AAdd( aKeys, { "K_CTRL_S", 19, "Ctrl-S, Left arrow" } ) + AAdd( aKeys, { "K_CTRL_T", 20, "Ctrl-T" } ) + AAdd( aKeys, { "K_CTRL_U", 21, "Ctrl-U" } ) + AAdd( aKeys, { "K_CTRL_V", 22, "Ctrl-V, Ins" } ) + AAdd( aKeys, { "K_CTRL_W", 23, "Ctrl-W, Ctrl-End" } ) + AAdd( aKeys, { "K_CTRL_X", 24, "Ctrl-X, Down arrow" } ) + AAdd( aKeys, { "K_CTRL_Y", 25, "Ctrl-Y" } ) + AAdd( aKeys, { "K_CTRL_Z", 26, "Ctrl-Z, Ctrl-Left arrow" } ) + + AAdd( aKeys, { "K_ALT_A", 286, "Alt-A" } ) + AAdd( aKeys, { "K_ALT_B", 304, "Alt-B" } ) + AAdd( aKeys, { "K_ALT_C", 302, "Alt-C" } ) + AAdd( aKeys, { "K_ALT_D", 288, "Alt-D" } ) + AAdd( aKeys, { "K_ALT_E", 274, "Alt-E" } ) + AAdd( aKeys, { "K_ALT_F", 289, "Alt-F" } ) + AAdd( aKeys, { "K_ALT_G", 290, "Alt-G" } ) + AAdd( aKeys, { "K_ALT_H", 291, "Alt-H" } ) + AAdd( aKeys, { "K_ALT_I", 279, "Alt-I" } ) + AAdd( aKeys, { "K_ALT_J", 292, "Alt-J" } ) + AAdd( aKeys, { "K_ALT_K", 293, "Alt-K" } ) + AAdd( aKeys, { "K_ALT_L", 294, "Alt-L" } ) + AAdd( aKeys, { "K_ALT_M", 306, "Alt-M" } ) + AAdd( aKeys, { "K_ALT_N", 305, "Alt-N" } ) + AAdd( aKeys, { "K_ALT_O", 280, "Alt-O" } ) + AAdd( aKeys, { "K_ALT_P", 281, "Alt-P" } ) + AAdd( aKeys, { "K_ALT_Q", 272, "Alt-Q" } ) + AAdd( aKeys, { "K_ALT_R", 275, "Alt-R" } ) + AAdd( aKeys, { "K_ALT_S", 287, "Alt-S" } ) + AAdd( aKeys, { "K_ALT_T", 276, "Alt-T" } ) + AAdd( aKeys, { "K_ALT_U", 278, "Alt-U" } ) + AAdd( aKeys, { "K_ALT_V", 303, "Alt-V" } ) + AAdd( aKeys, { "K_ALT_W", 273, "Alt-W" } ) + AAdd( aKeys, { "K_ALT_X", 301, "Alt-X" } ) + AAdd( aKeys, { "K_ALT_Y", 277, "Alt-Y" } ) + AAdd( aKeys, { "K_ALT_Z", 300, "Alt-Z" } ) + AAdd( aKeys, { "K_ALT_1", 376, "Alt-1" } ) + AAdd( aKeys, { "K_ALT_2", 377, "Alt-2" } ) + AAdd( aKeys, { "K_ALT_3", 378, "Alt-3" } ) + AAdd( aKeys, { "K_ALT_4", 379, "Alt-4" } ) + AAdd( aKeys, { "K_ALT_5", 380, "Alt-5" } ) + AAdd( aKeys, { "K_ALT_6", 381, "Alt-6" } ) + AAdd( aKeys, { "K_ALT_7", 382, "Alt-7" } ) + AAdd( aKeys, { "K_ALT_8", 383, "Alt-8" } ) + AAdd( aKeys, { "K_ALT_9", 384, "Alt-9" } ) + AAdd( aKeys, { "K_ALT_0", 385, "Alt-0" } ) + + AAdd( aKeys, { "K_F1", 28, "F1, Ctrl-Backslash" } ) + AAdd( aKeys, { "K_F2", -1, "F2" } ) + AAdd( aKeys, { "K_F3", -2, "F3" } ) + AAdd( aKeys, { "K_F4", -3, "F4" } ) + AAdd( aKeys, { "K_F5", -4, "F5" } ) + AAdd( aKeys, { "K_F6", -5, "F6" } ) + AAdd( aKeys, { "K_F7", -6, "F7" } ) + AAdd( aKeys, { "K_F8", -7, "F8" } ) + AAdd( aKeys, { "K_F9", -8, "F9" } ) + AAdd( aKeys, { "K_F10", -9, "F10" } ) + AAdd( aKeys, { "K_F11", -40, "F11" } ) + AAdd( aKeys, { "K_F12", -41, "F12" } ) + AAdd( aKeys, { "K_CTRL_F1", -20, "Ctrl-F1" } ) + AAdd( aKeys, { "K_CTRL_F2", -21, "Ctrl-F2" } ) + AAdd( aKeys, { "K_CTRL_F3", -22, "Ctrl-F4" } ) + AAdd( aKeys, { "K_CTRL_F4", -23, "Ctrl-F3" } ) + AAdd( aKeys, { "K_CTRL_F5", -24, "Ctrl-F5" } ) + AAdd( aKeys, { "K_CTRL_F6", -25, "Ctrl-F6" } ) + AAdd( aKeys, { "K_CTRL_F7", -26, "Ctrl-F7" } ) + AAdd( aKeys, { "K_CTRL_F8", -27, "Ctrl-F8" } ) + AAdd( aKeys, { "K_CTRL_F9", -28, "Ctrl-F9" } ) + AAdd( aKeys, { "K_CTRL_F10", -29, "Ctrl-F10" } ) + AAdd( aKeys, { "K_CTRL_F11", -44, "Ctrl-F11" } ) + AAdd( aKeys, { "K_CTRL_F12", -45, "Ctrl-F12" } ) + AAdd( aKeys, { "K_ALT_F1", -30, "Alt-F1" } ) + AAdd( aKeys, { "K_ALT_F2", -31, "Alt-F2" } ) + AAdd( aKeys, { "K_ALT_F3", -32, "Alt-F3" } ) + AAdd( aKeys, { "K_ALT_F4", -33, "Alt-F4" } ) + AAdd( aKeys, { "K_ALT_F5", -34, "Alt-F5" } ) + AAdd( aKeys, { "K_ALT_F6", -35, "Alt-F6" } ) + AAdd( aKeys, { "K_ALT_F7", -36, "Alt-F7" } ) + AAdd( aKeys, { "K_ALT_F8", -37, "Alt-F8" } ) + AAdd( aKeys, { "K_ALT_F9", -38, "Alt-F9" } ) + AAdd( aKeys, { "K_ALT_F10", -39, "Alt-F10" } ) + AAdd( aKeys, { "K_ALT_F11", -46, "Alt-F11" } ) + AAdd( aKeys, { "K_ALT_F12", -47, "Alt-F12" } ) + AAdd( aKeys, { "K_SH_F1", -10, "Shift-F1" } ) + AAdd( aKeys, { "K_SH_F2", -11, "Shift-F2" } ) + AAdd( aKeys, { "K_SH_F3", -12, "Shift-F3" } ) + AAdd( aKeys, { "K_SH_F4", -13, "Shift-F4" } ) + AAdd( aKeys, { "K_SH_F5", -14, "Shift-F5" } ) + AAdd( aKeys, { "K_SH_F6", -15, "Shift-F6" } ) + AAdd( aKeys, { "K_SH_F7", -16, "Shift-F7" } ) + AAdd( aKeys, { "K_SH_F8", -17, "Shift-F8" } ) + AAdd( aKeys, { "K_SH_F9", -18, "Shift-F9" } ) + AAdd( aKeys, { "K_SH_F10", -19, "Shift-F10" } ) + AAdd( aKeys, { "K_SH_F11", -42, "Shift-F11" } ) + AAdd( aKeys, { "K_SH_F12", -43, "Shift-F12" } ) + + AAdd( aKeys, { "K_MOUSEMOVE", 1001, "mouse move" } ) + AAdd( aKeys, { "K_LBUTTONDOWN", 1002, "mouse left button down" } ) + AAdd( aKeys, { "K_LBUTTONUP", 1003, "mouse left button up" } ) + AAdd( aKeys, { "K_RBUTTONDOWN", 1004, "mouse right button down" } ) + AAdd( aKeys, { "K_RBUTTONUP", 1005, "mouse right button up" } ) + AAdd( aKeys, { "K_LDBLCLK", 1006, "mouse left button double click" } ) + AAdd( aKeys, { "K_RDBLCLK", 1007, "mouse right button double click" } ) + AAdd( aKeys, { "K_MBUTTONDOWN", 1008, "mouse middle button down" } ) + AAdd( aKeys, { "K_MBUTTONUP", 1009, "mouse middle button up" } ) + AAdd( aKeys, { "K_MDBLCLK", 1010, "mouse middle button double click" } ) + AAdd( aKeys, { "K_MMLEFTDOWN", 1011, "Mouse Move Left Down" } ) + AAdd( aKeys, { "K_MMRIGHTDOWN", 1012, "Mouse Move Right Down" } ) + AAdd( aKeys, { "K_MMMIDDLEDOWN", 1013, "Mouse Move Middle Down" } ) + AAdd( aKeys, { "K_MWFORWARD", 1014, "Mouse Wheel Forward" } ) + AAdd( aKeys, { "K_MWBACKWARD", 1015, "Mouse Wheel Backward" } ) + AAdd( aKeys, { "K_NCMOUSEMOVE", 1016, "Non-Client Area Mouse Movement" } ) + + AAdd( aKeys, { "HB_K_RESIZE", 1101, "screen dimension changed" } ) + AAdd( aKeys, { "HB_K_CLOSE", 1102, "close button hit" } ) + AAdd( aKeys, { "HB_K_GOTFOCUS", 1103, "focus restored" } ) + AAdd( aKeys, { "HB_K_LOSTFOCUS", 1104, "focus lost" } ) + AAdd( aKeys, { "HB_K_CONNECT", 1105, "remote terminal connected" } ) + AAdd( aKeys, { "HB_K_DISCONNECT", 1106, "remote terminal disconnected" } ) #ifdef __HARBOUR__ Set( _SET_EVENTMASK, HB_INKEY_ALL ) + hb_gtInfo( HB_GTI_CURSORBLINKRATE, 1000 ) + hb_gtInfo( HB_GTI_ESCDELAY, 50 ) + // hb_gtinfo( HB_GTI_FONTATTRIBUTE, 0 ) + // hb_gtinfo( HB_GTI_FONTATTRIBUTE, hb_bitOr( HB_GTI_FONTA_DRAWBOX, hb_gtinfo( HB_GTI_FONTATTRIBUTE ) ) ) + // hb_gtinfo( HB_GTI_FONTATTRIBUTE, hb_bitOr( HB_GTI_FONTA_CTRLCHARS, hb_gtinfo( HB_GTI_FONTATTRIBUTE ) ) ) + // hb_gtinfo( HB_GTI_FONTATTRIBUTE, hb_bitOr( HB_GTI_FONTA_FIXMETRIC, hb_gtinfo( HB_GTI_FONTATTRIBUTE ) ) ) + // hb_gtinfo( HB_GTI_FONTATTRIBUTE, hb_bitOr( HB_GTI_FONTA_CLRBKG, hb_gtinfo( HB_GTI_FONTATTRIBUTE ) ) ) // hb_gtInfo( HB_GTI_RESIZABLE, .F. ) // hb_gtInfo( HB_GTI_RESIZEMODE, HB_GTI_RESIZEMODE_ROWS ) // hb_gtInfo( HB_GTI_RESIZEMODE, HB_GTI_RESIZEMODE_FONT ) - hb_gtInfo( HB_GTI_ISFULLSCREEN, .T. ) - hb_gtInfo( HB_GTI_ALTENTER, .T. ) + // hb_gtInfo( HB_GTI_MAXIMIZED, .T. ) + // hb_gtInfo( HB_GTI_ISFULLSCREEN, .T. ) + // hb_gtInfo( HB_GTI_ALTENTER, .T. ) hb_gtInfo( HB_GTI_CLOSABLE, .F. ) - hb_gtInfo( HB_GTI_ESCDELAY, 50 ) + hb_gtInfo( HB_GTI_SELECTCOPY, .T. ) IF Empty( cTermCP ) cTermCP := "PLISO" ELSE @@ -267,7 +294,7 @@ PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) IF ( i := AScan( aKeys, {| x | x[ 2 ] == k } ) ) != 0 ? " key:" + Str( aKeys[ i, 2 ], 7 ) + " " + PadR( aKeys[ i, 1 ], 18 ) + aKeys[ i, 3 ] ELSEIF k >= 32 .AND. k <= 126 .OR. ( k >= 160 .AND. k <= 255 ) .OR. ; - ( k >= 0 .AND. k <= 255 .AND. IsAlpha( hb_keyChar( k ) ) ) + Len( hb_keyChar( k ) ) > 0 ? "char:" + Str( k, 7 ) + " " + hb_keyChar( k ) ELSE ? " key:" + Str( k, 7 ) @@ -276,6 +303,13 @@ PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) IF k == hb_keyCode( "@" ) .AND. NextKey() == 0 EXIT + ELSEIF k == K_INS + Set( _SET_CURSOR, ( Set( _SET_CURSOR ) + 1 ) % 5 ) + ?? " cursor:" + hb_ntos( Set( _SET_CURSOR ) ) + ELSEIF k == HB_K_RESIZE + ?? " (" + hb_ntos( MaxRow() + 1 ) + "," + hb_ntos( MaxCol() + 1 ) + ")" + ELSEIF k >= 1000 .AND. k < 1100 + ?? " mpos(" + hb_ntos( MRow() ) + "," + hb_ntos( MCol() ) + ")" #ifdef __HARBOUR__ ELSEIF k == K_CTRL_INS IF Alert( "Would you like to show clipboard text?", { "YES", "NO" } ) == 1