From e5584850e7fe5fcd09949e29affccbbbffdc3a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Mon, 9 Sep 2013 20:54:11 +0200 Subject: [PATCH] 2013-09-09 20:54 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/rtl/cdpapi.c * use CP437 control codes in translations from unicode to ASCII * src/rtl/gtwvt/gtwvt.c * added support for key code typed using ALT + * tests/gtkeys.prg * added parenthesis to clarify expression order --- ChangeLog.txt | 10 ++++++++ src/rtl/cdpapi.c | 12 ++++++++++ src/rtl/gtwvt/gtwvt.c | 56 +++++++++++++++++++------------------------ tests/gtkeys.prg | 2 +- 4 files changed, 48 insertions(+), 32 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 6c67101f58..9390c8f26a 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,16 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2013-09-09 20:54 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/rtl/cdpapi.c + * use CP437 control codes in translations from unicode to ASCII + + * src/rtl/gtwvt/gtwvt.c + * added support for key code typed using ALT + + + * tests/gtkeys.prg + * added parenthesis to clarify expression order + 2013-09-09 15:54 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/vm/dlmalloc.c * use __builtin_clz() and __builtin_ctz() only with GCC 3.4 or newer. diff --git a/src/rtl/cdpapi.c b/src/rtl/cdpapi.c index ef5c048290..9313172ab4 100644 --- a/src/rtl/cdpapi.c +++ b/src/rtl/cdpapi.c @@ -1690,6 +1690,18 @@ HB_UCHAR hb_cdpGetUC( PHB_CODEPAGE cdp, HB_WCHAR wc, HB_UCHAR ucDef ) if( uc ) ucDef = uc; } + if( ucDef == 0 ) + { + int i; + for( i = 0; i < 32; ++i ) + { + if( s_uniCtrls[ i ] == wc ) + { + ucDef = ( HB_UCHAR ) i; + break; + } + } + } } } else if( wc <= 0xFF ) diff --git a/src/rtl/gtwvt/gtwvt.c b/src/rtl/gtwvt/gtwvt.c index fd80be7f21..31a318eb7c 100644 --- a/src/rtl/gtwvt/gtwvt.c +++ b/src/rtl/gtwvt/gtwvt.c @@ -2383,7 +2383,7 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, LPARAM lParam ) { - int iKey = 0, iFlags = pWVT->keyFlags; + int iKey = 0, iFlags = pWVT->keyFlags, iKeyPad = 0; switch( message ) { @@ -2418,49 +2418,31 @@ static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, break; case VK_UP: - iKey = HB_KX_UP; - if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) - iFlags |= HB_KF_KEYPAD; + iKeyPad = HB_KX_UP; break; case VK_DOWN: - iKey = HB_KX_DOWN; - if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) - iFlags |= HB_KF_KEYPAD; + iKeyPad = HB_KX_DOWN; break; case VK_LEFT: - iKey = HB_KX_LEFT; - if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) - iFlags |= HB_KF_KEYPAD; + iKeyPad = HB_KX_LEFT; break; case VK_RIGHT: - iKey = HB_KX_RIGHT; - if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) - iFlags |= HB_KF_KEYPAD; + iKeyPad = HB_KX_RIGHT; break; case VK_HOME: - iKey = HB_KX_HOME; - if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) - iFlags |= HB_KF_KEYPAD; + iKeyPad = HB_KX_HOME; break; case VK_END: - iKey = HB_KX_END; - if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) - iFlags |= HB_KF_KEYPAD; + iKeyPad = HB_KX_END; break; case VK_PRIOR: - iKey = HB_KX_PGUP; - if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) - iFlags |= HB_KF_KEYPAD; + iKeyPad = HB_KX_PGUP; break; case VK_NEXT: - iKey = HB_KX_PGDN; - if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) - iFlags |= HB_KF_KEYPAD; + iKeyPad = HB_KX_PGDN; break; case VK_INSERT: - iKey = HB_KX_INS; - if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) - iFlags |= HB_KF_KEYPAD; + iKeyPad = HB_KX_INS; break; case VK_DELETE: iKey = HB_KX_DEL; @@ -2518,8 +2500,7 @@ static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, break; case VK_CLEAR: - iKey = HB_KX_CENTER; - iFlags |= HB_KF_KEYPAD; + iKeyPad = HB_KX_CENTER; break; case VK_NUMPAD0: @@ -2532,12 +2513,14 @@ static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, 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'; } + else if( iFlags == HB_KF_ALT ) + iFlags = 0; /* for ALT + */ + iFlags |= HB_KF_KEYPAD; break; case VK_DECIMAL: case VK_SEPARATOR: @@ -2576,6 +2559,17 @@ static HB_BOOL hb_gt_wvt_KeyEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, break; #endif } + if( iKeyPad != 0 ) + { + iKey = iKeyPad; + if( ( lParam & WVT_EXTKEY_FLAG ) == 0 ) + { + if( iFlags == HB_KF_ALT ) + iFlags = iKey = 0; /* for ALT + */ + else + iFlags |= HB_KF_KEYPAD; + } + } pWVT->keyFlags = iFlags; if( iKey != 0 ) iKey = HB_INKEY_NEW_KEY( iKey, iFlags ); diff --git a/tests/gtkeys.prg b/tests/gtkeys.prg index ca43faac82..ffd1cbd9e2 100644 --- a/tests/gtkeys.prg +++ b/tests/gtkeys.prg @@ -296,7 +296,7 @@ PROCEDURE Main( cTermCP, cHostCP, lBoxChar ) 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. ; + 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 ) ) + ;