2009-12-10 22:46 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)

* contrib/hbqt/hbqt_events.cpp
  * contrib/hbqt/hbqt_slots.cpp
    ! Fixed events/slots handling to make sure the objects 
      always exist on access.
    % This also made explicit initialization from .prg 
      code unnecessary, so these two functions got deleted:
         QT_SETEVENTFILTER(), QT_SETEVENTSLOTS()
    ! Fixed events/slots handling to reset thread local object 
      pointer to NULL after destruction.

  * contrib/hbxbp/xbpsle.prg
  * contrib/hbxbp/xbplistbox.prg
  * contrib/hbxbp/xbpwindow.prg
  * contrib/hbxbp/xbptreeview.prg
  * contrib/hbxbp/xbpdialog.prg
  * contrib/hbxbp/xbpspinbutton.prg
  * contrib/hbxbp/xbpgeneric.prg
    % Simple wrapper named HBXBP_SETEVENTFILTER() deleted and 
      replaced with QT_GETEVENTFILTER() calls.
      (name still subject to change)

  ; NOTE: 1) In demoxbp MT mode build, the second dialog behaves 
             strangely. It updates the screen slowly and not at all.
             Pritpal, please check it to make sure not some 
             recent change broke it.
          2) Forgot to mention in prev entry, but removing 
             HBQMainWindow() mutex altogether didn't cause any 
             change/loss of functionality in my tests, so my 
             question is: Is it really needed?
This commit is contained in:
Viktor Szakats
2009-12-10 21:50:20 +00:00
parent b8e8be71ec
commit b12029835e
10 changed files with 70 additions and 50 deletions

View File

@@ -17,6 +17,37 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-12-10 22:46 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbqt/hbqt_events.cpp
* contrib/hbqt/hbqt_slots.cpp
! Fixed events/slots handling to make sure the objects
always exist on access.
% This also made explicit initialization from .prg
code unnecessary, so these two functions got deleted:
QT_SETEVENTFILTER(), QT_SETEVENTSLOTS()
! Fixed events/slots handling to reset thread local object
pointer to NULL after destruction.
* contrib/hbxbp/xbpsle.prg
* contrib/hbxbp/xbplistbox.prg
* contrib/hbxbp/xbpwindow.prg
* contrib/hbxbp/xbptreeview.prg
* contrib/hbxbp/xbpdialog.prg
* contrib/hbxbp/xbpspinbutton.prg
* contrib/hbxbp/xbpgeneric.prg
% Simple wrapper named HBXBP_SETEVENTFILTER() deleted and
replaced with QT_GETEVENTFILTER() calls.
(name still subject to change)
; NOTE: 1) In demoxbp MT mode build, the second dialog behaves
strangely. It updates the screen slowly and not at all.
Pritpal, please check it to make sure not some
recent change broke it.
2) Forgot to mention in prev entry, but removing
HBQMainWindow() mutex altogether didn't cause any
change/loss of functionality in my tests, so my
question is: Is it really needed?
2009-12-10 22:22 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbqt/hbqt_hbqmainwindow.cpp
* contrib/hbxbp/xbpgeneric.prg

View File

@@ -75,24 +75,18 @@ typedef struct
static HB_TSD_NEW( s_events, sizeof( HB_EVENTS ), NULL, NULL );
#define HB_GETQTEVENTFILTER() ( ( PHB_EVENTS ) hb_stackGetTSD( &s_events ) )
#define HB_QTTHREAD_EVENTS() ( ( PHB_EVENTS ) hb_stackGetTSD( &s_events ) )
/*----------------------------------------------------------------------*/
static void qt_setEventFilter()
{
if( ! HB_GETQTEVENTFILTER()->t_events )
HB_GETQTEVENTFILTER()->t_events = new Events();
}
static Events * qt_getEventFilter( void )
{
return HB_GETQTEVENTFILTER()->t_events;
}
PHB_EVENTS p_events = HB_QTTHREAD_EVENTS();
HB_FUNC( QT_SETEVENTFILTER )
{
qt_setEventFilter();
if( ! p_events->t_events )
p_events->t_events = new Events();
return p_events->t_events;
}
HB_FUNC( QT_GETEVENTFILTER )
@@ -100,6 +94,17 @@ HB_FUNC( QT_GETEVENTFILTER )
hb_retptr( qt_getEventFilter() );
}
HB_FUNC( QT_EVENTS_DESTROY )
{
PHB_EVENTS p_events = HB_QTTHREAD_EVENTS();
if( p_events->t_events )
{
p_events->t_events->~Events();
p_events->t_events = NULL;
}
}
/*----------------------------------------------------------------------*/
Events::Events( QObject * parent ) : QObject( parent )
@@ -145,11 +150,6 @@ bool Events::eventFilter( QObject * object, QEvent * event )
return ret;
}
HB_FUNC( QT_EVENTS_DESTROY )
{
qt_getEventFilter()->~Events();
}
HB_FUNC( QT_CONNECT_EVENT )
{
QObject * object = ( QObject* ) hbqt_gcpointer( 1 ); /* get sender */

View File

@@ -73,24 +73,29 @@ typedef struct
static HB_TSD_NEW( s_slots, sizeof( HB_SLOTS ), NULL, NULL );
#define HB_GETQTEVENTSLOTS() ( ( PHB_SLOTS ) hb_stackGetTSD( &s_slots ) )
#define HB_QTTHREAD_SLOTS() ( ( PHB_SLOTS ) hb_stackGetTSD( &s_slots ) )
/*----------------------------------------------------------------------*/
static void qt_setEventSlots()
{
if( ! HB_GETQTEVENTSLOTS()->t_slots )
HB_GETQTEVENTSLOTS()->t_slots = new Slots();
}
static Slots * qt_getEventSlots( void )
{
return HB_GETQTEVENTSLOTS()->t_slots;
PHB_SLOTS p_slots = HB_QTTHREAD_SLOTS();
if( ! p_slots->t_slots )
p_slots->t_slots = new Slots();
return p_slots->t_slots;
}
HB_FUNC( QT_SETEVENTSLOTS )
HB_FUNC( QT_SLOTS_DESTROY )
{
qt_setEventSlots();
PHB_SLOTS p_slots = HB_QTTHREAD_SLOTS();
if( p_slots->t_slots )
{
p_slots->t_slots->~Slots();
p_slots->t_slots = NULL;
}
}
/*----------------------------------------------------------------------*/
@@ -502,7 +507,6 @@ HB_FUNC( QT_CONNECT_SIGNAL )
PHB_ITEM codeblock = hb_itemNew( hb_param( 3, HB_IT_BLOCK ) ); /* get codeblock */
bool ret;
qt_setEventSlots();
Slots * t_slots = qt_getEventSlots();
if( signal == ( QString ) "clicked()" ) ret = object->connect( object, SIGNAL( clicked() ) , t_slots, SLOT( clicked() ) , Qt::AutoConnection );
@@ -758,11 +762,6 @@ HB_FUNC( QT_DISCONNECT_SIGNAL )
hb_retl( bFreed );
}
HB_FUNC( QT_SLOTS_DESTROY )
{
qt_getEventSlots()->~Slots();
}
/*----------------------------------------------------------------------*/
#endif

View File

@@ -148,10 +148,6 @@ METHOD XbpDialog:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
SetAppWindow( Self )
/* Initialize Qt's event stacks */
QT_SetEventSlots()
QT_SetEventFilter()
/* Thread specific event buffer */
hbxbp_InitializeEventBuffer()
@@ -160,7 +156,7 @@ METHOD XbpDialog:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
hbxbp_SetEventLoop( ::oEventLoop )
/* Instal Event Filter */
::oWidget:installEventFilter( hbxbp_SetEventFilter() )
::oWidget:installEventFilter( QT_GetEventFilter() )
::connectWindowEvents()
//

View File

@@ -146,12 +146,6 @@ FUNCTION hbxbp_ClearEventBuffer()
/*----------------------------------------------------------------------*/
FUNCTION hbxbp_SetEventFilter()
RETURN QT_GetEventFilter()
/*----------------------------------------------------------------------*/
FUNCTION hbxbp_SetEventLoop( oELoop )
t_oEventLoop := oELoop

View File

@@ -178,7 +178,7 @@ METHOD XbpListBox:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
::oWidget:setMouseTracking( .t. )
/* Window Events */
::oWidget:installEventFilter( hbxbp_SetEventFilter() )
::oWidget:installEventFilter( QT_GetEventFilter() )
::connectEvent( ::pWidget, QEvent_ContextMenu, {|o,e| ::grabEvent( QEvent_ContextMenu, e, o ) } )
/* Signal-slots */

View File

@@ -146,7 +146,7 @@ METHOD XbpSLE:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
::oWidget:setMaxLength( ::bufferLength )
#if 0
QT_QObject_InstallEventFilter( ::pWidget, hbxbp_SetEventFilter() )
QT_QObject_InstallEventFilter( ::pWidget, QT_GetEventFilter() )
::connectEvent( ::pWidget, QEvent_FocusIn , {|o,e| ::exeBlock( 7, e, o ) } )
::connectEvent( ::pWidget, QEvent_FocusOut, {|o,e| ::exeBlock( 8, e, o ) } )

View File

@@ -154,7 +154,7 @@ METHOD XbpSpinButton:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible
::oWidget:setAlignment( es_[ ::align ] )
#if 0 ////////////////////////////////////
QT_QObject_InstallEventFilter( ::pWidget, hbxbp_SetEventFilter() )
QT_QObject_InstallEventFilter( ::pWidget, QT_GetEventFilter() )
HBXBP_DEBUG( "XbpSpinButton:create 2" )
::connectEvent( ::pWidget, QEvent_FocusIn , {|o,e| ::exeBlock( 7, e, o ) } )
::connectEvent( ::pWidget, QEvent_FocusOut, {|o,e| ::exeBlock( 8, e, o ) } )

View File

@@ -168,7 +168,7 @@ METHOD XbpTreeView:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
::oRootItem:oWidget := oW
/* Window Events */
::oWidget:installEventFilter( hbxbp_SetEventFilter() )
::oWidget:installEventFilter( QT_GetEventFilter() )
::connectEvent( ::pWidget, QEvent_ContextMenu, {|o,e| ::grabEvent( QEvent_ContextMenu, e, o ) } )
//::connect( ::pWidget, "currentItemChanged(QTWItem)" , {|o,p1,p2| ::exeBlock( 1, p1, p2, o ) } )

View File

@@ -414,7 +414,7 @@ METHOD XbpWindow:connectEvent( pWidget, nEvent, bBlock )
METHOD XbpWindow:connectWindowEvents()
//::oWidget:installEventFilter( hbxbp_SetEventFilter() )
//::oWidget:installEventFilter( QT_GetEventFilter() )
::connectEvent( ::pWidget, QEvent_MouseMove , {|o,e| ::grabEvent( QEvent_MouseMove , e, o ) } )
::connectEvent( ::pWidget, QEvent_MouseButtonPress , {|o,e| ::grabEvent( QEvent_MouseButtonPress , e, o ) } )
@@ -752,7 +752,7 @@ METHOD XbpWindow:destroy()
aeval( ::aEConnections, {|e_,i| Qt_DisConnect_Event( e_[ 1 ], e_[ 2 ] ), ;
::aEConnections[ i,1 ] := NIL, ::aEConnections[ i,2 ] := NIL, ::aEConnections[ i ] := NIL } )
::aEConnections := {}
::oWidget:removeEventFilter( hbxbp_SetEventFilter() )
::oWidget:removeEventFilter( QT_GetEventFilter() )
ENDIF
IF Len( ::aChildren ) > 0