From bf66b2429a7690eb22549f7351bb51eb0c5b9a70 Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Sun, 1 May 2011 01:03:01 +0000 Subject: [PATCH] 2011-04-30 17:57 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbxbp/xbpparthandler.prg * contrib/hbxbp/xbpprinter.prg * contrib/hbxbp/xbpwindow.prg ! Code optimizations. * contrib/hbxbp/xbpgeneric.prg ! Changed: the way event loop was being constructed and processed. Now, no event is missed and is dealt with properly. Not best of the ways but my experiments could not lead to any better algorithm. --- harbour/ChangeLog | 12 +++ harbour/contrib/hbxbp/xbpgeneric.prg | 129 ++++++++++++++++++----- harbour/contrib/hbxbp/xbpparthandler.prg | 2 +- harbour/contrib/hbxbp/xbpprinter.prg | 1 - harbour/contrib/hbxbp/xbpwindow.prg | 75 ++++--------- 5 files changed, 137 insertions(+), 82 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 3835e2b078..ae91c837f2 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,18 @@ The license applies to all entries newer than 2009-04-28. */ +2011-04-30 17:57 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + * contrib/hbxbp/xbpparthandler.prg + * contrib/hbxbp/xbpprinter.prg + * contrib/hbxbp/xbpwindow.prg + ! Code optimizations. + + * contrib/hbxbp/xbpgeneric.prg + ! Changed: the way event loop was being constructed and processed. + Now, no event is missed and is dealt with properly. + Not best of the ways but my experiments could not lead to + any better algorithm. + 2011-04-30 16:21 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/gtwvg/gtwvg.c * contrib/gtwvg/gtwvg.h diff --git a/harbour/contrib/hbxbp/xbpgeneric.prg b/harbour/contrib/hbxbp/xbpgeneric.prg index 7f28606b38..65ddd5dfdd 100644 --- a/harbour/contrib/hbxbp/xbpgeneric.prg +++ b/harbour/contrib/hbxbp/xbpgeneric.prg @@ -73,14 +73,14 @@ /*----------------------------------------------------------------------*/ -#define EVENT_BUFFER 200 +#define EVENT_BUFFER 128 /*----------------------------------------------------------------------*/ STATIC s_oDeskTop STATIC s_hLastEvent := {=>} -THREAD STATIC t_events +THREAD STATIC t_events := {} THREAD STATIC t_nEventIn := 0 THREAD STATIC t_nEventOut := 0 @@ -118,12 +118,12 @@ EXIT PROCEDURE hbxbp_End() * Will be called from XbpDialog() | XbpCRT() */ FUNCTION hbxbp_InitializeEventBuffer() - +#if 0 IF empty( t_events ) t_events := array( EVENT_BUFFER ) aeval( t_events, {|e,i| HB_SYMBOL_UNUSED( e ), t_events[ i ] := { 0, NIL, NIL, NIL } } ) ENDIF - +#endif RETURN nil /*----------------------------------------------------------------------*/ @@ -189,6 +189,62 @@ FUNCTION LastAppEvent( mp1, mp2, oXbp, nThreadID ) RETURN nEvent /*----------------------------------------------------------------------*/ +#if 1 +/*----------------------------------------------------------------------*/ + +FUNCTION NextAppEvent( mp1, mp2, oXbp ) + LOCAL nEvent + + IF ! empty( t_events ) + nEvent := t_events[ 1, 1 ] + mp1 := t_events[ 1, 2 ] + mp2 := t_events[ 1, 3 ] + oXbp := t_events[ 1, 4 ] + ENDIF + + RETURN nEvent + +/*----------------------------------------------------------------------*/ + +PROCEDURE SetAppEvent( nEvent, mp1, mp2, oXbp ) + + aadd( t_events, { nEvent, mp1, mp2, iif( empty( oXbp ), t_oAppWindow, oXbp ) } ) + + /* HB_TRACE( HB_TR_ALWAYS, len( t_events ) ) */ + + RETURN + +/*----------------------------------------------------------------------*/ + +FUNCTION AppEvent( mp1, mp2, oXbp, nTimeout ) + LOCAL nEvent := 0 + + HB_SYMBOL_UNUSED( nTimeOut ) + + DO WHILE ! empty( t_oEventLoop ) + t_oEventLoop:processEvents( QEventLoop_AllEvents ) + + IF ! empty( t_events ) + nEvent := t_events[ 1, 1 ] + mp1 := t_events[ 1, 2 ] + mp2 := t_events[ 1, 3 ] + oXbp := t_events[ 1, 4 ] + + hb_adel( t_events, 1, .t. ) + + EXIT + ENDIF + + hb_releaseCPU() + ENDDO + + s_hLastEvent[ hb_threadID() ] := { nEvent, mp1, mp2, oXbp } + + RETURN nEvent + +/*----------------------------------------------------------------------*/ +#else +/*----------------------------------------------------------------------*/ FUNCTION NextAppEvent( mp1, mp2, oXbp ) LOCAL nEvent, n @@ -212,25 +268,43 @@ FUNCTION NextAppEvent( mp1, mp2, oXbp ) /* * Internal to the XbpParts, must NOT be called from application code */ -FUNCTION SetAppEvent( nEvent, mp1, mp2, oXbp ) +PROCEDURE SetAppEvent( nEvent, mp1, mp2, oXbp ) + LOCAL ooXbp := iif( empty( oXbp ), t_oAppWindow, oXbp ) + LOCAL nEventIn := t_nEventIn IF empty( t_events ) hbxbp_InitializeEventBuffer() ENDIF - IF ++t_nEventIn > EVENT_BUFFER - t_nEventIn := 1 + /* if current event is not taken and it is of same nature just update parameters */ + IF ! empty( t_nEventIn ) .AND. ! empty( t_events[ nEventIn, 4 ] ) ; + .AND. nEvent == t_events[ nEventIn, 1 ] .AND. ooXbp == t_events[ nEventIn, 4 ] + t_events[ nEventIn, 2 ] := mp1 + t_events[ nEventIn, 3 ] := mp2 + RETURN ENDIF -//HB_TRACE( HB_TR_DEBUG, "SetAppEvent ... ", t_nEventIn, nEvent, oXbp:className(), oXbp:title ) + IF ++nEventIn > len( t_events ) + nEventIn := 1 + ENDIF - t_events[ t_nEventIn, 1 ] := nEvent - t_events[ t_nEventIn, 2 ] := mp1 - t_events[ t_nEventIn, 3 ] := mp2 - t_events[ t_nEventIn, 4 ] := iif( empty( oXbp ), t_oAppWindow, oXbp ) + IF !empty( t_events[ nEventIn, 4 ] ) + hb_ains( t_events, nEventIn, { nEvent, mp1, mp2, ooXbp }, .t. ) -//HB_TRACE( HB_TR_DEBUG, 1, "SetAppEvent ... ", hb_threadId(), nEvent ) - RETURN nil + HB_TRACE( HB_TR_ALWAYS, "................t_nEventIn", 0, nEventIn ) + + ELSE + HB_TRACE( HB_TR_ALWAYS, "................t_nEventIn", 1, nEventIn ) + + t_events[ nEventIn, 1 ] := nEvent + t_events[ nEventIn, 2 ] := mp1 + t_events[ nEventIn, 3 ] := mp2 + t_events[ nEventIn, 4 ] := ooXbp + ENDIF + + t_nEventIn := nEventIn + + RETURN /*----------------------------------------------------------------------*/ @@ -238,36 +312,41 @@ FUNCTION AppEvent( mp1, mp2, oXbp, nTimeout ) LOCAL nEvent := 0 LOCAL nThreadID := hb_threadId() - //DEFAULT nTimeout TO 0 HB_SYMBOL_UNUSED( nTimeOut ) - IF ++t_nEventOut > EVENT_BUFFER + IF empty( t_nEventOut ) .OR. ++t_nEventOut > len( t_events ) t_nEventOut := 1 ENDIF -//HB_TRACE( HB_TR_DEBUG, " AppEvent ... ", nThreadID, t_nEventOut ) - DO WHILE !empty( t_oEventLoop ) //.t. + + HB_TRACE( HB_TR_ALWAYS, "t_nEventOut", t_nEventOut ) + + //DO WHILE ! empty( t_oEventLoop ) t_oEventLoop:processEvents( QEventLoop_AllEvents ) - IF !empty( t_events[ t_nEventOut, 4 ] ) - // + IF ! empty( t_events[ t_nEventOut, 4 ] ) nEvent := t_events[ t_nEventOut, 1 ] mp1 := t_events[ t_nEventOut, 2 ] mp2 := t_events[ t_nEventOut, 3 ] oXbp := t_events[ t_nEventOut, 4 ] - // + t_events[ t_nEventOut, 4 ] := NIL - EXIT + //EXIT + ELSE + mp1 := NIL + mp2 := NIL + oXbp := t_oAppWindow ENDIF + hb_releaseCPU() - ENDDO + //ENDDO s_hLastEvent[ nThreadID ] := { nEvent, mp1, mp2, oXbp } -//HB_TRACE( HB_TR_DEBUG, "..........................", hb_threadId() ) - RETURN nEvent /*----------------------------------------------------------------------*/ +#endif +/*----------------------------------------------------------------------*/ FUNCTION SetAppWindow( oXbp ) LOCAL oldAppWindow := t_oAppWindow diff --git a/harbour/contrib/hbxbp/xbpparthandler.prg b/harbour/contrib/hbxbp/xbpparthandler.prg index 4f5d6dfe73..68ea286ff8 100644 --- a/harbour/contrib/hbxbp/xbpparthandler.prg +++ b/harbour/contrib/hbxbp/xbpparthandler.prg @@ -320,7 +320,7 @@ METHOD XbpPartHandler:moveOwned( nOffSetX, nOffSetY ) LOCAL oXbp, oPos FOR EACH oXbp IN ::a_Owned - IF __objHasMsg( oXbp, "MOVEWITHOWNER" ) .AND. oXbp:moveWithOwner + IF __objHasData( oXbp, "MOVEWITHOWNER" ) .AND. oXbp:moveWithOwner IF !( oXbp:oParent:className() == "XBPDRAWINGAREA" ) oPos := oXbp:oWidget:pos() oXbp:oWidget:move( oPos:x() + nOffSetX, oPos:y() + nOffSetY ) diff --git a/harbour/contrib/hbxbp/xbpprinter.prg b/harbour/contrib/hbxbp/xbpprinter.prg index c05cb3c8e6..6e9769cec6 100644 --- a/harbour/contrib/hbxbp/xbpprinter.prg +++ b/harbour/contrib/hbxbp/xbpprinter.prg @@ -522,7 +522,6 @@ METHOD XbpPrinter:startDoc( cDocName ) /*----------------------------------------------------------------------*/ METHOD XbpPrinter:getEngineProperty( nProperty ) - //LOCAL oVariant := QVariantFromPointer( ::oEngine:property( nProperty ) ) LOCAL oVariant := ::oEngine:property( nProperty ) DO CASE diff --git a/harbour/contrib/hbxbp/xbpwindow.prg b/harbour/contrib/hbxbp/xbpwindow.prg index e71445ca6e..d95a279290 100644 --- a/harbour/contrib/hbxbp/xbpwindow.prg +++ b/harbour/contrib/hbxbp/xbpwindow.prg @@ -559,16 +559,12 @@ METHOD XbpWindow:clearSlots() METHOD XbpWindow:grabEvent( nEvent, oEvent ) LOCAL nXbpKey, oP0, oP1, oObj_O, oObj_N - LOCAL lRet := .t. - -//HB_TRACE( HB_TR_DEBUG, hb_threadId(), "XbpWindow:grabEvent", nEvent ) SWITCH ( nEvent ) CASE QEvent_MouseMove // :motion() SetAppEvent( xbeM_Motion, { oEvent:x(), oEvent:y() }, NIL, self ) - lRet := .f. - EXIT + RETURN .f. CASE QEvent_MouseButtonPress // :lbClick() :mbClick() :rbClick() // :lbDown() :mbDown() :rbDown() DO CASE @@ -579,8 +575,7 @@ METHOD XbpWindow:grabEvent( nEvent, oEvent ) CASE oEvent:button() == Qt_RightButton SetAppEvent( xbeM_RbDown, { oEvent:x(), oEvent:y() }, NIL, self ) ENDCASE - lRet := .f. - EXIT + RETURN .f. CASE QEvent_MouseButtonRelease // :mbUp() :rbUp() :lbUp() DO CASE CASE oEvent:button() == Qt_LeftButton @@ -590,8 +585,7 @@ METHOD XbpWindow:grabEvent( nEvent, oEvent ) CASE oEvent:button() == Qt_RightButton SetAppEvent( xbeM_RbUp, { oEvent:x(), oEvent:y() }, NIL, self ) ENDCASE - lRet := .f. - EXIT + RETURN .f. CASE QEvent_MouseButtonDblClick // :lbDblClick() :mbDblClick() :rbDblClick() DO CASE CASE oEvent:button() == Qt_LeftButton @@ -601,8 +595,7 @@ METHOD XbpWindow:grabEvent( nEvent, oEvent ) CASE oEvent:button() == Qt_RightButton SetAppEvent( xbeM_RbDblClick, { oEvent:x(), oEvent:y() }, NIL, self ) ENDCASE - lRet := .f. - EXIT + RETURN .f. CASE QEvent_ContextMenu // //SetAppEvent( xbeM_Context, { oEvent:globalX(), oEvent:globalY() }, NIL, self ) ::hbContextMenu( { oEvent:globalX(), oEvent:globalY() } ) @@ -611,90 +604,62 @@ METHOD XbpWindow:grabEvent( nEvent, oEvent ) IF ( ::lTrack ) SetAppEvent( xbeM_Enter, { oEvent:x(), oEvent:y() }, NIL, self ) ENDIF - lRet := .f. - EXIT + RETURN .f. CASE QEvent_Leave // :leave() IF ( ::lTrack ) SetAppEvent( xbeM_Leave, { oEvent:x(), oEvent:y() }, NIL, self ) ENDIF - lRet := .f. - EXIT + RETURN .f. CASE QEvent_Wheel // :wheel() SetAppEvent( xbeM_Wheel, { oEvent:x(), oEvent:y() }, { oEvent:buttons(), oEvent:delta() }, self ) - lRet := .f. - EXIT + RETURN .f. CASE QEvent_FocusIn // :setInputFocus() SetAppEvent( xbeP_SetInputFocus, NIL, NIL, Self ) - lRet := .f. - EXIT + RETURN .f. CASE QEvent_FocusOut // :killInputFocus() SetAppEvent( xbeP_KillInputFocus, NIL, NIL, Self ) - lRet := .f. - EXIT + RETURN .f. CASE QEvent_Paint // :paint() oObj_N := oEvent:rect() SetAppEvent( xbeP_Paint, { oObj_N:left(), oObj_N:top(), oObj_N:right(), oObj_N:bottom() }, NIL, Self ) - lRet := .f. - EXIT + RETURN .f. CASE QEvent_Move // :move() oP0 := oEvent:oldPos() oP1 := oEvent:pos() ::moveOwned( oP1:x() - oP0:x(), oP1:y() - oP0:y() ) - SetAppEvent( xbeP_Move, { oP0:x(), oP0:y() }, { oP1:x(), oP1:y() }, Self ) - lRet := .f. - EXIT + // SetAppEvent( xbeP_Move, { oP0:x(), oP0:y() }, { oP1:x(), oP1:y() }, Self ) + RETURN .f. CASE QEvent_Resize // :resize() oObj_O := oEvent:oldSize() oObj_N := oEvent:size() SetAppEvent( xbeP_Resize, { oObj_O:width(), oObj_O:height() }, { oObj_N:width(), oObj_N:height() }, Self ) - lRet := .f. - EXIT + RETURN .f. CASE QEvent_DragEnter // :dragEnter() oObj_O := oEvent:pos() SetAppEvent( xbeP_DragEnter, { oEvent:mouseButtons(), { oObj_O:x(), oObj_O:y() } }, /* oDragObj */, Self ) - EXIT + RETURN .f. CASE QEvent_DragLeave // :dragLeave() SetAppEvent( xbeP_DragLeave, NIL, NIL, Self ) - EXIT + RETURN .f. CASE QEvent_DragMove // :dragMotion() oObj_O := oEvent:pos() SetAppEvent( xbeP_DragMotion, { oEvent:mouseButtons(), { oObj_O:x(), oObj_O:y() } }, NIL, Self ) - EXIT + RETURN .f. CASE QEvent_Drop // :dragDrop() oObj_O := oEvent:pos() SetAppEvent( xbeP_DragDrop, { oEvent:mouseButtons() , { oObj_O:x(), oObj_O:y() } }, /* oDragObj */, Self ) - EXIT + RETURN .f. CASE QEvent_WhatsThis // :helpRequest() SetAppEvent( xbeP_HelpRequest, NIL, NIL, Self ) - EXIT + RETURN .f. CASE QEvent_KeyPress // :keyBoard() nXbpkey := hbxbp_QKeyEventToAppEvent( oEvent ) SetAppEvent( xbeP_Keyboard, nXbpKey, NIL, self ) - EXIT + RETURN .t. - #if 0 - CASE QEvent_Close - IF hb_isBlock( ::sl_close ) - lRet := eval( ::sl_close, NIL, NIL, Self ) - IF lRet - SetAppEvent( xbeP_Close, NIL, NIL, Self ) - ENDIF - ELSE - SetAppEvent( xbeP_Close, NIL, NIL, Self ) - ENDIF - EXIT - CASE QEvent_WindowActivate - SetAppEvent( xbeP_SetDisplayFocus, NIL, NIL, Self ) - lRet := .T. - EXIT - CASE QEvent_WindowDeactivate - SetAppEvent( xbeP_KillDisplayFocus, NIL, NIL, Self ) - lRet := .T. - EXIT - #endif END SWITCH - RETURN lRet + RETURN .f. /*----------------------------------------------------------------------*/