summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/android/KeyEventAndroid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/android/KeyEventAndroid.cpp')
-rw-r--r--Source/WebCore/platform/android/KeyEventAndroid.cpp281
1 files changed, 281 insertions, 0 deletions
diff --git a/Source/WebCore/platform/android/KeyEventAndroid.cpp b/Source/WebCore/platform/android/KeyEventAndroid.cpp
new file mode 100644
index 0000000..eaf34a9
--- /dev/null
+++ b/Source/WebCore/platform/android/KeyEventAndroid.cpp
@@ -0,0 +1,281 @@
+/*
+ * Copyright 2007, The Android Open Source Project
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ * Copyright (C) 2008 Collabora, Ltd. All rights reserved.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 THE COPYRIGHT HOLDERS ``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.
+ */
+
+#include "config.h"
+#include "PlatformKeyboardEvent.h"
+
+#include "NotImplemented.h"
+#include "WindowsKeyboardCodes.h"
+#include <ui/KeycodeLabels.h>
+
+namespace WebCore {
+
+// compare to same function in gdk/KeyEventGdk.cpp
+static int windowsKeyCodeForKeyEvent(unsigned int keyCode)
+{
+ // Does not provide all key codes, and does not handle all keys.
+ switch (keyCode) {
+ case AKEYCODE_DEL:
+ return VK_BACK;
+ case AKEYCODE_TAB:
+ return VK_TAB;
+ case AKEYCODE_CLEAR:
+ return VK_CLEAR;
+ case AKEYCODE_DPAD_CENTER:
+ case AKEYCODE_ENTER:
+ return VK_RETURN;
+ case AKEYCODE_SHIFT_LEFT:
+ case AKEYCODE_SHIFT_RIGHT:
+ return VK_SHIFT;
+ // back will serve as escape, although we probably do not have access to it
+ case AKEYCODE_BACK:
+ return VK_ESCAPE;
+ case AKEYCODE_SPACE:
+ return VK_SPACE;
+ case AKEYCODE_HOME:
+ return VK_HOME;
+ case AKEYCODE_DPAD_LEFT:
+ return VK_LEFT;
+ case AKEYCODE_DPAD_UP:
+ return VK_UP;
+ case AKEYCODE_DPAD_RIGHT:
+ return VK_RIGHT;
+ case AKEYCODE_DPAD_DOWN:
+ return VK_DOWN;
+ case AKEYCODE_0:
+ return VK_0;
+ case AKEYCODE_1:
+ return VK_1;
+ case AKEYCODE_2:
+ return VK_2;
+ case AKEYCODE_3:
+ return VK_3;
+ case AKEYCODE_4:
+ return VK_4;
+ case AKEYCODE_5:
+ return VK_5;
+ case AKEYCODE_6:
+ return VK_6;
+ case AKEYCODE_7:
+ return VK_7;
+ case AKEYCODE_8:
+ return VK_8;
+ case AKEYCODE_9:
+ return VK_9;
+ case AKEYCODE_A:
+ return VK_A;
+ case AKEYCODE_B:
+ return VK_B;
+ case AKEYCODE_C:
+ return VK_C;
+ case AKEYCODE_D:
+ return VK_D;
+ case AKEYCODE_E:
+ return VK_E;
+ case AKEYCODE_F:
+ return VK_F;
+ case AKEYCODE_G:
+ return VK_G;
+ case AKEYCODE_H:
+ return VK_H;
+ case AKEYCODE_I:
+ return VK_I;
+ case AKEYCODE_J:
+ return VK_J;
+ case AKEYCODE_K:
+ return VK_K;
+ case AKEYCODE_L:
+ return VK_L;
+ case AKEYCODE_M:
+ return VK_M;
+ case AKEYCODE_N:
+ return VK_N;
+ case AKEYCODE_O:
+ return VK_O;
+ case AKEYCODE_P:
+ return VK_P;
+ case AKEYCODE_Q:
+ return VK_Q;
+ case AKEYCODE_R:
+ return VK_R;
+ case AKEYCODE_S:
+ return VK_S;
+ case AKEYCODE_T:
+ return VK_T;
+ case AKEYCODE_U:
+ return VK_U;
+ case AKEYCODE_V:
+ return VK_V;
+ case AKEYCODE_W:
+ return VK_W;
+ case AKEYCODE_X:
+ return VK_X;
+ case AKEYCODE_Y:
+ return VK_Y;
+ case AKEYCODE_Z:
+ return VK_Z;
+ // colon
+ case AKEYCODE_SEMICOLON:
+ return VK_OEM_1;
+ case AKEYCODE_COMMA:
+ return VK_OEM_COMMA;
+ case AKEYCODE_MINUS:
+ return VK_OEM_MINUS;
+ case AKEYCODE_EQUALS:
+ return VK_OEM_PLUS;
+ case AKEYCODE_PERIOD:
+ return VK_OEM_PERIOD;
+ case AKEYCODE_SLASH:
+ return VK_OEM_2;
+ // maybe not the right choice
+ case AKEYCODE_LEFT_BRACKET:
+ return VK_OEM_4;
+ case AKEYCODE_BACKSLASH:
+ return VK_OEM_5;
+ case AKEYCODE_RIGHT_BRACKET:
+ return VK_OEM_6;
+ default:
+ return 0;
+ }
+}
+
+static String keyIdentifierForAndroidKeyCode(int keyCode)
+{
+ // Does not return all of the same key identifiers, and
+ // does not handle all the keys.
+ switch (keyCode) {
+ case AKEYCODE_CLEAR:
+ return "Clear";
+ case AKEYCODE_ENTER:
+ case AKEYCODE_DPAD_CENTER:
+ return "Enter";
+ case AKEYCODE_HOME:
+ return "Home";
+ case AKEYCODE_DPAD_DOWN:
+ return "Down";
+ case AKEYCODE_DPAD_LEFT:
+ return "Left";
+ case AKEYCODE_DPAD_RIGHT:
+ return "Right";
+ case AKEYCODE_DPAD_UP:
+ return "Up";
+ // Standard says that DEL becomes U+00007F.
+ case AKEYCODE_DEL:
+ return "U+00007F";
+ default:
+ char upper[16];
+ sprintf(upper, "U+%06X", windowsKeyCodeForKeyEvent(keyCode));
+ return String(upper);
+ }
+}
+
+static inline String singleCharacterString(UChar32 c)
+{
+ if (!c)
+ return String();
+ if (c > 0xffff) {
+ UChar lead = U16_LEAD(c);
+ UChar trail = U16_TRAIL(c);
+ UChar utf16[2] = {lead, trail};
+ return String(utf16, 2);
+ }
+ UChar n = (UChar)c;
+ return String(&n, 1);
+}
+
+PlatformKeyboardEvent::PlatformKeyboardEvent(int keyCode, UChar32 unichar,
+ int repeatCount, bool down, bool cap, bool alt, bool sym)
+ : m_type(down ? KeyDown : KeyUp)
+ , m_text(singleCharacterString(unichar))
+ , m_unmodifiedText(singleCharacterString(unichar))
+ , m_keyIdentifier(keyIdentifierForAndroidKeyCode(keyCode))
+ , m_autoRepeat(repeatCount > 0)
+ , m_windowsVirtualKeyCode(windowsKeyCodeForKeyEvent(keyCode))
+ , m_nativeVirtualKeyCode(keyCode)
+ , m_isKeypad(false)
+ , m_shiftKey(cap ? ShiftKey : 0)
+ , m_ctrlKey(sym ? CtrlKey : 0)
+ , m_altKey(alt ? AltKey : 0)
+ , m_metaKey(0)
+ // added for android
+ , m_repeatCount(repeatCount)
+ , m_unichar(unichar)
+{
+ // Copied from the mac port
+ if (m_windowsVirtualKeyCode == '\r') {
+ m_text = "\r";
+ m_unmodifiedText = "\r";
+ }
+
+ if (m_text == "\x7F")
+ m_text = "\x8";
+ if (m_unmodifiedText == "\x7F")
+ m_unmodifiedText = "\x8";
+
+ if (m_windowsVirtualKeyCode == 9) {
+ m_text = "\x9";
+ m_unmodifiedText = "\x9";
+ }
+}
+
+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;
+}
+
+void PlatformKeyboardEvent::disambiguateKeyDownEvent(Type type, bool backwardCompatibilityMode)
+{
+ // Copied with modification from the mac port.
+ ASSERT(m_type == KeyDown);
+ ASSERT(type == RawKeyDown || type == Char);
+ m_type = type;
+ if (backwardCompatibilityMode)
+ return;
+
+ if (type == RawKeyDown) {
+ m_text = String();
+ m_unmodifiedText = String();
+ } else {
+ m_keyIdentifier = String();
+ m_windowsVirtualKeyCode = 0;
+ }
+}
+
+} // namespace WebCore