Home | History | Annotate | Download | only in web
      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 "WebInputEvent.h"
     33 #include "platform/KeyboardCodes.h"
     34 #include "wtf/Assertions.h"
     35 #include "wtf/StringExtras.h"
     36 #include <ctype.h>
     37 
     38 using namespace WebCore;
     39 
     40 namespace blink {
     41 
     42 struct SameSizeAsWebInputEvent {
     43     int inputData[5];
     44 };
     45 
     46 struct SameSizeAsWebKeyboardEvent : public SameSizeAsWebInputEvent {
     47     int keyboardData[12];
     48 };
     49 
     50 struct SameSizeAsWebMouseEvent : public SameSizeAsWebInputEvent {
     51     int mouseData[10];
     52 };
     53 
     54 struct SameSizeAsWebMouseWheelEvent : public SameSizeAsWebMouseEvent {
     55     int mousewheelData[10];
     56 };
     57 
     58 struct SameSizeAsWebGestureEvent : public SameSizeAsWebInputEvent {
     59     int gestureData[9];
     60 };
     61 
     62 struct SameSizeAsWebTouchEvent : public SameSizeAsWebInputEvent {
     63     WebTouchPoint touchPoints[3 * WebTouchEvent::touchesLengthCap];
     64     int touchData[3];
     65 };
     66 
     67 COMPILE_ASSERT(sizeof(WebInputEvent) == sizeof(SameSizeAsWebInputEvent), WebInputEvent_has_gaps);
     68 COMPILE_ASSERT(sizeof(WebKeyboardEvent) == sizeof(SameSizeAsWebKeyboardEvent), WebKeyboardEvent_has_gaps);
     69 COMPILE_ASSERT(sizeof(WebMouseEvent) == sizeof(SameSizeAsWebMouseEvent), WebMouseEvent_has_gaps);
     70 COMPILE_ASSERT(sizeof(WebMouseWheelEvent) == sizeof(SameSizeAsWebMouseWheelEvent), WebMouseWheelEvent_has_gaps);
     71 COMPILE_ASSERT(sizeof(WebGestureEvent) == sizeof(SameSizeAsWebGestureEvent), WebGestureEvent_has_gaps);
     72 COMPILE_ASSERT(sizeof(WebTouchEvent) == sizeof(SameSizeAsWebTouchEvent), WebTouchEvent_has_gaps);
     73 
     74 static const char* staticKeyIdentifiers(unsigned short keyCode)
     75 {
     76     switch (keyCode) {
     77     case VKEY_MENU:
     78         return "Alt";
     79     case VKEY_CONTROL:
     80         return "Control";
     81     case VKEY_SHIFT:
     82         return "Shift";
     83     case VKEY_CAPITAL:
     84         return "CapsLock";
     85     case VKEY_LWIN:
     86     case VKEY_RWIN:
     87         return "Win";
     88     case VKEY_CLEAR:
     89         return "Clear";
     90     case VKEY_DOWN:
     91         return "Down";
     92     case VKEY_END:
     93         return "End";
     94     case VKEY_RETURN:
     95         return "Enter";
     96     case VKEY_EXECUTE:
     97         return "Execute";
     98     case VKEY_F1:
     99         return "F1";
    100     case VKEY_F2:
    101         return "F2";
    102     case VKEY_F3:
    103         return "F3";
    104     case VKEY_F4:
    105         return "F4";
    106     case VKEY_F5:
    107         return "F5";
    108     case VKEY_F6:
    109         return "F6";
    110     case VKEY_F7:
    111         return "F7";
    112     case VKEY_F8:
    113         return "F8";
    114     case VKEY_F9:
    115         return "F9";
    116     case VKEY_F10:
    117         return "F10";
    118     case VKEY_F11:
    119         return "F11";
    120     case VKEY_F12:
    121         return "F12";
    122     case VKEY_F13:
    123         return "F13";
    124     case VKEY_F14:
    125         return "F14";
    126     case VKEY_F15:
    127         return "F15";
    128     case VKEY_F16:
    129         return "F16";
    130     case VKEY_F17:
    131         return "F17";
    132     case VKEY_F18:
    133         return "F18";
    134     case VKEY_F19:
    135         return "F19";
    136     case VKEY_F20:
    137         return "F20";
    138     case VKEY_F21:
    139         return "F21";
    140     case VKEY_F22:
    141         return "F22";
    142     case VKEY_F23:
    143         return "F23";
    144     case VKEY_F24:
    145         return "F24";
    146     case VKEY_HELP:
    147         return "Help";
    148     case VKEY_HOME:
    149         return "Home";
    150     case VKEY_INSERT:
    151         return "Insert";
    152     case VKEY_LEFT:
    153         return "Left";
    154     case VKEY_NEXT:
    155         return "PageDown";
    156     case VKEY_PRIOR:
    157         return "PageUp";
    158     case VKEY_PAUSE:
    159         return "Pause";
    160     case VKEY_SNAPSHOT:
    161         return "PrintScreen";
    162     case VKEY_RIGHT:
    163         return "Right";
    164     case VKEY_SCROLL:
    165         return "Scroll";
    166     case VKEY_SELECT:
    167         return "Select";
    168     case VKEY_UP:
    169         return "Up";
    170     case VKEY_DELETE:
    171         return "U+007F"; // Standard says that DEL becomes U+007F.
    172     case VKEY_MEDIA_NEXT_TRACK:
    173         return "MediaNextTrack";
    174     case VKEY_MEDIA_PREV_TRACK:
    175         return "MediaPreviousTrack";
    176     case VKEY_MEDIA_STOP:
    177         return "MediaStop";
    178     case VKEY_MEDIA_PLAY_PAUSE:
    179         return "MediaPlayPause";
    180     case VKEY_VOLUME_MUTE:
    181         return "VolumeMute";
    182     case VKEY_VOLUME_DOWN:
    183         return "VolumeDown";
    184     case VKEY_VOLUME_UP:
    185         return "VolumeUp";
    186     default:
    187         return 0;
    188     }
    189 }
    190 
    191 void WebKeyboardEvent::setKeyIdentifierFromWindowsKeyCode()
    192 {
    193     const char* id = staticKeyIdentifiers(windowsKeyCode);
    194     if (id) {
    195         strncpy(keyIdentifier, id, sizeof(keyIdentifier) - 1);
    196         keyIdentifier[sizeof(keyIdentifier) - 1] = '\0';
    197     } else
    198         snprintf(keyIdentifier, sizeof(keyIdentifier), "U+%04X", toupper(windowsKeyCode));
    199 }
    200 
    201 // static
    202 int WebKeyboardEvent::windowsKeyCodeWithoutLocation(int keycode)
    203 {
    204     switch (keycode) {
    205     case VK_LCONTROL:
    206     case VK_RCONTROL:
    207         return VK_CONTROL;
    208     case VK_LSHIFT:
    209     case VK_RSHIFT:
    210         return VK_SHIFT;
    211     case VK_LMENU:
    212     case VK_RMENU:
    213         return VK_MENU;
    214     default:
    215         return keycode;
    216     }
    217 }
    218 
    219 // static
    220 int WebKeyboardEvent::locationModifiersFromWindowsKeyCode(int keycode)
    221 {
    222     switch (keycode) {
    223     case VK_LCONTROL:
    224     case VK_LSHIFT:
    225     case VK_LMENU:
    226     case VK_LWIN:
    227         return IsLeft;
    228     case VK_RCONTROL:
    229     case VK_RSHIFT:
    230     case VK_RMENU:
    231     case VK_RWIN:
    232         return IsRight;
    233     default:
    234         return 0;
    235     }
    236 }
    237 
    238 } // namespace blink
    239