Ignore:
Timestamp:
Jul 27, 2009, 7:39:55 PM (16 years ago)
Author:
Dmitry A. Kuminov
Message:

corelib: Implemented message queue, finished QEventDispatcherPM (#24).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/corelib/kernel/qeventdispatcher_pm.cpp

    r84 r85  
    985985    {
    986986    public:
    987         AuxWnd() : QPMObjectWindow(true /* deferred */), dispatcher(0) {}
    988         void setDispatcher(QEventDispatcherPMPrivate *d) { dispatcher = d; }
     987        AuxWnd() : QPMObjectWindow(true /* deferred */) {}
    989988        MRESULT message(ULONG msg, MPARAM mp1, MPARAM mp2);
    990         QEventDispatcherPMPrivate *dispatcher;
    991989    private:
    992990        QSet<int> timersInSend;
     
    998996    bool interrupt;
    999997
    1000 // @todo later
    1001 //
    1002 //  QList<QMSG> queuedUserInputEvents;
    1003 //  QList<QMSG> queuedSocketEvents;
     998    QList<QMSG> queuedUserInputEvents;
     999    QList<QMSG> queuedSocketEvents;
    10041000};
    10051001
     
    10111007QEventDispatcherPMPrivate::~QEventDispatcherPMPrivate()
    10121008{
    1013     auxWnd.setDispatcher(0);
    10141009    auxWnd.destroy();
    10151010    if (hmq != NULLHANDLE) {
     
    10451040    if (auxWnd.hwnd() == NULLHANDLE) {
    10461041        createMsgQueue();
    1047         auxWnd.setDispatcher(this);
    10481042        auxWnd.create();
    10491043    }
     
    11021096bool QEventDispatcherPM::processEvents(QEventLoop::ProcessEventsFlags flags)
    11031097{
    1104 // @todo later
    1105 #if 0
    11061098    Q_D(QEventDispatcherPM);
    11071099
    1108     if (!d->internalHwnd)
    1109         createInternalHwnd();
     1100    if ()
     1101        ();
    11101102
    11111103    d->interrupt = false;
     
    11141106    bool canWait;
    11151107    bool retVal = false;
     1108
     1109
     1110
     1111
    11161112    do {
    11171113        QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData);
    11181114
    1119         DWORD waitRet = 0;
    1120         HANDLE pHandles[MAXIMUM_WAIT_OBJECTS - 1];
    1121         QVarLengthArray<MSG> processedTimers;
    11221115        while (!d->interrupt) {
    1123             MSG msg;
     1116            MSG msg;
    11241117            bool haveMessage;
    11251118
     
    11331126                msg = d->queuedSocketEvents.takeFirst();
    11341127            } else {
    1135                 haveMessage = winPeekMessage(&msg, 0, 0, 0, PM_REMOVE);
    1136                 if (haveMessage && (flags & QEventLoop::ExcludeUserInputEvents)
    1137                     && ((msg.message >= WM_KEYFIRST
    1138                          && msg.message <= WM_KEYLAST)
    1139                         || (msg.message >= WM_MOUSEFIRST
    1140                             && msg.message <= WM_MOUSELAST)
    1141                         || msg.message == WM_MOUSEWHEEL)) {
     1128                if (haveWaitMsg) {
     1129                    haveMessage = true;
     1130                    msg = waitMsg;
     1131                    haveWaitMsg = false;
     1132                } else {
     1133                    haveMessage = WinPeekMsg(d->hab, &msg, 0, 0, 0, PM_REMOVE) == TRUE;
     1134                }
     1135                if (haveMessage && (flags & QEventLoop::ExcludeUserInputEvents) &&
     1136                    (msg.msg == WM_CHAR ||
     1137                     (msg.msg >= WM_MOUSEFIRST &&
     1138                      msg.msg <= WM_MOUSELAST) ||
     1139                     (msg.msg >= WM_EXTMOUSEFIRST &&
     1140                      msg.msg <= WM_EXTMOUSELAST) ||
     1141                     msg.msg == WM_HSCROLL ||
     1142                     msg.msg == WM_VSCROLL)) {
    11421143                    // queue user input events for later processing
    11431144                    haveMessage = false;
     
    11451146                }
    11461147                if (haveMessage && (flags & QEventLoop::ExcludeSocketNotifiers)
    1147                     && (msg.message == WM_USER && msg.hwnd == d->internalHwnd)) {
     1148                    && (msg.m)) {
    11481149                    // queue socket events for later processing
    11491150                    haveMessage = false;
     
    11521153            }
    11531154            if (haveMessage) {
    1154                 if (msg.message == WM_TIMER) {
    1155                     // avoid live-lock by keeping track of the timers we've already sent
    1156                     bool found = false;
    1157                     for (int i = 0; !found && i < processedTimers.count(); ++i) {
    1158                         const MSG processed = processedTimers.constData()[i];
    1159                         found = (processed.wParam == msg.wParam && processed.hwnd == msg.hwnd && processed.lParam == msg.lParam);
    1160                     }
    1161                     if (found)
    1162                         continue;
    1163                     processedTimers.append(msg);
    1164                 } else if (msg.message == WM_QUIT) {
     1155                if (msg.msg == WM_QUIT) {
    11651156                    if (QCoreApplication::instance())
    11661157                        QCoreApplication::instance()->quit();
     
    11691160
    11701161                if (!filterEvent(&msg)) {
    1171                     TranslateMessage(&msg);
    1172                     QT_WA({
    1173                         DispatchMessage(&msg);
    1174                     } , {
    1175                         DispatchMessageA(&msg);
    1176                     });
     1162                    WinDispatchMsg(d->hab, &msg);
    11771163                }
    11781164            } else {
     
    11831169        }
    11841170
    1185         // still nothing - wait for message or signalled objects
     1171        // still nothing - wait for message
    11861172        QThreadData *data = d->threadData;
    11871173        canWait = (!retVal
     
    11911177        if (canWait) {
    11921178            emit aboutToBlock();
    1193             waitRet = WinGetMsg(nCount, pHandles, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE);
     1179            WinGetMsg(d->hab, &waitMsg, 0, 0, 0);
     1180            haveWaitMsg = true;
    11941181            emit awake();
    11951182        }
     
    11971184
    11981185    return retVal;
    1199 #else
    1200     return false;
    1201 #endif
    12021186}
    12031187
Note: See TracChangeset for help on using the changeset viewer.