diff --git a/include/private/qeventloop_glib_p.h b/include/private/qeventloop_glib_p.h new file mode 120000 index 00000000..04493aa6 --- /dev/null +++ b/include/private/qeventloop_glib_p.h @@ -0,0 +1 @@ +../../src/kernel/qeventloop_glib_p.h \ No newline at end of file diff --git a/src/kernel/ntqeventloop.h b/src/kernel/ntqeventloop.h index 23a3b38b..21410123 100644 --- a/src/kernel/ntqeventloop.h +++ b/src/kernel/ntqeventloop.h @@ -44,9 +44,12 @@ #include "ntqsocketnotifier.h" #endif // QT_H +#ifdef Q_QDOC +#else // Q_QDOC #if defined(QT_USE_GLIBMAINLOOP) #include #endif // QT_USE_GLIBMAINLOOP +#endif // Q_QDOC class TQEventLoopPrivate; class TQSocketNotifier; @@ -99,7 +102,9 @@ public: virtual void wakeUp(); -#if defined(QT_USE_GLIBMAINLOOP) +#ifdef Q_QDOC +#else // Q_QDOC +#if defined(QT_USE_GLIBMAINLOOP) // glib main loop support @@ -114,7 +119,10 @@ public: // end glib main loop support #endif //QT_USE_GLIBMAINLOOP - +#endif // Q_QDOC + + void setSingleToolkitEventHandling(bool enabled); + signals: void awake(); void aboutToBlock(); diff --git a/src/kernel/qeventloop_glib_p.h b/src/kernel/qeventloop_glib_p.h index ac5cb6b3..057bcf86 100644 --- a/src/kernel/qeventloop_glib_p.h +++ b/src/kernel/qeventloop_glib_p.h @@ -95,6 +95,7 @@ public: quitnow = FALSE; exitloop = FALSE; shortcut = FALSE; + singletoolkit = TRUE; } int looplevel; @@ -124,6 +125,7 @@ public: // My GSource GSource * gSource; + bool singletoolkit; }; diff --git a/src/kernel/qeventloop_x11.cpp b/src/kernel/qeventloop_x11.cpp index 0ae38705..56542710 100644 --- a/src/kernel/qeventloop_x11.cpp +++ b/src/kernel/qeventloop_x11.cpp @@ -415,3 +415,7 @@ void TQEventLoop::appClosingDown() { d->xfd = -1; } + +void TQEventLoop::setSingleToolkitEventHandling(bool enabled) { + // Do nothing +} \ No newline at end of file diff --git a/src/kernel/qeventloop_x11_glib.cpp b/src/kernel/qeventloop_x11_glib.cpp index 62584d2a..11141a3a 100644 --- a/src/kernel/qeventloop_x11_glib.cpp +++ b/src/kernel/qeventloop_x11_glib.cpp @@ -96,6 +96,9 @@ static gboolean qt_gsource_check ( GSource *source ) static gboolean qt_gsource_dispatch ( GSource *source, GSourceFunc callback, gpointer user_data ) { + Q_UNUSED(callback); + Q_UNUSED(user_data); + TQtGSource * qtGSource = (TQtGSource*) source; return qtGSource->qeventLoop->gsourceDispatch(source); } @@ -166,7 +169,9 @@ void TQEventLoop::init() d->pev_flags = AllEvents | WaitForMore; // initialize the common parts of the event loop - pipe( d->thread_pipe ); + if (pipe( d->thread_pipe ) < 0) { + // Error! + } fcntl(d->thread_pipe[0], F_SETFD, FD_CLOEXEC); fcntl(d->thread_pipe[1], F_SETFD, FD_CLOEXEC); @@ -341,7 +346,8 @@ bool TQEventLoop::processX11Events() bool TQEventLoop::gsourcePrepare(GSource *gs, int * timeout) { - + Q_UNUSED(gs); + #ifdef DEBUG_QT_GLIBMAINLOOP printf("inside gsourcePrepare(1)\n"); #endif @@ -447,78 +453,80 @@ bool TQEventLoop::gsourcePrepare(GSource *gs, int * timeout) bool TQEventLoop::gsourceCheck(GSource *gs) { - + Q_UNUSED(gs); + #ifdef DEBUG_QT_GLIBMAINLOOP printf("inside gsourceCheck(1)\n"); - #endif - - + #endif + + // Socketnotifier events? - + TQPtrList *list = &d->sn_list; - + //if ( list ) { - - + + TQSockNotGPollFD *sn = list->first(); while ( sn ) { if ( sn->gPollFD.revents ) return TRUE; sn = list->next(); } - //} - - if (d->x_gPollFD.revents) { + //} + + if (d->x_gPollFD.revents) { #ifdef DEBUG_QT_GLIBMAINLOOP printf("inside gsourceCheck(2) xfd!\n"); - #endif - + #endif + return TRUE; // we got events! } - if (d->threadPipe_gPollFD.revents) { + if (d->threadPipe_gPollFD.revents) { #ifdef DEBUG_QT_GLIBMAINLOOP printf("inside gsourceCheck(2) threadpipe!!\n"); - #endif - + #endif + return TRUE; // we got events! } if (hasPendingEvents()) { #ifdef DEBUG_QT_GLIBMAINLOOP printf("inside gsourceCheck(2) pendingEvents!\n"); - #endif - + #endif + return TRUE; // we got more X11 events! } // check if we have timers to activate? - + timeval * tm =qt_wait_timer(); - + if (tm && (tm->tv_sec == 0 && tm->tv_usec == 0 )) { #ifdef DEBUG_QT_GLIBMAINLOOP printf("inside gsourceCheck(2) qtwaittimer!\n"); - #endif - + #endif + return TRUE; } - - // nothing to dispatch - + + // nothing to dispatch + #ifdef DEBUG_QT_GLIBMAINLOOP printf("inside gsourceCheck(2) nothing to dispatch!\n"); - #endif - - return FALSE; + #endif + + return FALSE; } bool TQEventLoop::gsourceDispatch(GSource *gs) { + Q_UNUSED(gs); - // relock the GUI mutex before processing any pending events + // relock the GUI mutex before processing any pending events #if defined(QT_THREAD_SUPPORT) - TQMutexLocker locker( TQApplication::tqt_mutex ); -#endif + TQMutexLocker locker( TQApplication::tqt_mutex ); +#endif #if defined(QT_THREAD_SUPPORT) - locker.mutex()->lock(); + locker.mutex()->lock(); #endif int nevents=0; @@ -527,18 +535,20 @@ bool TQEventLoop::gsourceDispatch(GSource *gs) { #ifdef DEBUG_QT_GLIBMAINLOOP printf("inside gsourceDispatch(1)\n"); - #endif - + #endif + // we are awake, broadcast it emit awake(); emit tqApp->guiThreadAwake(); // some other thread woke us up... consume the data on the thread pipe so that // select doesn't immediately return next time - + if ( d->threadPipe_gPollFD.revents) { char c; - ::read( d->thread_pipe[0], &c, 1 ); + if (::read( d->thread_pipe[0], &c, 1 ) < 0) { + // Error! + } } if ( qt_postselect_handler ) { @@ -552,8 +562,8 @@ bool TQEventLoop::gsourceDispatch(GSource *gs) { // if select says data is ready on any socket, then set the socket notifier // to pending // if ( &d->sn_list ) { - - + + TQPtrList *list = &d->sn_list; TQSockNotGPollFD *sn = list->first(); while ( sn ) { @@ -562,7 +572,7 @@ bool TQEventLoop::gsourceDispatch(GSource *gs) { sn = list->next(); } // } - + nevents += activateSocketNotifiers(); } @@ -574,30 +584,35 @@ bool TQEventLoop::gsourceDispatch(GSource *gs) { - // return true if we handled events, false otherwise - //return (nevents > 0); - + // return true if we handled events, false otherwise + //return (nevents > 0); + // now process x11 events! #ifdef DEBUG_QT_GLIBMAINLOOP printf("inside gsourceDispatch(2) hasPendingEvents=%d\n", hasPendingEvents()); #endif - + + if (hasPendingEvents()) { // color approx. optimization - only on X11 - qt_reset_color_avail(); - + qt_reset_color_avail(); + processX11Events(); - + } - + #if defined(QT_THREAD_SUPPORT) locker.mutex()->unlock(); -#endif - - return TRUE; - +#endif + + if (d->singletoolkit) { + return TRUE; // Eat the event + } + else { + return FALSE; // Pass the event on to GTK + } } bool TQEventLoop::hasPendingEvents() const @@ -616,3 +631,7 @@ void TQEventLoop::appClosingDown() { d->xfd = -1; } + +void TQEventLoop::setSingleToolkitEventHandling(bool enabled) { + d->singletoolkit = enabled; +} \ No newline at end of file diff --git a/src/kernel/qt_kernel.pri b/src/kernel/qt_kernel.pri index d589cdf2..490f06a4 100644 --- a/src/kernel/qt_kernel.pri +++ b/src/kernel/qt_kernel.pri @@ -23,6 +23,7 @@ kernel { $$KERNEL_H/ntqevent.h \ $$KERNEL_H/ntqeventloop.h \ $$KERNEL_P/qeventloop_p.h \ + $$KERNEL_P/qeventloop_glib_p.h \ $$KERNEL_H/ntqfocusdata.h \ $$KERNEL_H/ntqfont.h \ $$KERNEL_P/qfontdata_p.h \