• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2009 Google 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 are
6   * met:
7   *
8   *     * Redistributions of source code must retain the above copyright
9   * notice, this list of conditions and the following disclaimer.
10   *     * Redistributions in binary form must reproduce the above
11   * copyright notice, this list of conditions and the following disclaimer
12   * in the documentation and/or other materials provided with the
13   * distribution.
14   *     * Neither the name of Google Inc. nor the names of its
15   * contributors may be used to endorse or promote products derived from
16   * this software without specific prior written permission.
17   *
18   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22   * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29   */
30  
31  #include "config.h"
32  #include "public/web/WebInputEvent.h"
33  
34  #include "platform/KeyboardCodes.h"
35  #include "wtf/Assertions.h"
36  #include "wtf/StringExtras.h"
37  #include <ctype.h>
38  
39  namespace blink {
40  
41  struct SameSizeAsWebInputEvent {
42      int inputData[5];
43  };
44  
45  struct SameSizeAsWebKeyboardEvent : public SameSizeAsWebInputEvent {
46      int keyboardData[12];
47  };
48  
49  struct SameSizeAsWebMouseEvent : public SameSizeAsWebInputEvent {
50      int mouseData[10];
51  };
52  
53  struct SameSizeAsWebMouseWheelEvent : public SameSizeAsWebMouseEvent {
54      int mousewheelData[12];
55  };
56  
57  struct SameSizeAsWebGestureEvent : public SameSizeAsWebInputEvent {
58      int gestureData[9];
59  };
60  
61  struct SameSizeAsWebTouchEvent : public SameSizeAsWebInputEvent {
62      WebTouchPoint touchPoints[WebTouchEvent::touchesLengthCap];
63      int touchData[2];
64  };
65  
66  COMPILE_ASSERT(sizeof(WebInputEvent) == sizeof(SameSizeAsWebInputEvent), WebInputEvent_has_gaps);
67  COMPILE_ASSERT(sizeof(WebKeyboardEvent) == sizeof(SameSizeAsWebKeyboardEvent), WebKeyboardEvent_has_gaps);
68  COMPILE_ASSERT(sizeof(WebMouseEvent) == sizeof(SameSizeAsWebMouseEvent), WebMouseEvent_has_gaps);
69  COMPILE_ASSERT(sizeof(WebMouseWheelEvent) == sizeof(SameSizeAsWebMouseWheelEvent), WebMouseWheelEvent_has_gaps);
70  COMPILE_ASSERT(sizeof(WebGestureEvent) == sizeof(SameSizeAsWebGestureEvent), WebGestureEvent_has_gaps);
71  COMPILE_ASSERT(sizeof(WebTouchEvent) == sizeof(SameSizeAsWebTouchEvent), WebTouchEvent_has_gaps);
72  
staticKeyIdentifiers(unsigned short keyCode)73  static const char* staticKeyIdentifiers(unsigned short keyCode)
74  {
75      switch (keyCode) {
76      case VKEY_MENU:
77          return "Alt";
78      case VKEY_CONTROL:
79          return "Control";
80      case VKEY_SHIFT:
81          return "Shift";
82      case VKEY_CAPITAL:
83          return "CapsLock";
84      case VKEY_LWIN:
85      case VKEY_RWIN:
86          return "Win";
87      case VKEY_CLEAR:
88          return "Clear";
89      case VKEY_DOWN:
90          return "Down";
91      case VKEY_END:
92          return "End";
93      case VKEY_RETURN:
94          return "Enter";
95      case VKEY_EXECUTE:
96          return "Execute";
97      case VKEY_F1:
98          return "F1";
99      case VKEY_F2:
100          return "F2";
101      case VKEY_F3:
102          return "F3";
103      case VKEY_F4:
104          return "F4";
105      case VKEY_F5:
106          return "F5";
107      case VKEY_F6:
108          return "F6";
109      case VKEY_F7:
110          return "F7";
111      case VKEY_F8:
112          return "F8";
113      case VKEY_F9:
114          return "F9";
115      case VKEY_F10:
116          return "F10";
117      case VKEY_F11:
118          return "F11";
119      case VKEY_F12:
120          return "F12";
121      case VKEY_F13:
122          return "F13";
123      case VKEY_F14:
124          return "F14";
125      case VKEY_F15:
126          return "F15";
127      case VKEY_F16:
128          return "F16";
129      case VKEY_F17:
130          return "F17";
131      case VKEY_F18:
132          return "F18";
133      case VKEY_F19:
134          return "F19";
135      case VKEY_F20:
136          return "F20";
137      case VKEY_F21:
138          return "F21";
139      case VKEY_F22:
140          return "F22";
141      case VKEY_F23:
142          return "F23";
143      case VKEY_F24:
144          return "F24";
145      case VKEY_HELP:
146          return "Help";
147      case VKEY_HOME:
148          return "Home";
149      case VKEY_INSERT:
150          return "Insert";
151      case VKEY_LEFT:
152          return "Left";
153      case VKEY_NEXT:
154          return "PageDown";
155      case VKEY_PRIOR:
156          return "PageUp";
157      case VKEY_PAUSE:
158          return "Pause";
159      case VKEY_SNAPSHOT:
160          return "PrintScreen";
161      case VKEY_RIGHT:
162          return "Right";
163      case VKEY_SCROLL:
164          return "Scroll";
165      case VKEY_SELECT:
166          return "Select";
167      case VKEY_UP:
168          return "Up";
169      case VKEY_DELETE:
170          return "U+007F"; // Standard says that DEL becomes U+007F.
171      case VKEY_MEDIA_NEXT_TRACK:
172          return "MediaNextTrack";
173      case VKEY_MEDIA_PREV_TRACK:
174          return "MediaPreviousTrack";
175      case VKEY_MEDIA_STOP:
176          return "MediaStop";
177      case VKEY_MEDIA_PLAY_PAUSE:
178          return "MediaPlayPause";
179      case VKEY_VOLUME_MUTE:
180          return "VolumeMute";
181      case VKEY_VOLUME_DOWN:
182          return "VolumeDown";
183      case VKEY_VOLUME_UP:
184          return "VolumeUp";
185      default:
186          return 0;
187      }
188  }
189  
setKeyIdentifierFromWindowsKeyCode()190  void WebKeyboardEvent::setKeyIdentifierFromWindowsKeyCode()
191  {
192      const char* id = staticKeyIdentifiers(windowsKeyCode);
193      if (id) {
194          strncpy(keyIdentifier, id, sizeof(keyIdentifier) - 1);
195          keyIdentifier[sizeof(keyIdentifier) - 1] = '\0';
196      } else
197          snprintf(keyIdentifier, sizeof(keyIdentifier), "U+%04X", toupper(windowsKeyCode));
198  }
199  
200  // static
windowsKeyCodeWithoutLocation(int keycode)201  int WebKeyboardEvent::windowsKeyCodeWithoutLocation(int keycode)
202  {
203      switch (keycode) {
204      case VK_LCONTROL:
205      case VK_RCONTROL:
206          return VK_CONTROL;
207      case VK_LSHIFT:
208      case VK_RSHIFT:
209          return VK_SHIFT;
210      case VK_LMENU:
211      case VK_RMENU:
212          return VK_MENU;
213      default:
214          return keycode;
215      }
216  }
217  
218  // static
locationModifiersFromWindowsKeyCode(int keycode)219  int WebKeyboardEvent::locationModifiersFromWindowsKeyCode(int keycode)
220  {
221      switch (keycode) {
222      case VK_LCONTROL:
223      case VK_LSHIFT:
224      case VK_LMENU:
225      case VK_LWIN:
226          return IsLeft;
227      case VK_RCONTROL:
228      case VK_RSHIFT:
229      case VK_RMENU:
230      case VK_RWIN:
231          return IsRight;
232      default:
233          return 0;
234      }
235  }
236  
237  } // namespace blink
238