diff --git a/harbour/ChangeLog b/harbour/ChangeLog index f72348febf..aca1bb624f 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,20 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ +2004-06-07 14:15 UTC+0300 Phil Krylov + * source/rtl/inkey.c + + Added hb_setInkeyLast() (copyright 2002 by Walter Negro) and + SETLASTKEY() (copyright 2003 by Przemyslaw Czerpak). Both functions + are borrowed from xHarbour. + * source/debug/debugger.prg + ! Fixed Left and Right keys behaviour in the code window (fix by Lorenzo + Fiorini, borrowed from xHarbour). + ! Also from xHarbour, but written by myself: + ! Restore LastKey() value on program execution. + ! Fixed Step() behaviour. + ! Removed the last dependencies of the debugger on SET_EXACT setting. + ! Fixed some issues with the Monitor window. + 2004-06-07 13:45 UTC+0300 Phil Krylov * source/debug/dbgwa.prg * source/debug/dbgtarr.prg diff --git a/harbour/source/debug/debugger.prg b/harbour/source/debug/debugger.prg index 23f5daf23c..cf9a084bf2 100644 --- a/harbour/source/debug/debugger.prg +++ b/harbour/source/debug/debugger.prg @@ -76,8 +76,7 @@ #define ALTD_ENABLE 1 -/* Information structure hold by DATA aCallStack -*/ +/* Information structure stored in DATA aCallStack */ #define CSTACK_FUNCTION 1 //function name #define CSTACK_LOCALS 2 //an array with local variables #define CSTACK_LINE 3 //start line @@ -85,28 +84,26 @@ #define CSTACK_STATICS 5 //an array with static variables #define CSTACK_LEVEL 6 //eval stack level of the function -/* Information structure hold by aCallStack[n][ CSTACK_LOCALS ] -{ cLocalName, nLocalIndex, "Local", ProcName( 1 ) } -*/ +/* Information structure stored in aCallStack[n][ CSTACK_LOCALS ] + { cLocalName, nLocalIndex, "Local", ProcName( 1 ), nLevel } */ #define VAR_NAME 1 #define VAR_POS 2 #define VAR_TYPE 3 #define VAR_FUNCNAME 4 #define VAR_LEVEL 5 //eval stack level of the function -/* Information structure hold by ::aWatch (watchpoints) -*/ +/* Information structure stored in ::aWatch (watchpoints) */ #define WP_TYPE 1 //wp = watchpoint, tr = tracepoint #define WP_EXPR 2 //source of an expression #define WP_BLOCK 3 //codeblock to retrieve a value -/* Information structure hold by ::aTrace (tracepoints) -*/ +/* Information structure stored in ::aTrace (tracepoints) */ #define TR_IDX 1 //index into ::aWatch item storing expression #define TR_VALUE 2 //the current value of the expression static s_oDebugger static s_lExit := .F. + memvar __DbgStatics @@ -404,7 +401,7 @@ CLASS TDebugger METHOD Stack() METHOD Static() - METHOD Step() INLINE ::RestoreAppStatus(), ::Exit() + METHOD Step() METHOD TabWidth() INLINE ; ::nTabWidth := ::InputBox( "Tab width", ::nTabWidth ) @@ -412,7 +409,7 @@ CLASS TDebugger METHOD ToggleBreakPoint() METHOD Trace() INLINE ::lTrace := .t., ::nTraceLevel := Len( ::aCallStack ),; - __Keyboard( Chr( 255 ) ) //forces a Step() + ::Step() //forces a Step() METHOD ToCursor() METHOD NextRoutine() @@ -1032,8 +1029,8 @@ METHOD EditVar( nVar ) CLASS TDebugger if LastKey() != K_ESC do case case cVarStr == "{ ... }" - // aArray := ::VarGetValue( ::aVars[ nVar ] ) - if Len( aArray ) > 0 + //aArray := ::VarGetValue( ::aVars[ nVar ] ) + if Len( uVarValue ) > 0 __DbgArrays( uVarValue, cVarName ) else Alert( "Array is empty" ) @@ -1068,6 +1065,10 @@ METHOD HandleEvent() CLASS TDebugger local nPopup, oWnd local nKey, nMRow, nMCol, n + local nLastKey + + /* Save LastKey() */ + nLastKey := LastKey() if ::lAnimate if ::nSpeed != 0 @@ -1076,7 +1077,9 @@ METHOD HandleEvent() CLASS TDebugger if HB_DBG_INVOKEDEBUG() //NextKey() == K_ALT_D ::lAnimate := .f. else - KEYBOARD Chr( 255 ) // Forces a Step(). Only 0-255 range is supported + ::Step() + RETURN nil + //KEYBOARD Chr( 255 ) // Forces a Step(). Only 0-255 range is supported endif endif @@ -1148,17 +1151,18 @@ METHOD HandleEvent() CLASS TDebugger endif case nKey == K_RBUTTONDOWN -/* - case nKey == K_ESC + + /*case nKey == K_ESC ::RestoreAppStatus() s_oDebugger := nil s_lExit := .T. DispEnd() - ::Exit() -*/ + ::Exit()*/ + case nKey == K_UP .or. nKey == K_DOWN .or. nKey == K_HOME .or. ; nKey == K_END .or. nKey == K_ENTER .or. nKey == K_PGDN .or. ; - nKey == K_PGUP .OR. nKey == K_DEL + nKey == K_PGUP .or. nKey == K_DEL .or. nKey == K_LEFT .or. ; + nKey == K_RIGHT oWnd := ::aWindows[ ::nCurrentWindow ] oWnd:KeyPressed( nKey ) @@ -1186,11 +1190,6 @@ METHOD HandleEvent() CLASS TDebugger ::ToCursor() case nKey == K_F8 .or. nKey == 255 - // we are starting to run again so reset to the deepest call if - // displaying stack - if ! ::oBrwStack == nil - ::oBrwStack:GoTop() - endif ::Step() case nKey == K_F9 @@ -1218,6 +1217,8 @@ METHOD HandleEvent() CLASS TDebugger endcase end + /* Restore LastKey() */ + SetLastKey( nLastKey ) return nil METHOD Hide() CLASS TDebugger @@ -1644,6 +1645,9 @@ METHOD ShowVars() CLASS TDebugger if ::oWndVars:nBottom - ::oWndVars:nTop > 1 ::oWndVars:Resize( ,, ::oWndVars:nTop + 1 ) lRepaint := .t. + else + /* We still need to redraw window caption, it could have changed */ + ::oWndVars:Refresh() endif elseif Len( ::aVars ) > ::oWndVars:nBottom - ::oWndVars:nTop - 1 ::oWndVars:Resize( ,, ::oWndVars:nTop + Min( Len( ::aVars ) + 1, 7 ) ) @@ -1652,7 +1656,8 @@ METHOD ShowVars() CLASS TDebugger ::oWndVars:Resize( ,, ::oWndVars:nTop + Len( ::aVars ) + 1 ) lRepaint := .t. else - ::oBrwVars:refreshAll():ForceStable() + ::oBrwVars:RefreshAll():ForceStable() + ::oWndVars:Refresh() endif if ! ::oWndVars:lVisible .OR. lRepaint ::ResizeWindows( ::oWndVars ) @@ -2925,6 +2930,18 @@ LOCAL oWindow2, nTop, i RETURN self +METHOD Step() CLASS TDebugger + // we are starting to run again so reset to the deepest call if + // displaying stack + if ! ::oBrwStack == nil + ::oBrwStack:GoTop() + endif + ::RestoreAppStatus() + ::Exit() +RETURN nil + + + STATIC FUNCTION CreateExpression( cExpr, aWatch ) LOCAL nLen LOCAL i,j @@ -2948,12 +2965,12 @@ LOCAL cRet DO WHILE( SUBSTR(cExpr,i,1)==" ") i++ ENDDO - IF( SUBSTR(cExpr,i,1) = '(' ) + IF( SUBSTR(cExpr,i,1) == '(' ) //function call j := i+1 LOOP ENDIF - IF( SUBSTR(cExpr,i,2) = "->" ) + IF( SUBSTR(cExpr,i,2) == "->" ) //alias expressions are not expanded i += 2 DO WHILE( i<=nLen .AND. IsIdentChar(SUBSTR(cExpr,i,1)," ()") ) @@ -3037,34 +3054,33 @@ RETURN cRet STATIC FUNCTION IsIdentChar( cChar, cSeeAlso ) - IF( ISALPHA(cChar) .OR. ISDIGIT(cChar) .OR. cChar = '_' ) + IF( ISALPHA(cChar) .OR. ISDIGIT(cChar) .OR. cChar == '_' ) RETURN .T. ENDIF RETURN IIF(cSeeAlso!=NIL, cChar $ cSeeAlso, .F. ) STATIC PROCEDURE StripUntil( pcLine, i, cChar ) -LOCAL j, n -LOCAL nLen:=LEN(pcLine) + LOCAL j, n + LOCAL nLen:=LEN(pcLine) n := LEN(cChar) j := i+n - DO WHILE( j<=nLen .AND. SUBSTR(pcLine, j, n) != cChar ) + DO WHILE j<=nLen .AND. SUBSTR(pcLine, j, n) != cChar j++ ENDDO - IF( j <= nLen ) + IF j <= nLen pcLine := LEFT( pcLine, i-1 ) + SUBSTR(pcLine, j+n) ENDIF RETURN STATIC FUNCTION IsValidStopLine( cLine ) -LOCAL i, c, c2 -LOCAL lSet:=SET(_SET_EXACT,.F.) + LOCAL i, c, c2 cLine := UPPER( ALLTRIM( cLine ) ) i := 1 - DO WHILE( i <= LEN(cLine) ) + DO WHILE i <= LEN(cLine) c := SUBSTR( cLine, i, 1 ) c2 := SUBSTR( cLine, i, 2 ) DO CASE @@ -3089,25 +3105,26 @@ LOCAL lSet:=SET(_SET_EXACT,.F.) ENDDO cLine := ALLTRIM( cLine ) - IF( EMPTY(cLine) ) - SET(_SET_EXACT, lSet) + IF EMPTY(cLine) RETURN .F. ENDIF - IF( cLine = 'FUNC' .OR.; - cLine = 'PROC' .OR.; - cLine = 'NEXT' .OR.; - cLine = 'END' .OR.; - cLine = 'ELSE' .OR.; - cLine = 'LOCA' .OR.; - cLine = 'STAT' .OR.; - cLine = 'MEMV' ) - SET(_SET_EXACT, lSet) + c := Left( cLine, 4 ) + IF ( Left( c, 3 ) == 'END' .OR.; + c == 'FUNC' .OR.; + c == 'PROC' .OR.; + c == 'NEXT' .OR.; + c == 'ELSE' .OR.; + c == 'LOCA' .OR.; + c == 'STAT' .OR.; + c == 'MEMV' ) + RETURN .F. ENDIF RETURN .T. + function __DbgColors() return iif( ! s_oDebugger:lMonoDisplay, s_oDebugger:aColors,; diff --git a/harbour/source/rtl/inkey.c b/harbour/source/rtl/inkey.c index 3325fb3542..8e49d22c61 100644 --- a/harbour/source/rtl/inkey.c +++ b/harbour/source/rtl/inkey.c @@ -57,6 +57,12 @@ * Copyright 1999-2001 Viktor Szakats * HB_KEYPUT() * + * Copyright 2002 Walter Negro + * hb_setInkeyLast() + * + * Copyright 2003 Przemyslaw Czerpak + * SETLASTKEY() + * * See doc/license.txt for licensing terms. * */ @@ -181,6 +187,17 @@ int hb_inkeyLast( HB_inkey_enum event_mask ) /* Return the value of the las return hb_inkeyTranslate( s_inkeyLast, event_mask ); } +int hb_setInkeyLast( int ch ) /* Force a value to s_inkeyLast and return previous value */ +{ + int last = s_inkeyLast; + + HB_TRACE(HB_TR_DEBUG, ("hb_setInkeyLast()")); + + s_inkeyLast = ch; + + return last; +} + int hb_inkeyNext( HB_inkey_enum event_mask ) /* Return the next key without extracting it */ { int key = s_inkeyForce; /* Assume that typeahead support is disabled */ @@ -368,6 +385,15 @@ HB_FUNC( LASTKEY ) hb_retni( hb_inkeyTranslate( s_inkeyLast, ( HB_inkey_enum ) hb_inkeyNext( ISNUM( 1 ) ? ( HB_inkey_enum ) hb_parni( 1 ) : hb_set.HB_SET_EVENTMASK ) ) ); } +HB_FUNC( SETLASTKEY ) +{ + if( ISNUM(1) ) + { + hb_setInkeyLast( hb_parni(1) ); + } + hb_retc( "" ); +} + int hb_inkeyTranslate( int key, HB_inkey_enum event_mask ) { if( key && hb_gtExtendedKeySupport() && ! ( event_mask & HB_INKEY_EXTENDED ) )