2012-07-08 10:56 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)

* contrib/hbqt/hbmk2_qt.hb
    + Added: few more Qt defined variable types.
       Miss from prev commit.

  * contrib/hbqt/qtcore/hbqt_bind.cpp
    ! Fixed: some more rare cases where GPF on exit was there.

  ; NOTE: with this commit I feel the new engine is working 
          absolutely fine without GPF's and also along the 
          Harbour way of programming practice. If you find any 
          regression, please report. Till then I concentrate on 
          other parts of HbQt.
This commit is contained in:
Pritpal Bedi
2012-07-09 06:03:42 +00:00
parent f9fc890874
commit cc149201a8
3 changed files with 65 additions and 16 deletions

View File

@@ -16,6 +16,20 @@
The license applies to all entries newer than 2009-04-28.
*/
2012-07-08 10:56 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbqt/hbmk2_qt.hb
+ Added: few more Qt defined variable types.
Miss from prev commit.
* contrib/hbqt/qtcore/hbqt_bind.cpp
! Fixed: some more rare cases where GPF on exit was there.
; NOTE: with this commit I feel the new engine is working
absolutely fine without GPF's and also along the
Harbour way of programming practice. If you find any
regression, please report. Till then I concentrate on
other parts of HbQt.
2012-07-08 16:17 UTC+0200 Viktor Szakats (harbour syenar.net)
* INSTALL
+ Clarified 'stable' vs 'unstable' in HOW TO GET HARBOUR

View File

@@ -2335,13 +2335,13 @@ METHOD HbQtSource:parseProto( cProto, fBody_ )
oArg:cDoc := "n" + oMtd:cDocNM
oArg:cTypeHB := "N"
CASE oArg:cCast $ "double,qreal,float,GLfloat" .AND. oArg:lFar
CASE oArg:cCast $ "double,qreal,float,GLfloat,qsreal" .AND. oArg:lFar
AAdd( oMtd:aPre, { oArg:cCast + " qr" + oMtd:cDocNM + " = 0;", oMtd:nHBIdx, "qr" + oMtd:cDocNM, "hb_stornd" } )
oArg:cBody := "&qr" + oMtd:cDocNM
oArg:cDoc := "@n" + oMtd:cDocNM
oArg:cTypeHB := "N*"
CASE oArg:cCast $ "double,qreal,float,GLfloat"
CASE oArg:cCast $ "double,qreal,float,GLfloat,qsreal"
s := "hb_parnd( " + cHBIdx + " )"
IF ! Empty( oArg:cDefault )
oArg:cBody := "( HB_ISNUM( " + cHBIdx + " ) ? " + s + " : " + oArg:cDefault + " )"
@@ -3402,6 +3402,9 @@ STATIC FUNCTION qth_is_QObject( cWidget )
aadd( aQObjects, "QGLWidget" )
aadd( aQObjects, "QGraphicsSvgItem" )
aadd( aQObjects, "QScriptEngine" )
aadd( aQObjects, "QScriptExtensionPlugin" )
ENDIF
RETURN ascan( aQObjects, {|e| e == cWidget } ) > 0

View File

@@ -122,6 +122,7 @@ static void hbqt_bindDestroyChildren( void * hbObject, bool fDeleteSelf );
static QList<PHB_ITEM> hbqt_bindGetObjectListByThread( int iThreadId );
static PHBQT_BIND hbqt_bindGetBindByQtObject( void * qtObject );
static PHBQT_BIND hbqt_bindGetBindByHbObject( void * hbObject );
static void hbqt_bindDestroyQtObjectA( void * qtObject, QObject * qObject );
static int s_bind_threadId = 0;
@@ -199,14 +200,14 @@ static void hbqt_bindThreadRelease( void * cargo )
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() != NULL && children() > 0", iThreadId, i+1 ) );
hbqt_bindDestroyChildren( bind->hbObject, false );
hbqt_bindDestroyQtObject( bind->qtObject, ( QObject * ) bind->qtObject );
hbqt_bindDestroyQtObjectA( bind->qtObject, ( QObject * ) bind->qtObject );
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
}
else if( qObject->parent() != NULL && qObject->children().size() == 0 )
{
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() != NULL && children() == 0", iThreadId, i+1 ) );
hbqt_bindDestroyQtObject( bind->qtObject, ( QObject * ) bind->qtObject );
hbqt_bindDestroyQtObjectA( bind->qtObject, ( QObject * ) bind->qtObject );
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
}
else if( qObject->parent() == NULL && qObject->children().size() > 0 )
@@ -214,14 +215,14 @@ static void hbqt_bindThreadRelease( void * cargo )
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() == NULL && children() > 0", iThreadId, i+1 ) );
hbqt_bindDestroyChildren( bind->hbObject, false );
hbqt_bindDestroyQtObject( bind->qtObject, ( QObject * ) bind->qtObject );
hbqt_bindDestroyQtObjectA( bind->qtObject, ( QObject * ) bind->qtObject );
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
}
else if( qObject->parent() == NULL && qObject->children().size() == 0 )
{
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... parent() == NULL && children() == 0", iThreadId, i+1 ) );
hbqt_bindDestroyQtObject( bind->qtObject, qObject );
hbqt_bindDestroyQtObjectA( bind->qtObject, qObject );
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
}
}
@@ -235,11 +236,13 @@ static void hbqt_bindThreadRelease( void * cargo )
{
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
HB_TRACE( HB_TR_DEBUG, ( ".......hbqt_bindThreadRelease( %i, #.%i )... else no_qOBJECT", iThreadId, i+1 ) );
PHB_ITEM pObject = hb_arrayFromId( NULL, bind->hbObject );
if( pObject != NULL )
void * qtObject = bind->qtObject;
int iFlags = bind->iFlags;
PHBQT_DEL_FUNC pDelFunc = bind->pDelFunc;
hbqt_bindRemoveBind( bind );
if( pDelFunc != NULL )
{
hbqt_bindDestroyHbObject( pObject );
hb_itemRelease( pObject );
pDelFunc( qtObject, iFlags );
}
HB_TRACE( HB_TR_DEBUG, ( "..." ) );
}
@@ -498,7 +501,6 @@ PHB_ITEM hbqt_bindGetHbObject( PHB_ITEM pItem, void * qtObject, const char * szC
{
QObject::connect( obj, SIGNAL( destroyed(QObject*) ), hbqt_bindGetThreadData()->pDestroyer, SLOT( destroyer(QObject*) ) );
}
HB_TRACE( HB_TR_DEBUG, ( "......hbqt_bindGetHbObject_connected_to_destroy()( %p, %s )", qtObject, szClassName ) );
hb_vmPushDynSym( s_dynsym_SETSLOTS ); /* initializes __Slots hash */
hb_vmPush( pObject );
@@ -522,7 +524,7 @@ PHB_ITEM hbqt_bindGetHbObject( PHB_ITEM pItem, void * qtObject, const char * szC
void hbqt_bindDestroyHbObject( PHB_ITEM pObject )
{
void * hbObject = hb_arrayId( pObject );
HB_TRACE( HB_TR_DEBUG, ( ".........HARBOUR_DESTROY_BEGINS..........." ) );
if( hbObject )
{
PHBQT_BIND bind = hbqt_bindGetBindByHbObject( hbObject );
@@ -568,7 +570,7 @@ void hbqt_bindDestroyHbObject( PHB_ITEM pObject )
{
if( isQObject )
{
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_QT_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_qt_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
qObject->disconnect();
if( bind->fEventFilterInstalled )
{
@@ -577,7 +579,7 @@ void hbqt_bindDestroyHbObject( PHB_ITEM pObject )
}
else
{
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_QT_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_qt_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
}
hbqt_bindRemoveBind( bind );
pDelFunc( qtObject, iFlags );
@@ -586,7 +588,8 @@ void hbqt_bindDestroyHbObject( PHB_ITEM pObject )
{
if( isQObject )
{
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_NOT-DESTROYING_HB_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
hbqt_bindRemoveBind( bind ); /* MUST HAVE : hb_arrayFromId() returns NIL onto retained object as such */
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_NOT-DESTROYING_hb_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
}
}
}
@@ -594,7 +597,7 @@ void hbqt_bindDestroyHbObject( PHB_ITEM pObject )
{
if( isQObject )
{
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_HB_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
HB_TRACE( HB_TR_DEBUG, ( "......... HARBOUR_DESTROYING_hb_OBJECT( %i, %i, %p, %s ) )", bind->iThreadId, iFlags, qtObject, bind->szClassName ) );
}
hbqt_bindRemoveBind( bind );
}
@@ -605,6 +608,7 @@ void hbqt_bindDestroyHbObject( PHB_ITEM pObject )
void hbqt_bindDestroyQtObject( void * qtObject, QObject * qObject )
{
HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROY_BEGINS...............%p %p", qtObject, qObject ) );
if( qtObject )
{
qObject->disconnect();
@@ -621,6 +625,34 @@ void hbqt_bindDestroyQtObject( void * qtObject, QObject * qObject )
hbqt_bindRemoveBind( bind );
}
}
HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROY_ENDS...............%p %p", qtObject, qObject ) );
}
static void hbqt_bindDestroyQtObjectA( void * qtObject, QObject * qObject )
{
HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROY_BEGINS...............%p %p", qtObject, qObject ) );
if( qtObject )
{
qObject->disconnect();
PHBQT_BIND bind = hbqt_bindGetBindByQtObject( qtObject );
if( bind != NULL )
{
HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROYS( %i, %i, %p, %s )..............", bind->iThreadId, bind->iFlags, bind->qtObject, bind->szClassName ) );
if( bind->fEventFilterInstalled )
{
qObject->removeEventFilter( hbqt_bindGetThreadData()->pReceiverEvents );
}
int iFlags = bind->iFlags;
PHBQT_DEL_FUNC pDelFunc = bind->pDelFunc;
hbqt_bindRemoveBind( bind );
if( pDelFunc != NULL )
{
pDelFunc( qtObject, iFlags );
}
}
}
HB_TRACE( HB_TR_DEBUG, ( "............QT_DESTROY_ENDS...............%p %p", qtObject, qObject ) );
}
PHB_ITEM hbqt_bindSetHbObject( PHB_ITEM pItem, void * qtObject, const char * szClassName, PHBQT_DEL_FUNC pDelFunc, int iFlags )