macOS: Add categorized logging of event and notification forwarding

Useful for debugging issues in this area.

Change-Id: Ic343ef790e20b66371028265efe2ec1816c954bd
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
Tor Arne Vestbø 2017-10-25 13:05:49 +02:00
parent 3a92f7cf4f
commit f4090b23b9
2 changed files with 36 additions and 1 deletions

View File

@ -79,6 +79,8 @@ static void qt_closePopups()
}
}
Q_LOGGING_CATEGORY(lcCocoaNotifications, "qt.qpa.cocoa.notifications");
static void qRegisterNotificationCallbacks()
{
static const QLatin1String notificationHandlerPrefix(Q_NOTIFICATION_PREFIX);
@ -110,11 +112,24 @@ static void qRegisterNotificationCallbacks()
if (QNSView *qnsView = qnsview_cast(notification.object))
cocoaWindows += qnsView.platformWindow;
} else {
qCWarning(lcQpaCocoaWindow) << "Unhandled notifcation"
qCWarning(lcCocoaNotifications) << "Unhandled notifcation"
<< notification.name << "for" << notification.object;
return;
}
if (lcCocoaNotifications().isDebugEnabled()) {
if (cocoaWindows.isEmpty()) {
qCDebug(lcCocoaNotifications) << "Could not find forwarding target for" <<
qPrintable(notificationName) << "from" << notification.object;
} else {
QVector<QCocoaWindow *> debugWindows;
for (QCocoaWindow *cocoaWindow : cocoaWindows)
debugWindows += cocoaWindow;
qCDebug(lcCocoaNotifications) << "Forwarding" << qPrintable(notificationName) <<
"to" << debugWindows;
}
}
// FIXME: Could be a foreign window, look up by iterating top level QWindows
for (QCocoaWindow *cocoaWindow : cocoaWindows) {

View File

@ -46,6 +46,8 @@
#include <qpa/qwindowsysteminterface.h>
#include <qoperatingsystemversion.h>
Q_LOGGING_CATEGORY(lcCocoaEvents, "qt.qpa.cocoa.events");
static bool isMouseEvent(NSEvent *ev)
{
switch ([ev type]) {
@ -116,6 +118,22 @@ static bool isMouseEvent(NSEvent *ev)
return qnsview_cast(self.contentView).platformWindow;
}
- (NSString *)description
{
NSMutableString *description = [NSMutableString stringWithString:qt_objcDynamicSuper()];
#ifndef QT_NO_DEBUG_STREAM
QString contentViewDescription;
QDebug debug(&contentViewDescription);
debug.nospace() << "; contentView=" << qnsview_cast(self.contentView) << ">";
NSRange lastCharacter = [description rangeOfComposedCharacterSequenceAtIndex:description.length - 1];
[description replaceCharactersInRange:lastCharacter withString:contentViewDescription.toNSString()];
#endif
return description;
}
- (BOOL)canBecomeKeyWindow
{
QCocoaWindow *pw = self.platformWindow;
@ -177,6 +195,8 @@ static bool isMouseEvent(NSEvent *ev)
- (void)sendEvent:(NSEvent*)theEvent
{
qCDebug(lcCocoaEvents) << "Sending" << theEvent << "to" << self;
// We might get events for a NSWindow after the corresponding platform
// window has been deleted, as the NSWindow can outlive the QCocoaWindow
// e.g. if being retained by other parts of AppKit, or in an auto-release