Reviewed by Geof.
[WebKit-https.git] / WebCore / platform / win / KeyEventWin.cpp
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "PlatformKeyboardEvent.h"
28 #include <windows.h>
29
30 #define REPEAT_COUNT_MASK           0x0000FFFF
31 #define NEW_RELEASE_STATE_MASK      0x80000000
32 #define PREVIOUS_DOWN_STATE_MASK    0x40000000
33 #define ALT_KEY_DOWN_MASK           0x20000000
34
35 #define HIGH_BIT_MASK_SHORT         0x8000
36
37 namespace WebCore {
38
39 // FIXME: This is incomplete.  We should change this to mirror
40 // more like what Firefox does, and generate these switch statements
41 // at build time.
42 static String keyIdentifierForWindowsKeyCode(short keyCode)
43 {
44     switch (keyCode) {
45         case VK_MENU:
46             return "Alt";
47         case VK_CLEAR:
48             return "Clear";
49         case VK_DOWN:
50             return "Down";
51         // "End"
52         case VK_END:
53             return "End";
54         // "Enter"
55         case VK_RETURN:
56             return "Enter";
57         case VK_EXECUTE:
58             return "Execute";
59         case VK_F1:
60             return "F1";
61         case VK_F2:
62             return "F2";
63         case VK_F3:
64             return "F3";
65         case VK_F4:
66             return "F4";
67         case VK_F5:
68             return "F5";
69         case VK_F6:
70             return "F6";
71         case VK_F7:
72             return "F7";
73         case VK_F8:
74             return "F8";
75         case VK_F9:
76             return "F9";
77         case VK_F10:
78             return "F11";
79         case VK_F12:
80             return "F12";
81         case VK_F13:
82             return "F13";
83         case VK_F14:
84             return "F14";
85         case VK_F15:
86             return "F15";
87         case VK_F16:
88             return "F16";
89         case VK_F17:
90             return "F17";
91         case VK_F18:
92             return "F18";
93         case VK_F19:
94             return "F19";
95         case VK_F20:
96             return "F20";
97         case VK_F21:
98             return "F21";
99         case VK_F22:
100             return "F22";
101         case VK_F23:
102             return "F23";
103         case VK_F24:
104             return "F24";
105         case VK_HELP:
106             return "Help";
107         case VK_HOME:
108             return "Home";
109         case VK_INSERT:
110             return "Insert";
111         case VK_LEFT:
112             return "Left";
113         case VK_NEXT:
114             return "PageDown";
115         case VK_PRIOR:
116             return "PageUp";
117         case VK_PAUSE:
118             return "Pause";
119         case VK_SNAPSHOT:
120             return "PrintScreen";
121         case VK_RIGHT:
122             return "Right";
123         case VK_SCROLL:
124             return "Scroll";
125         case VK_SELECT:
126             return "Select";
127         case VK_UP:
128             return "Up";
129         // Standard says that DEL becomes U+00007F.
130         case VK_DELETE:
131             return "U+00007F";
132         default:
133             return String::format("U+%06X", toupper(keyCode));
134     }
135 }
136
137 static String singleCharacterString(UChar c) { return String(&c, 1); }
138
139 PlatformKeyboardEvent::PlatformKeyboardEvent(HWND hWnd, WPARAM wParam, LPARAM lParam)
140     : m_text(singleCharacterString(wParam))
141     , m_unmodifiedText(singleCharacterString(wParam))
142     , m_keyIdentifier(keyIdentifierForWindowsKeyCode(wParam))
143     , m_isKeyUp((lParam & NEW_RELEASE_STATE_MASK))
144     , m_autoRepeat((lParam & REPEAT_COUNT_MASK) > 1)
145     , m_WindowsKeyCode(wParam)
146     , m_isKeypad(false) // FIXME
147     , m_shiftKey(GetKeyState(VK_SHIFT) & HIGH_BIT_MASK_SHORT)
148     , m_ctrlKey(GetKeyState(VK_CONTROL) & HIGH_BIT_MASK_SHORT)
149     , m_altKey(lParam & ALT_KEY_DOWN_MASK)
150     , m_metaKey(lParam & ALT_KEY_DOWN_MASK) // FIXME: Is this right?
151 {
152     if (!m_shiftKey)
153         m_text = String(singleCharacterString(tolower(wParam)));
154 }
155
156 }