diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 9cd76cb103..57cf79dbe5 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -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 diff --git a/harbour/contrib/hbxbp/xbpappevent.prg b/harbour/contrib/hbxbp/xbpappevent.prg index 9aa7f362c9..6e3eca8272 100644 --- a/harbour/contrib/hbxbp/xbpappevent.prg +++ b/harbour/contrib/hbxbp/xbpappevent.prg @@ -178,6 +178,7 @@ FUNCTION XbpQKeyEventToAppEvent( pEvent ) key := oKeyEvent:key() kbm := oKeyEvent:modifiers() txt := oKeyEvent:text() + oKeyEvent:destroy() SWITCH( key ) CASE Qt_Key_Escape diff --git a/harbour/contrib/hbxbp/xbpbrowse.prg b/harbour/contrib/hbxbp/xbpbrowse.prg index baab09a399..cda6c5c8d4 100644 --- a/harbour/contrib/hbxbp/xbpbrowse.prg +++ b/harbour/contrib/hbxbp/xbpbrowse.prg @@ -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 diff --git a/harbour/contrib/hbxbp/xbpdialog.prg b/harbour/contrib/hbxbp/xbpdialog.prg index f3a2e42bc9..37124b2e77 100644 --- a/harbour/contrib/hbxbp/xbpdialog.prg +++ b/harbour/contrib/hbxbp/xbpdialog.prg @@ -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 /*----------------------------------------------------------------------*/ + diff --git a/harbour/contrib/hbxbp/xbpgeneric.prg b/harbour/contrib/hbxbp/xbpgeneric.prg index 95a891c4bf..1ccd008d6a 100644 --- a/harbour/contrib/hbxbp/xbpgeneric.prg +++ b/harbour/contrib/hbxbp/xbpgeneric.prg @@ -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( ... ) diff --git a/harbour/contrib/hbxbp/xbpwindow.prg b/harbour/contrib/hbxbp/xbpwindow.prg index 91cd012168..56cd584566 100644 --- a/harbour/contrib/hbxbp/xbpwindow.prg +++ b/harbour/contrib/hbxbp/xbpwindow.prg @@ -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