| /* |
| * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #import "config.h" |
| #import "PlatformKeyboardEvent.h" |
| |
| #if PLATFORM(IOS) |
| |
| #import "KeyEventCocoa.h" |
| #import "Logging.h" |
| #import "NotImplemented.h" |
| #import "WebEvent.h" |
| |
| using namespace WTF; |
| |
| namespace WebCore { |
| |
| static String keyIdentifierForKeyEvent(WebEvent *event) |
| { |
| NSString *s = event.charactersIgnoringModifiers; |
| if ([s length] != 1) { |
| LOG(Events, "received an unexpected number of characters in key event: %u", [s length]); |
| return "Unidentified"; |
| } |
| |
| unichar c = CFStringGetCharacterAtIndex((CFStringRef)s, 0); |
| return keyIdentifierForCharCode(c); |
| } |
| |
| PlatformKeyboardEvent::PlatformKeyboardEvent(WebEvent *event) |
| : PlatformEvent(event.type == WebEventKeyUp ? PlatformEvent::KeyUp : PlatformEvent::KeyDown, event.modifierFlags & WebEventFlagMaskShift, event.modifierFlags & WebEventFlagMaskControl, event.modifierFlags & WebEventFlagMaskAlternate, event.modifierFlags & WebEventFlagMaskCommand) |
| , m_text(event.characters) |
| , m_unmodifiedText(event.charactersIgnoringModifiers) |
| , m_keyIdentifier(keyIdentifierForKeyEvent(event)) |
| , m_autoRepeat(event.isKeyRepeating) |
| , m_windowsVirtualKeyCode(event.keyCode) |
| , m_isKeypad(false) // iPhone does not distinguish the numpad <rdar://problem/7190835> |
| , m_Event(event) |
| { |
| ASSERT(event.type == WebEventKeyDown || event.type == WebEventKeyUp); |
| |
| // Always use 13 for Enter/Return -- we don't want to use AppKit's different character for Enter. |
| if (m_windowsVirtualKeyCode == '\r') { |
| m_text = "\r"; |
| m_unmodifiedText = "\r"; |
| } |
| |
| // The adjustments below are only needed in backward compatibility mode, but we cannot tell what mode we are in from here. |
| |
| // Turn 0x7F into 8, because backspace needs to always be 8. |
| if (m_text == "\x7F") |
| m_text = "\x8"; |
| if (m_unmodifiedText == "\x7F") |
| m_unmodifiedText = "\x8"; |
| // Always use 9 for tab -- we don't want to use AppKit's different character for shift-tab. |
| if (m_windowsVirtualKeyCode == 9) { |
| m_text = "\x9"; |
| m_unmodifiedText = "\x9"; |
| } |
| } |
| |
| void PlatformKeyboardEvent::disambiguateKeyDownEvent(Type type, bool backwardCompatibilityMode) |
| { |
| // Can only change type from KeyDown to RawKeyDown or Char, as we lack information for other conversions. |
| ASSERT(m_type == KeyDown); |
| ASSERT(type == RawKeyDown || type == Char); |
| m_type = type; |
| if (backwardCompatibilityMode) |
| return; |
| |
| if (type == PlatformEvent::RawKeyDown) { |
| m_text = String(); |
| m_unmodifiedText = String(); |
| } else { |
| m_keyIdentifier = String(); |
| m_windowsVirtualKeyCode = 0; |
| if (m_text.length() == 1 && (m_text[0U] >= 0xF700 && m_text[0U] <= 0xF7FF)) { |
| // According to NSEvents.h, OpenStep reserves the range 0xF700-0xF8FF for function keys. However, some actual private use characters |
| // happen to be in this range, e.g. the Apple logo (Option+Shift+K). |
| // 0xF7FF is an arbitrary cut-off. |
| m_text = String(); |
| m_unmodifiedText = String(); |
| } |
| } |
| } |
| |
| bool PlatformKeyboardEvent::currentCapsLockState() |
| { |
| notImplemented(); |
| return false; |
| } |
| |
| void PlatformKeyboardEvent::getCurrentModifierState(bool& shiftKey, bool& ctrlKey, bool& altKey, bool& metaKey) |
| { |
| notImplemented(); |
| shiftKey = false; |
| ctrlKey = false; |
| altKey = false; |
| metaKey = false; |
| } |
| |
| } |
| |
| #endif // PLATFORM(IOS) |