diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j index 75206a02c..3bc21844b 100644 --- a/AppKit/CPButton.j +++ b/AppKit/CPButton.j @@ -569,9 +569,25 @@ CPButtonStateMixed = CPThemeState("mixed"); */ - (void)setKeyEquivalent:(CPString)aString { + // Check if the key equivalent is the enter key + // Treat \r and \n as the same key equivalent. See issue #710. + if (aString === CPNewlineCharacter || aString === CPCarriageReturnCharacter) + [[self window] setDefaultButton:self]; + else if ([[self window] defaultButton] === self) + [[self window] setDefaultButton:NO]; + _keyEquivalent = aString || @""; } +- (void)viewWillMoveToWindow:(CPWindow)aWindow +{ + if ([[self window] defaultButton] === self) + [[self window] setDefaultButton:nil]; + + if ([self keyEquivalent] === CPNewlineCharacter || [self keyEquivalent] === CPCarriageReturnCharacter) + [aWindow setDefaultButton:self]; +} + /*! Returns the keyboard shortcut for this button. */ @@ -602,6 +618,10 @@ CPButtonStateMixed = CPThemeState("mixed"); */ - (BOOL)performKeyEquivalent:(CPEvent)anEvent { + // Don't handle the key equivalent for the default window because the window will handle it for us + if ([[self window] defaultButton] === self) + return NO; + if (![anEvent _triggersKeyEquivalent:[self keyEquivalent] withModifierMask:[self keyEquivalentModifierMask]]) return NO; diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 41e410a4b..effa1788c 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -1377,7 +1377,15 @@ CPTexturedBackgroundWindowMask switch (type) { case CPKeyUp: return [[self firstResponder] keyUp:anEvent]; - case CPKeyDown: return [[self firstResponder] keyDown:anEvent]; + + case CPKeyDown: [[self firstResponder] keyDown:anEvent]; + + // Trigger the default button if needed + if (![self disableKeyEquivalentForDefaultButton]) + if ([anEvent _triggersKeyEquivalent:[[self defaultButton] keyEquivalent] withModifierMask:[[self defaultButton] keyEquivalentModifierMask]]) + [[self defaultButton] performClick:self]; + + return; case CPScrollWheel: return [[_windowView hitTest:point] scrollWheel:anEvent]; @@ -2250,7 +2258,7 @@ CPTexturedBackgroundWindowMask return NO; } -- (void)performKeyEquivalent:(CPEvent)anEvent +- (BOOL)performKeyEquivalent:(CPEvent)anEvent { // FIXME: should we be starting at the root, in other words _windowView? // The evidence seems to point to no... @@ -2261,14 +2269,11 @@ CPTexturedBackgroundWindowMask { // It's not clear why we do performKeyEquivalent again here... // Perhaps to allow something to happen between sendEvent: and keyDown:? - if (![anEvent _couldBeKeyEquivalent] || ![self performKeyEquivalent:anEvent]) - [self interpretKeyEvents:[anEvent]]; -} + if ([anEvent _couldBeKeyEquivalent] && [self performKeyEquivalent:anEvent]) + return; -- (void)insertNewline:(id)sender -{ - if (_defaultButton && _defaultButtonEnabled) - [_defaultButton performClick:nil]; + // Interpret the key events + [self interpretKeyEvents:[anEvent]]; } - (void)insertTab:(id)sender @@ -2381,10 +2386,11 @@ CPTexturedBackgroundWindowMask - (void)setDefaultButton:(CPButton)aButton { + if (_defaultButton === aButton) + return; + [_defaultButton setDefaultButton:NO]; - _defaultButton = aButton; - [_defaultButton setDefaultButton:YES]; }