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.
This commit is contained in:
Pritpal Bedi
2011-05-01 01:03:01 +00:00
parent 6521c7c3ac
commit bf66b2429a
5 changed files with 137 additions and 82 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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 )

View File

@@ -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

View File

@@ -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.
/*----------------------------------------------------------------------*/