diff --git a/ChangeLog.txt b/ChangeLog.txt index 4d25debb81..ad7cc0ae84 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,21 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2013-06-05 10:37 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/rtl/gtwvt/gtwvt.c + ! added workaround for AltGR and German keyboard + + * src/rtl/inkeyapi.c + ! added missing 'static' in function declaration + + * src/rtl/hbgtcore.c + ! added workarounds for HB_GTI_COMPAT_BUFFER switched to .F. by + default. + + * tests/gtkeys.prg + * switched to UTF8 CP by default + + extended keycode information in Harbour + 2013-06-04 20:25 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/pp/hbpp.c ! fixed memory leak due to unnecessary hb_strdup() diff --git a/src/rtl/gtwvt/gtwvt.c b/src/rtl/gtwvt/gtwvt.c index 5e21661f29..34835cdf35 100644 --- a/src/rtl/gtwvt/gtwvt.c +++ b/src/rtl/gtwvt/gtwvt.c @@ -2589,6 +2589,9 @@ static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, break; case WM_CHAR: + if( ( iFlags & HB_KF_CTRL ) != 0 && ( iFlags & HB_KF_ALT ) != 0 ) + /* workaround for AltGR and German keyboard */ + iFlags &= ~( HB_KF_CTRL | HB_KF_ALT ); case WM_SYSCHAR: if( ! pWVT->IgnoreWM_SYSCHAR ) { diff --git a/src/rtl/hbgtcore.c b/src/rtl/hbgtcore.c index 84e2f71551..872f8b4ef1 100644 --- a/src/rtl/hbgtcore.c +++ b/src/rtl/hbgtcore.c @@ -1354,7 +1354,7 @@ static void hb_gt_def_DrawShadow( PHB_GT pGT, int iTop, int iLeft, int iBottom, static void hb_gt_def_Scroll( PHB_GT pGT, int iTop, int iLeft, int iBottom, int iRight, int iColor, HB_USHORT usChar, int iRows, int iCols ) { - int iColOld, iColNew, iColSize, iColClear, iClrs, iLength; + int iColOld, iColNew, iColSize, iColClear, iClrs, iLength, iFlag = 0; iColSize = iRight - iLeft; iLength = iColSize + 1; @@ -1383,7 +1383,10 @@ static void hb_gt_def_Scroll( PHB_GT pGT, int iTop, int iLeft, int iBottom, int HB_SIZE nSize = HB_GTSELF_RECTSIZE( pGT, iTop, iColOld, iTop, iColOld + iColSize ); if( nSize ) + { pBuffer = hb_xgrab( nSize ); + iFlag = HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, 0 ); + } } while( iTop <= iBottom ) @@ -1409,6 +1412,8 @@ static void hb_gt_def_Scroll( PHB_GT pGT, int iTop, int iLeft, int iBottom, int if( pBuffer ) hb_xfree( pBuffer ); + if( iFlag != 0 ) + HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, iFlag ); } } @@ -1873,7 +1878,9 @@ static HB_BOOL hb_gt_def_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) if( nSize ) { void * pBuffer = hb_xgrab( nSize + 1 ); + int iFlag = HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, 0 ); HB_GTSELF_SAVE( pGT, 0, 0, iRow, iCol, pBuffer ); + HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, iFlag ); hb_arraySetCLPtr( pInfo->pResult, 7, ( char * ) pBuffer, nSize ); } break; @@ -1885,9 +1892,11 @@ static HB_BOOL hb_gt_def_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) HB_GTSELF_DISPBEGIN( pGT ); if( hb_arrayGetCLen( pInfo->pNewVal, 7 ) > 0 ) { + int iFlag = HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, 0 ); HB_GTSELF_REST( pGT, 0, 0, hb_arrayGetNI( pInfo->pNewVal, 5 ), hb_arrayGetNI( pInfo->pNewVal, 6 ), hb_arrayGetCPtr( pInfo->pNewVal, 7 ) ); + HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, iFlag ); } HB_GTSELF_SETPOS( pGT, hb_arrayGetNI( pInfo->pNewVal, 1 ), hb_arrayGetNI( pInfo->pNewVal, 2 ) ); @@ -2014,6 +2023,7 @@ static int hb_gt_def_Alert( PHB_GT pGT, PHB_ITEM pMessage, PHB_ITEM pOptions, HB_UINT ulLines = 0, ulWidth = 0, ulCurrWidth = 0, ulMsg = 0, ulDst = 0, ulLast = 0, ulSpace1 = 0, ulSpace2 = 0, ulDefWidth, ulMaxWidth; HB_WCHAR * szMsgDsp; + int iFlag = 0; ulMaxWidth = iCols - 4; ulDefWidth = ( ulMaxWidth * 3 ) >> 2; @@ -2131,6 +2141,7 @@ static int hb_gt_def_Alert( PHB_GT pGT, PHB_ITEM pMessage, PHB_ITEM pOptions, if( nLen ) { pBuffer = hb_xgrab( nLen ); + iFlag = HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, 0 ); HB_GTSELF_SAVE( pGT, iTop, iLeft, iBottom, iRight, pBuffer ); } HB_GTSELF_BOXS( pGT, iTop, iLeft, iBottom, iRight, NULL, iClrNorm ); @@ -2246,6 +2257,8 @@ static int hb_gt_def_Alert( PHB_GT pGT, PHB_ITEM pMessage, PHB_ITEM pOptions, if( pBuffer ) { HB_GTSELF_REST( pGT, iTop, iLeft, iBottom, iRight, pBuffer ); + if( iFlag != 0 ) + HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, iFlag ); hb_xfree( pBuffer ); } HB_GTSELF_SETPOS( pGT, iRow, iCol ); @@ -2359,12 +2372,13 @@ static HB_BOOL hb_gt_def_Resize( PHB_GT pGT, int iRows, int iCols ) void * pBuffer = NULL; HB_SIZE nLen = ( HB_SIZE ) iRows * iCols, nIndex; HB_SIZE nSize; - int i; + int iFlag = 0, i; nSize = HB_GTSELF_RECTSIZE( pGT, 0, 0, iRows - 1, iCols - 1 ); if( nSize ) { pBuffer = hb_xgrab( nSize ); + iFlag = HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, 0 ); HB_GTSELF_SAVE( pGT, 0, 0, iRows - 1, iCols - 1, pBuffer ); } @@ -2403,6 +2417,8 @@ static HB_BOOL hb_gt_def_Resize( PHB_GT pGT, int iRows, int iCols ) if( nSize ) { HB_GTSELF_REST( pGT, 0, 0, iRows - 1, iCols - 1, pBuffer ); + if( iFlag != 0 ) + HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, iFlag ); hb_xfree( pBuffer ); } } diff --git a/src/rtl/inkeyapi.c b/src/rtl/inkeyapi.c index 9496267cc5..bba49f9ab3 100644 --- a/src/rtl/inkeyapi.c +++ b/src/rtl/inkeyapi.c @@ -377,7 +377,7 @@ 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 ) +static 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 ) diff --git a/tests/gtkeys.prg b/tests/gtkeys.prg index 30b562f171..ca43faac82 100644 --- a/tests/gtkeys.prg +++ b/tests/gtkeys.prg @@ -15,10 +15,12 @@ REQUEST HB_CODEPAGE_PLMAZ REQUEST HB_CODEPAGE_PLISO REQUEST HB_CODEPAGE_PL852 REQUEST HB_CODEPAGE_PLWIN +REQUEST HB_CODEPAGE_UTF8EX #else -#define hb_keyCode( n ) Asc( n ) -#define hb_keyChar( c ) Chr( c ) -#define hb_ntos( n ) LTrim( Str( n ) ) +#xtranslate hb_keyStd( n ) ( n ) +#xtranslate hb_keyCode( n ) Asc( n ) +#xtranslate hb_keyChar( c ) iif( c >= 32 .AND. c <= 255, Chr( c ), "" ) +#xtranslate hb_ntos( n ) LTrim( Str( n ) ) #endif #ifndef HB_K_RESIZE #define HB_K_RESIZE 1101 @@ -26,7 +28,7 @@ REQUEST HB_CODEPAGE_PLWIN PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) - LOCAL k, i, s + LOCAL k, kX, i, s LOCAL aKeys := { ; { "K_UP", 5, "Up arrow, Ctrl-E" }, ; { "K_DOWN", 24, "Down arrow, Ctrl-X" }, ; @@ -242,7 +244,7 @@ PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) #ifdef __HARBOUR__ - Set( _SET_EVENTMASK, HB_INKEY_ALL ) + Set( _SET_EVENTMASK, HB_INKEY_ALL + HB_INKEY_EXT ) hb_gtInfo( HB_GTI_CURSORBLINKRATE, 1000 ) hb_gtInfo( HB_GTI_ESCDELAY, 50 ) // hb_gtinfo( HB_GTI_FONTATTRIBUTE, 0 ) @@ -259,12 +261,12 @@ PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) hb_gtInfo( HB_GTI_CLOSABLE, .F. ) hb_gtInfo( HB_GTI_SELECTCOPY, .T. ) IF Empty( cTermCP ) - cTermCP := "PLISO" + cTermCP := "UTF8" ELSE cTermCP := Upper( cTermCP ) ENDIF IF Empty( cHostCP ) - cHostCP := "PLMAZ" + cHostCP := "UTF8" ELSE cHostCP := Upper( cHostCP ) ENDIF @@ -290,14 +292,25 @@ PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) ? WHILE .T. - k := Inkey( 0 ) + kX := Inkey( 0 ) + k := hb_keyStd( kX ) 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. ; Len( hb_keyChar( k ) ) > 0 +#ifdef __HARBOUR__ + ? "char:" + iif( k > 256, " U+" + hb_numToHex( hb_keyVal( k ), 4 ), Str( k, 7 ) ) + ; + " " + hb_keyChar( k ) +#else ? "char:" + Str( k, 7 ) + " " + hb_keyChar( k ) +#endif ELSE +#ifdef __HARBOUR__ + ? " key:" + Str( k, 7 ) + " ext: 0x" + hb_numToHex( kX, 8 ) + " -> " + ; + hb_numToHex( hb_keyMod( kX ), 2 ) + ":" + hb_numToHex( hb_keyVal( kX ), 8 ) +#else ? " key:" + Str( k, 7 ) +#endif ENDIF // ?? " (" + hb_ntos( MaxRow() ) + ":" + hb_ntos( MaxCol() ) + ")"