Changeset 85 for trunk/src/corelib/kernel
- Timestamp:
- Jul 27, 2009, 7:39:55 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/corelib/kernel/qeventdispatcher_pm.cpp
r84 r85 985 985 { 986 986 public: 987 AuxWnd() : QPMObjectWindow(true /* deferred */), dispatcher(0) {} 988 void setDispatcher(QEventDispatcherPMPrivate *d) { dispatcher = d; } 987 AuxWnd() : QPMObjectWindow(true /* deferred */) {} 989 988 MRESULT message(ULONG msg, MPARAM mp1, MPARAM mp2); 990 QEventDispatcherPMPrivate *dispatcher;991 989 private: 992 990 QSet<int> timersInSend; … … 998 996 bool interrupt; 999 997 1000 // @todo later 1001 // 1002 // QList<QMSG> queuedUserInputEvents; 1003 // QList<QMSG> queuedSocketEvents; 998 QList<QMSG> queuedUserInputEvents; 999 QList<QMSG> queuedSocketEvents; 1004 1000 }; 1005 1001 … … 1011 1007 QEventDispatcherPMPrivate::~QEventDispatcherPMPrivate() 1012 1008 { 1013 auxWnd.setDispatcher(0);1014 1009 auxWnd.destroy(); 1015 1010 if (hmq != NULLHANDLE) { … … 1045 1040 if (auxWnd.hwnd() == NULLHANDLE) { 1046 1041 createMsgQueue(); 1047 auxWnd.setDispatcher(this);1048 1042 auxWnd.create(); 1049 1043 } … … 1102 1096 bool QEventDispatcherPM::processEvents(QEventLoop::ProcessEventsFlags flags) 1103 1097 { 1104 // @todo later1105 #if 01106 1098 Q_D(QEventDispatcherPM); 1107 1099 1108 if ( !d->internalHwnd)1109 createInternalHwnd();1100 if () 1101 (); 1110 1102 1111 1103 d->interrupt = false; … … 1114 1106 bool canWait; 1115 1107 bool retVal = false; 1108 1109 1110 1111 1116 1112 do { 1117 1113 QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData); 1118 1114 1119 DWORD waitRet = 0;1120 HANDLE pHandles[MAXIMUM_WAIT_OBJECTS - 1];1121 QVarLengthArray<MSG> processedTimers;1122 1115 while (!d->interrupt) { 1123 MSG msg;1116 MSG msg; 1124 1117 bool haveMessage; 1125 1118 … … 1133 1126 msg = d->queuedSocketEvents.takeFirst(); 1134 1127 } 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)) { 1142 1143 // queue user input events for later processing 1143 1144 haveMessage = false; … … 1145 1146 } 1146 1147 if (haveMessage && (flags & QEventLoop::ExcludeSocketNotifiers) 1147 && (msg.m essage == WM_USER && msg.hwnd == d->internalHwnd)) {1148 && (msg.m)) { 1148 1149 // queue socket events for later processing 1149 1150 haveMessage = false; … … 1152 1153 } 1153 1154 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) { 1165 1156 if (QCoreApplication::instance()) 1166 1157 QCoreApplication::instance()->quit(); … … 1169 1160 1170 1161 if (!filterEvent(&msg)) { 1171 TranslateMessage(&msg); 1172 QT_WA({ 1173 DispatchMessage(&msg); 1174 } , { 1175 DispatchMessageA(&msg); 1176 }); 1162 WinDispatchMsg(d->hab, &msg); 1177 1163 } 1178 1164 } else { … … 1183 1169 } 1184 1170 1185 // still nothing - wait for message or signalled objects1171 // still nothing - wait for message 1186 1172 QThreadData *data = d->threadData; 1187 1173 canWait = (!retVal … … 1191 1177 if (canWait) { 1192 1178 emit aboutToBlock(); 1193 waitRet = WinGetMsg(nCount, pHandles, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE); 1179 WinGetMsg(d->hab, &waitMsg, 0, 0, 0); 1180 haveWaitMsg = true; 1194 1181 emit awake(); 1195 1182 } … … 1197 1184 1198 1185 return retVal; 1199 #else1200 return false;1201 #endif1202 1186 } 1203 1187
Note:
See TracChangeset
for help on using the changeset viewer.