diff --git a/src/gui/kernel/qeventdispatcher_mac.mm b/src/gui/kernel/qeventdispatcher_mac.mm
index 363dcb4..3e21a96 100644
--- a/src/gui/kernel/qeventdispatcher_mac.mm
+++ b/src/gui/kernel/qeventdispatcher_mac.mm
@@ -595,14 +595,12 @@ bool QEventDispatcherMac::processEvents(QEventLoop::ProcessEventsFlags flags)
                 && !d->interrupt
                 && (flags & QEventLoop::WaitForMoreEvents));
         if (canWait) {
-            emit aboutToBlock();
 #ifndef QT_MAC_USE_COCOA
             while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e20, true) == kCFRunLoopRunTimedOut);
 #else
             [NSApp run];
 #endif
             flags &= ~QEventLoop::WaitForMoreEvents;
-            emit awake();
         } else if (!d->interrupt) {
             CFRunLoopRunInMode(kCFRunLoopDefaultMode, kEventDurationNoWait, true);
             break;
@@ -682,6 +680,24 @@ QEventDispatcherMac::QEventDispatcherMac(QObject *parent)
     d->postedEventsSource = CFRunLoopSourceCreate(0, 0, &context);
     Q_ASSERT(d->postedEventsSource);
     CFRunLoopAddSource(mainRunLoop(), d->postedEventsSource, kCFRunLoopCommonModes);
+
+    CFRunLoopObserverContext observerContext;
+    bzero(&observerContext, sizeof(CFRunLoopObserverContext));
+    observerContext.info = this;
+    d->waitingObserver = CFRunLoopObserverCreate(kCFAllocatorDefault,
+                                                 kCFRunLoopBeforeWaiting | kCFRunLoopAfterWaiting,
+                                                 true, 0,
+                                                 QEventDispatcherMacPrivate::waitingObserverCallback,
+                                                 &observerContext);
+}
+
+void QEventDispatcherMacPrivate::waitingObserverCallback(CFRunLoopObserverRef,
+                                                          CFRunLoopActivity activity, void *info)
+{
+    if (activity == kCFRunLoopBeforeWaiting)
+        emit static_cast<QEventDispatcherMac*>(info)->aboutToBlock();
+    else
+        emit static_cast<QEventDispatcherMac*>(info)->awake();
 }
 
 Boolean QEventDispatcherMacPrivate::postedEventSourceEqualCallback(const void *info1, const void *info2)
@@ -751,6 +767,9 @@ QEventDispatcherMac::~QEventDispatcherMac()
     }
     CFRunLoopRemoveSource(mainRunLoop(), d->postedEventsSource, kCFRunLoopCommonModes);
     CFRelease(d->postedEventsSource);
+
+    CFRunLoopObserverInvalidate(d->waitingObserver);
+    CFRelease(d->waitingObserver);
 }
 
 
diff --git a/src/gui/kernel/qeventdispatcher_mac_p.h b/src/gui/kernel/qeventdispatcher_mac_p.h
index 9224a85..aa685f2 100644
--- a/src/gui/kernel/qeventdispatcher_mac_p.h
+++ b/src/gui/kernel/qeventdispatcher_mac_p.h
@@ -129,6 +129,7 @@ public:
     MacSocketHash macSockets;
     QList<void *> queuedUserInputEvents; // List of EventRef in Carbon, and NSEvent * in Cocoa
     CFRunLoopSourceRef postedEventsSource;
+    CFRunLoopObserverRef waitingObserver;
     QAtomicInt serialNumber;
     int lastSerial;
     bool interrupt;
@@ -136,6 +137,8 @@ private:
     static Boolean postedEventSourceEqualCallback(const void *info1, const void *info2);
     static void postedEventsSourcePerformCallback(void *info);
     static void activateTimer(CFRunLoopTimerRef, void *info);
+    static void waitingObserverCallback(CFRunLoopObserverRef observer,
+                                        CFRunLoopActivity activity, void *info);
 };
 
 QT_END_NAMESPACE
