2009-10-02 23:35 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com)

* contrib/hbxbp/xbpappevent.prg
  * contrib/hbxbp/xbpbrowse.prg
  * contrib/hbxbp/xbpdialog.prg
  * contrib/hbxbp/xbpgeneric.prg
  * contrib/hbxbp/xbpwindow.prg
    ! Changes to reflect modifications in hbqt.lib where QMainWindow()
      is subclassed to catch and fine-tune MT windows and memory management.
      This commit had to be along previous one but somehow I skipped.
This commit is contained in:
Pritpal Bedi
2009-10-03 06:40:05 +00:00
parent 836eecac3b
commit b25cea937d
6 changed files with 109 additions and 91 deletions

View File

@@ -17,6 +17,16 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-10-02 23:35 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com)
* contrib/hbxbp/xbpappevent.prg
* contrib/hbxbp/xbpbrowse.prg
* contrib/hbxbp/xbpdialog.prg
* contrib/hbxbp/xbpgeneric.prg
* contrib/hbxbp/xbpwindow.prg
! Changes to reflect modifications in hbqt.lib where QMainWindow()
is subclassed to catch and fine-tune MT windows and memory management.
This commit had to be along previous one but somehow I skipped.
2009-10-02 16:53 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/mpkg_src.sh
! fixed default root path settings after moving the file from bin

View File

@@ -178,6 +178,7 @@ FUNCTION XbpQKeyEventToAppEvent( pEvent )
key := oKeyEvent:key()
kbm := oKeyEvent:modifiers()
txt := oKeyEvent:text()
oKeyEvent:destroy()
SWITCH( key )
CASE Qt_Key_Escape

View File

@@ -685,7 +685,7 @@ METHOD XbpBrowse:exeBlock( nEvent, p1, p2, p3 )
LOCAL oWheelEvent, oMouseEvent, i, nRow, nRowPos, nCol, nColPos, oPoint
HB_SYMBOL_UNUSED( p2 )
//xbp_debug( " exeblock:", nEvent )
DO CASE
CASE nEvent == 1 /* Keypress Event */
SetAppEvent( xbeP_Keyboard, XbpQKeyEventToAppEvent( p1 ), NIL, self )
@@ -946,6 +946,7 @@ METHOD handleEvent( nEvent, mp1, mp2 ) CLASS XbpBrowse
METHOD XbpBrowse:supplyInfo( nMode, nInfo, p2, p3 )
//xbp_debug( 'supplyInfo:',nMode )
DO CASE
CASE nMode == 141 /* Main View Header|Data */
IF nInfo == HBQT_BRW_COLCOUNT
@@ -1183,11 +1184,13 @@ METHOD setHorzOffset() CLASS XbpBrowse
/*----------------------------------------------------------------------*/
METHOD setCurrentIndex( lReset ) CLASS XbpBrowse
LOCAL pIndex
DEFAULT lReset TO .t.
//
IF lReset
::oDbfModel:reset() /* Important */
//
IF hb_isObject( ::oLeftDbfModel )
::oLeftDbfModel:reset()
ENDIF
@@ -1196,9 +1199,9 @@ METHOD setCurrentIndex( lReset ) CLASS XbpBrowse
ENDIF
ENDIF
Qt_QModelIndex_destroy( ::pCurIndex )
::pCurIndex := ::oDbfModel:index( ::rowPos - 1, ::colPos - 1 )
::oTableView:setCurrentIndex( ::pCurIndex )
pIndex := ::oDbfModel:index( ::rowPos - 1, ::colPos - 1 )
::oTableView:setCurrentIndex( pIndex )
Qt_QModelIndex_destroy( pIndex )
RETURN Self
@@ -1634,13 +1637,17 @@ METHOD doConfigure() CLASS XbpBrowse
::setHorzScrollBarRange()
/* Inform Qt about number of rows and columns browser implements */
::oDbfModel:hbSetRowColumns( ::rowCount - 1, ::colCount - 1 )
/* Tell Qt to Reload Everything */
::oDbfModel:reset()
//
IF hb_isObject( ::oLeftDbfModel )
::oLeftDbfModel:hbSetRowColumns( ::rowCount - 1, ::nLeftFrozen - 1 )
::oLeftDbfModel:reset()
ENDIF
IF hb_isObject( ::oRightDbfModel )
::oRightDbfModel:hbSetRowColumns( ::rowCount - 1, ::nRightFrozen - 1 )
::oRightDbfModel:reset()
ENDIF

View File

@@ -124,8 +124,10 @@ METHOD XbpDialog:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
::cargo := ThreadID() /* To Be Removed */
::oWidget := QMainWindow():new()
::oWidget:setAttribute( Qt_WA_DeleteOnClose )
//::oWidget := QMainWindow():new()
::oWidget := QMainWindow():configure( QT_MyMainWindow( {|n,p| ::grabEvent( n,p ) }, ThreadID() ) )
//::oWidget:setAttribute( Qt_WA_DeleteOnClose )
//::oWidget:setMouseTracking( .t. )
IF !empty( ::title )
::oWidget:setWindowTitle( ::title )
@@ -146,6 +148,12 @@ METHOD XbpDialog:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
SetAppWindow( Self )
QT_MUTEXCREATE() //-------------//
/* Initialize Qt's event stacks */
QT_SetEventSlots()
QT_SetEventFilter()
/* Thread specific event buffer */
InitializeEventBuffer()
@@ -154,13 +162,16 @@ METHOD XbpDialog:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
::oEventLoop := QEventLoop():new( ::pWidget )
SetEventLoop( ::oEventLoop )
#if 0
/* Instal Event Filter */
::oWidget:installEventFilter( SetEventFilter() )
::connectWindowEvents()
::connectEvent( ::pWidget, QEvent_Close , {|o,e| ::exeBlock( QEvent_Close , e, o ) } )
::connectEvent( ::pWidget, QEvent_WindowActivate , {|o,e| ::exeBlock( QEvent_WindowActivate , e, o ) } )
::connectEvent( ::pWidget, QEvent_WindowDeactivate, {|o,e| ::exeBlock( QEvent_WindowDeactivate, e, o ) } )
#endif
RETURN Self
/*----------------------------------------------------------------------*/
@@ -172,7 +183,6 @@ METHOD XbpDialog:exeBlock( nEvent, pEvent )
DO CASE
CASE nEvent == QEvent_WindowActivate
SetAppWindow( Self ) /* TO REVIEW */
SetAppEvent( xbeP_SetDisplayFocus, NIL, NIL, Self )
lRet := .T.
@@ -206,11 +216,13 @@ METHOD XbpDialog:configure( oParent, oOwner, aPos, aSize, aPresParams, lVisible
METHOD XbpDialog:destroy()
SetEventLoop( NIL )
::oEventLoop:exit( 0 )
::oEventLoop:destroy()
::xbpWindow:destroy()
::oWidget:destroy()
// ::oWidget:destroy()
RETURN nil
@@ -307,8 +319,9 @@ METHOD XbpDrawingArea:create( oParent, oOwner, aPos, aSize, aPresParams, lVisibl
::oParent:addChild( SELF )
/* Connects All Event Handlers */
::connectWindowEvents()
//::connectWindowEvents()
RETURN Self
/*----------------------------------------------------------------------*/

View File

@@ -92,8 +92,6 @@ THREAD STATIC oDummy
THREAD STATIC oAppWindow
//THREAD STATIC sEventFilter
STATIC sEventFilter
THREAD STATIC oEventLoop
/*----------------------------------------------------------------------*/
@@ -121,9 +119,23 @@ FUNCTION InitializeEventBuffer()
IF empty( ts_events )
ts_events := array( EVENT_BUFFER )
aeval( ts_events, {|e,i| e := e, ts_events[ i ] := { 0, NIL, NIL, NIL, -9999 } } )
aeval( ts_events, {|e,i| e := e, ts_events[ i ] := { 0, NIL, NIL, NIL } } )
ENDIF
//xbp_debug( len( ts_events ) )
RETURN nil
/*----------------------------------------------------------------------*/
FUNCTION SetEventFilter()
RETURN QT_QEventFilter()
/*----------------------------------------------------------------------*/
FUNCTION SetEventLoop( oELoop )
oEventLoop := oELoop
RETURN nil
/*----------------------------------------------------------------------*/
@@ -135,22 +147,22 @@ FUNCTION SetAppEvent( nEvent, mp1, mp2, oXbp )
IF ++nEventIn > EVENT_BUFFER
nEventIn := 1
ENDIF
xbp_debug( "SetAppEvent ... ", threadID(), nEventIn )
#if 0
xbp_debug( 0, "SetAppEvent ... ", threadID(), nEvent, xbeP_Paint )
#endif
ts_events[ nEventIn,1 ] := nEvent
ts_events[ nEventIn,2 ] := mp1
ts_events[ nEventIn,3 ] := mp2
ts_events[ nEventIn,4 ] := oXbp
ts_events[ nEventIn,5 ] := ThreadID()
//xbp_debug( 1, "SetAppEvent ... ", threadID(), nEvent )
RETURN nil
/*----------------------------------------------------------------------*/
FUNCTION AppEvent( mp1, mp2, oXbp, nTimeout )
LOCAL nEvent
LOCAL nThreadID := ThreadID()
//LOCAL nThreadID := ThreadID()
//DEFAULT nTimeout TO 0
HB_SYMBOL_UNUSED( nTimeOut )
@@ -158,24 +170,21 @@ FUNCTION AppEvent( mp1, mp2, oXbp, nTimeout )
IF ++nEventOut > EVENT_BUFFER
nEventOut := 1
ENDIF
xbp_debug( " AppEvent ... ", nThreadID, nEventOut )
DO WHILE .t.
oEventLoop:processEvents( 0 )
//xbp_debug( " AppEvent ... ", nThreadID, nEventOut )
DO WHILE !empty( oEventLoop ) //.t.
oEventLoop:processEvents( QEventLoop_AllEvents )
IF ts_events[ nEventOut,5 ] == nThreadID
IF !empty( ts_events[ nEventOut,4 ] )
nEvent := ts_events[ nEventOut,1 ]
mp1 := ts_events[ nEventOut,2 ]
mp2 := ts_events[ nEventOut,3 ]
oXbp := ts_events[ nEventOut,4 ]
ts_events[ nEventOut,5 ] := -9999 /* an arbirary value never reached by ThreadID() */
ts_events[ nEventOut,4 ] := NIL
EXIT
ENDIF
hb_idleSleep( 0.001 ) /* Releases CPU cycles */
hb_idleSleep( 0.01 ) /* Releases CPU cycles */
ENDDO
xbp_debug( "..........................", threadID() )
//xbp_debug( "..........................", threadID() )
RETURN nEvent
@@ -184,16 +193,12 @@ xbp_debug( "..........................", threadID() )
FUNCTION SetAppWindow( oXbp )
LOCAL oldAppWindow
//hb_outDebug( str( threadId() )+' 0' )
oldAppWindow := oAppWindow
IF hb_isObject( oXbp )
oAppWindow := oXbp
ENDIF
//hb_outDebug( str( threadId() )+' 1' )
RETURN oldAppWindow
/*----------------------------------------------------------------------*/
@@ -267,20 +272,6 @@ FUNCTION GraMakeRGBColor( aRGB )
/*----------------------------------------------------------------------*/
FUNCTION SetEventFilter()
RETURN QT_QEventFilter()
/*----------------------------------------------------------------------*/
FUNCTION SetEventLoop( oELoop )
oEventLoop := oELoop
RETURN nil
/*----------------------------------------------------------------------*/
#define CRLF chr( 13 )+chr( 10 )
FUNCTION Xbp_Debug( ... )

View File

@@ -390,7 +390,7 @@ METHOD XbpWindow:connectEvent( pWidget, nEvent, bBlock )
METHOD XbpWindow:connectWindowEvents()
::oWidget:installEventFilter( SetEventFilter() )
//::oWidget:installEventFilter( SetEventFilter() )
::connectEvent( ::pWidget, QEvent_MouseMove , {|o,e| ::grabEvent( QEvent_MouseMove , e, o ) } )
::connectEvent( ::pWidget, QEvent_MouseButtonPress , {|o,e| ::grabEvent( QEvent_MouseButtonPress , e, o ) } )
@@ -421,22 +421,19 @@ METHOD XbpWindow:connectWindowEvents()
*/
METHOD XbpWindow:grabEvent( nEvent, pEvent, oXbp )
LOCAL oEvent, nXbpKey, oP0, oP1, oObj_O, oObj_N
LOCAL lRet := .F.
LOCAL lRet := .t.
HB_SYMBOL_UNUSED( oXbp )
SWITCH ( nEvent )
CASE QEvent_MouseMove // :motion()
//hb_outDebug( "QEvent_MouseMove: "+hb_ntos( ThreadID() ) )
oEvent := QMouseEvent()
oEvent:pPtr := pEvent
oEvent := QMouseEvent():configure( pEvent )
SetAppEvent( xbeM_Motion, { oEvent:x(), oEvent:y() }, NIL, self )
EXIT
CASE QEvent_MouseButtonPress // :lbClick() :mbClick() :rbClick()
// :lbDown() :mbDown() :rbDown()
oEvent := QMouseEvent()
oEvent:pPtr := pEvent
oEvent := QMouseEvent():configure( pEvent )
DO CASE
CASE oEvent:button() == Qt_LeftButton
SetAppEvent( xbeM_LbDown, { oEvent:x(), oEvent:y() }, NIL, self )
@@ -447,8 +444,7 @@ METHOD XbpWindow:grabEvent( nEvent, pEvent, oXbp )
ENDCASE
EXIT
CASE QEvent_MouseButtonRelease // :mbUp() :rbUp() :lbUp()
oEvent := QMouseEvent()
oEvent:pPtr := pEvent
oEvent := QMouseEvent():configure( pEvent )
DO CASE
CASE oEvent:button() == Qt_LeftButton
SetAppEvent( xbeM_LbUp, { oEvent:x(), oEvent:y() }, NIL, self )
@@ -459,8 +455,7 @@ METHOD XbpWindow:grabEvent( nEvent, pEvent, oXbp )
ENDCASE
EXIT
CASE QEvent_MouseButtonDblClick // :lbDblClick() :mbDblClick() :rbDblClick()
oEvent := QMouseEvent()
oEvent:pPtr := pEvent
oEvent := QMouseEvent():configure( pEvent )
DO CASE
CASE oEvent:button() == Qt_LeftButton
SetAppEvent( xbeM_LbDblClick, { oEvent:x(), oEvent:y() }, NIL, self )
@@ -472,70 +467,66 @@ METHOD XbpWindow:grabEvent( nEvent, pEvent, oXbp )
EXIT
CASE QEvent_Enter // :enter()
IF ( ::lTrack )
oEvent := QMouseEvent()
oEvent:pPtr := pEvent
oEvent := QMouseEvent():configure( pEvent )
SetAppEvent( xbeM_Enter, { oEvent:x(), oEvent:y() }, NIL, self )
ENDIF
lRet := .f.
EXIT
CASE QEvent_Leave // :leave()
IF ( ::lTrack )
oEvent := QMouseEvent()
oEvent:pPtr := pEvent
oEvent := QMouseEvent():configure( pEvent )
SetAppEvent( xbeM_Leave, { oEvent:x(), oEvent:y() }, NIL, self )
ENDIF
lRet := .f.
EXIT
CASE QEvent_Wheel // :wheel()
oEvent := QWheelEvent()
oEvent:pPtr := pEvent
oEvent := QWheelEvent():configure( pEvent )
SetAppEvent( xbeM_Wheel, { oEvent:x(), oEvent:y() }, { oEvent:buttons(), oEvent:delta() }, self )
EXIT
CASE QEvent_FocusIn // :setInputFocus()
SetAppEvent( xbeP_SetInputFocus, NIL, NIL, Self )
lRet := .f.
EXIT
CASE QEvent_FocusOut // :killInputFocus()
SetAppEvent( xbeP_KillInputFocus, NIL, NIL, Self )
lRet := .f.
EXIT
CASE QEvent_Paint // :paint()
oEvent := QPaintEvent()
oEvent:pPtr := pEvent
oObj_N := QRect()
oObj_N:pPtr := oEvent:rect()
oEvent := QPaintEvent():configure( pEvent )
oObj_N := QRect():configure( oEvent:rect() )
SetAppEvent( xbeP_Paint, { oObj_N:left(), oObj_N:top(), oObj_N:right(), oObj_N:bottom() }, NIL, Self )
oObj_N:destroy()
lRet := .f.
EXIT
CASE QEvent_Move // :move()
oEvent := QMoveEvent()
oEvent:pPtr := pEvent
oP0 := QPoint()
oP0:pPtr := oEvent:oldPos()
oP1 := QPoint()
oP1:pPtr := oEvent:pos()
oEvent := QMoveEvent():configure( pEvent )
oP0 := QPoint():configure( oEvent:oldPos() )
oP1 := QPoint():configure( oEvent:pos() )
SetAppEvent( xbeP_Move, { oP0:x(), oP0:y() }, { oP1:x(), oP1:y() }, Self )
oP0:destroy()
oP1:destroy()
EXIT
CASE QEvent_Resize // :resize()
oEvent := QResizeEvent()
oEvent:pPtr := pEvent
oObj_O := QSize()
oObj_O:pPtr := oEvent:oldSize()
oObj_N := QSize()
oObj_N:pPtr := oEvent:size()
oEvent := QResizeEvent():configure( pEvent )
oObj_O := QSize():configure( oEvent:oldSize() )
oObj_N := QSize():configure( oEvent:size() )
SetAppEvent( xbeP_Resize, { oObj_O:width(), oObj_O:height() }, { oObj_N:width(), oObj_N:height() }, Self )
oObj_N:destroy()
oObj_O:destroy()
EXIT
CASE QEvent_DragEnter // :dragEnter()
oEvent := QDragEnterEvent()
oEvent:pPtr := pEvent
oEvent := QDragEnterEvent():configure( pEvent )
SetAppEvent( xbeP_DragEnter, { oEvent:mouseButtons(), { oEvent:pos():x(), oEvent:pos():y() } }, /* oDragObj */, Self )
EXIT
CASE QEvent_DragLeave // :dragLeave()
SetAppEvent( xbeP_DragLeave, NIL, NIL, Self )
EXIT
CASE QEvent_DragMove // :dragMotion()
oEvent := QDragEnterEvent()
oEvent:pPtr := pEvent
oEvent := QDragEnterEvent():configure( pEvent )
SetAppEvent( xbeP_DragMotion, { oEvent:mouseButtons(), { oEvent:pos():x(), oEvent:pos():y() } }, NIL, Self )
EXIT
CASE QEvent_Drop // :dragDrop()
oEvent := QDragEnterEvent()
oEvent:pPtr := pEvent
oEvent := QDragEnterEvent():configure( pEvent )
SetAppEvent( xbeP_DragDrop, { oEvent:mouseButtons(), { oEvent:pos():x(), oEvent:pos():y() } }, /* oDragObj */, Self )
EXIT
CASE QEvent_WhatsThis // :helpRequest()
@@ -694,13 +685,13 @@ METHOD XbpWindow:configure( oParent, oOwner, aPos, aSize, aPresParams, lVisible
METHOD XbpWindow:destroy()
//hb_outDebug( "Destroy: "+pad(__ObjGetClsName( self ),12)+ IF(empty(::cargo),'',str(::cargo) ) )
//xbp_Debug( "Destroy: "+pad(__ObjGetClsName( self ),12)+ IF(empty(::cargo),'',str(::cargo) ) )
#if 0
IF Len( ::aChildren ) > 0
aeval( ::aChildren, {|o| o:destroy() } )
::aChildren := {}
ENDIF
#endif
IF len( ::aConnections ) > 0
aeval( ::aConnections, {|e_| Qt_DisConnect_Signal( e_[ 1 ], e_[ 2 ] ) } )
::aConnections := {}
@@ -708,13 +699,18 @@ METHOD XbpWindow:destroy()
IF len( ::aEConnections ) > 0
aeval( ::aEConnections, {|e_| Qt_DisConnect_Event( e_[ 1 ], e_[ 2 ] ) } )
::aConnections := {}
::aEConnections := {}
::oWidget:removeEventFilter( SetEventFilter() )
ENDIF
IF Len( ::aChildren ) > 0
aeval( ::aChildren, {|o| o:destroy() } )
::aChildren := {}
ENDIF
::oWidget:close()
//hb_outDebug( " Destroy: "+pad(__ObjGetClsName( self ),12)+ IF(empty(::cargo),'',str(::cargo) ) )
//xbp_Debug( " Destroy: "+pad(__ObjGetClsName( self ),12)+ IF(empty(::cargo),'',str(::cargo) ) )
RETURN NIL