--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm 2016-03-22 05:31:40.000000000 0100 +++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm 2016-03-22 05:31:40.000000000 0100 @@ -473,27 +473,34 @@ } } } while (!d->interrupt && event != nil); - } else do { - // INVARIANT: No modal window is executing. - event = [NSApp nextEventMatchingMask:NSAnyEventMask - untilDate:nil - inMode:NSDefaultRunLoopMode - dequeue: YES]; + } else { + bool mouseDownEventFound = false; + do { + // INVARIANT: No modal window is executing. + event = [NSApp nextEventMatchingMask:NSAnyEventMask + untilDate:nil + inMode:NSDefaultRunLoopMode + dequeue: YES]; - if (event) { - if (flags & QEventLoop::ExcludeUserInputEvents) { - if (IsMouseOrKeyEvent(event)) { - [event retain]; - d->queuedUserInputEvents.append(event); - continue; + if (event) { + if (flags & QEventLoop::ExcludeUserInputEvents) { + // Workaround for QTBUG-53126 + // Process (and not queue) NSLeftMouseUp event if there is no NSLeftMouseDown + // even if we are in excludeUserEvents mode + if ([event type] == NSLeftMouseDown) mouseDownEventFound = true; + if (IsMouseOrKeyEvent(event) && (mouseDownEventFound || ([event type] != NSLeftMouseUp) ) ) { + [event retain]; + d->queuedUserInputEvents.append(event); + continue; + } + } + if (!filterNativeEvent("NSEvent", event, 0)) { + [NSApp sendEvent:event]; + retVal = true; } } - if (!filterNativeEvent("NSEvent", event, 0)) { - [NSApp sendEvent:event]; - retVal = true; - } - } - } while (!d->interrupt && event != nil); + } while (!d->interrupt && event != nil); + } if ((d->processEventsFlags & QEventLoop::EventLoopExec) == 0) { // when called "manually", always send posted events and timers