The combination CTRL + Tab is specially handled by OSX/Cocoa text input method. At least two solutions exists([here](https://bugreports.qt.io/browse/QTBUG-8596?focusedCommentId=321526&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-321526) and (there)[https://codereview.qt-project.org/#/c/161214/1/src/plugins/platforms/cocoa/qnsview.mm]). However, the first one use a private/undocumented API. The second is then used.

This commit is contained in:
Arnaud Barré 2018-10-18 21:32:04 -04:00
parent 5afcd0981b
commit 97db21f206

View File

@ -643,6 +643,36 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
[super updateTrackingAreas];
}
- (BOOL)performKeyEquivalent:(NSEvent *)nsevent
{
// At the moment the only reason we define this method
// is Ctrl-tab key event never reaching any view at all.
// After -performKeyEquivalent: returns NO on all responders,
// we receve Ctrl-tab in our QNSWindow's -sendEvent:,
// but somehow it never reaches QNSView's -keyDown:.
// Apparently, it's treated in a special (and undocumented)
// way by Cocoa. 'Illegal' but really nice, clear and safe solution
// would be to define _wantsKeyDownForEvent, but it's a
// private/undocumented API.
if ([[self window] firstResponder] == self)
{
const NSUInteger modifierFlags = [nsevent modifierFlags];
NSString *chs = [nsevent charactersIgnoringModifiers];
if (modifierFlags & NSControlKeyMask)
{
if ([chs characterAtIndex:0] == NSTabCharacter)
{
if (![[NSApp mainMenu] performKeyEquivalent:nsevent])
{
[self keyDown:nsevent];
}
return YES;
}
}
}
return NO;
}
- (void)keyDown:(NSEvent *)event
{
const int key = translateKey([event keyCode]);