Home | History | Annotate | Download | only in efl
      1 /*
      2  * Copyright (C) 2006 Nikolas Zimmermann <zimmermann (at) kde.org>
      3  * Copyright (C) 2008 Diego Hidalgo C. Gonzalez
      4  * Copyright (C) 2009-2010 ProFUSION embedded systems
      5  * Copyright (C) 2009-2010 Samsung Electronics
      6  *
      7  * All rights reserved.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     21  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     26  * 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 
     33 #include "PlatformKeyboardEvent.h"
     34 
     35 #include "NotImplemented.h"
     36 #include "TextEncoding.h"
     37 #include "WindowsKeyboardCodes.h"
     38 
     39 #include <Evas.h>
     40 #include <stdio.h>
     41 #include <wtf/HashMap.h>
     42 #include <wtf/text/StringConcatenate.h>
     43 #include <wtf/text/StringHash.h>
     44 
     45 namespace WebCore {
     46 
     47 typedef HashMap<String, String> KeyMap;
     48 typedef HashMap<String, int> WindowsKeyMap;
     49 
     50 static KeyMap gKeyMap;
     51 static WindowsKeyMap gWindowsKeyMap;
     52 
     53 static void createKeyMap()
     54 {
     55     for (unsigned int i = 1; i < 25; i++) {
     56         String key = makeString('F', String::number(i));
     57         gKeyMap.set(key, key);
     58     }
     59     gKeyMap.set("Alt_L", "Alt");
     60     gKeyMap.set("ISO_Level3_Shift", "Alt");
     61     gKeyMap.set("Menu", "Alt");
     62     gKeyMap.set("Shift_L", "Shift");
     63     gKeyMap.set("Shift_R", "Shift");
     64     gKeyMap.set("Down", "Down");
     65     gKeyMap.set("End", "End");
     66     gKeyMap.set("Return", "Enter");
     67     gKeyMap.set("KP_Enter", "Enter");
     68     gKeyMap.set("Home", "Home");
     69     gKeyMap.set("Insert", "Insert");
     70     gKeyMap.set("Left", "Left");
     71     gKeyMap.set("Down", "Down");
     72     gKeyMap.set("Next", "PageDown");
     73     gKeyMap.set("Prior", "PageUp");
     74     gKeyMap.set("Right", "Right");
     75     gKeyMap.set("Up", "Up");
     76     gKeyMap.set("Delete", "U+007F");
     77     gKeyMap.set("Tab", "U+0009");
     78     gKeyMap.set("ISO_Left_Tab", "U+0009");
     79 }
     80 
     81 static void createWindowsKeyMap()
     82 {
     83     gWindowsKeyMap.set("Return",     VK_RETURN);
     84     gWindowsKeyMap.set("KP_Return",  VK_RETURN);
     85     gWindowsKeyMap.set("Alt_L",      VK_MENU);
     86     gWindowsKeyMap.set("ISO_Level3_Shift", VK_MENU);
     87     gWindowsKeyMap.set("Menu",       VK_MENU);
     88     gWindowsKeyMap.set("Shift_L",    VK_SHIFT);
     89     gWindowsKeyMap.set("Shift_R",    VK_SHIFT);
     90     gWindowsKeyMap.set("Control_L",  VK_CONTROL);
     91     gWindowsKeyMap.set("Control_R",  VK_CONTROL);
     92     gWindowsKeyMap.set("Pause",      VK_PAUSE);
     93     gWindowsKeyMap.set("Break",      VK_PAUSE);
     94     gWindowsKeyMap.set("Caps_Lock",  VK_CAPITAL);
     95     gWindowsKeyMap.set("Scroll_Lock", VK_SCROLL);
     96     gWindowsKeyMap.set("Num_Lock",   VK_NUMLOCK);
     97     gWindowsKeyMap.set("Escape",     VK_ESCAPE);
     98     gWindowsKeyMap.set("Tab",        VK_TAB);
     99     gWindowsKeyMap.set("ISO_Left_Tab", VK_TAB);
    100     gWindowsKeyMap.set("BackSpace",  VK_BACK);
    101     gWindowsKeyMap.set("Space",      VK_SPACE);
    102     gWindowsKeyMap.set("Next",       VK_NEXT);
    103     gWindowsKeyMap.set("Prior",      VK_PRIOR);
    104     gWindowsKeyMap.set("Home",       VK_HOME);
    105     gWindowsKeyMap.set("End",        VK_END);
    106     gWindowsKeyMap.set("Right",      VK_RIGHT);
    107     gWindowsKeyMap.set("Left",       VK_LEFT);
    108     gWindowsKeyMap.set("Up",         VK_UP);
    109     gWindowsKeyMap.set("Down",       VK_DOWN);
    110     gWindowsKeyMap.set("Print",      VK_PRINT);
    111     gWindowsKeyMap.set("Insert",     VK_INSERT);
    112     gWindowsKeyMap.set("Delete",     VK_DELETE);
    113 
    114     gWindowsKeyMap.set("comma",        VK_OEM_COMMA);
    115     gWindowsKeyMap.set("less",         VK_OEM_COMMA);
    116     gWindowsKeyMap.set("period",       VK_OEM_PERIOD);
    117     gWindowsKeyMap.set("greater",      VK_OEM_PERIOD);
    118     gWindowsKeyMap.set("semicolon",    VK_OEM_1);
    119     gWindowsKeyMap.set("colon",        VK_OEM_1);
    120     gWindowsKeyMap.set("slash",        VK_OEM_2);
    121     gWindowsKeyMap.set("question",     VK_OEM_2);
    122     gWindowsKeyMap.set("grave",        VK_OEM_3);
    123     gWindowsKeyMap.set("asciitilde",   VK_OEM_3);
    124     gWindowsKeyMap.set("bracketleft",  VK_OEM_4);
    125     gWindowsKeyMap.set("braceleft",    VK_OEM_4);
    126     gWindowsKeyMap.set("backslash",    VK_OEM_5);
    127     gWindowsKeyMap.set("bar",          VK_OEM_5);
    128     gWindowsKeyMap.set("bracketright", VK_OEM_6);
    129     gWindowsKeyMap.set("braceright",   VK_OEM_6);
    130     gWindowsKeyMap.set("apostrophe",   VK_OEM_7);
    131     gWindowsKeyMap.set("quotedbl",     VK_OEM_7);
    132 
    133     // Alphabet
    134     const char* alphabet = "abcdefghijklmnopqrstuvwxyz";
    135     for (unsigned int i = 0; i < 26; i++) {
    136         String key(alphabet + i, 1);
    137         gWindowsKeyMap.set(key, VK_A + i);
    138     }
    139 
    140     // Digits
    141     for (unsigned int i = 0; i < 10; i++) {
    142         String key = String::number(i);
    143         gWindowsKeyMap.set(key, VK_0 + i);
    144     }
    145 
    146     // Shifted digits
    147     gWindowsKeyMap.set("exclam",    VK_1);
    148     gWindowsKeyMap.set("at",        VK_2);
    149     gWindowsKeyMap.set("numbersign", VK_3);
    150     gWindowsKeyMap.set("dollar",    VK_4);
    151     gWindowsKeyMap.set("percent",   VK_5);
    152     gWindowsKeyMap.set("asciicircum", VK_6);
    153     gWindowsKeyMap.set("ampersand", VK_7);
    154     gWindowsKeyMap.set("asterisk",  VK_8);
    155     gWindowsKeyMap.set("parenleft", VK_9);
    156     gWindowsKeyMap.set("parenright", VK_0);
    157     gWindowsKeyMap.set("minus",     VK_OEM_MINUS);
    158     gWindowsKeyMap.set("underscore", VK_OEM_MINUS);
    159     gWindowsKeyMap.set("equal",     VK_OEM_PLUS);
    160     gWindowsKeyMap.set("plus",      VK_OEM_PLUS);
    161 
    162     // F_XX
    163     for (unsigned int i = 1; i < 25; i++) {
    164         String key = makeString('F', String::number(i));
    165         gWindowsKeyMap.set(key, VK_F1 + i);
    166     }
    167 }
    168 
    169 static String keyIdentifierForEvasKeyName(String& keyName)
    170 {
    171     if (gKeyMap.isEmpty())
    172         createKeyMap();
    173 
    174     if (gKeyMap.contains(keyName))
    175         return gKeyMap.get(keyName);
    176 
    177     return keyName;
    178 }
    179 
    180 static int windowsKeyCodeForEvasKeyName(String& keyName)
    181 {
    182     if (gWindowsKeyMap.isEmpty())
    183         createWindowsKeyMap();
    184 
    185     if (gWindowsKeyMap.contains(keyName))
    186         return gWindowsKeyMap.get(keyName);
    187 
    188     return 0;
    189 }
    190 
    191 PlatformKeyboardEvent::PlatformKeyboardEvent(const Evas_Event_Key_Down* event)
    192     : m_type(KeyDown)
    193     , m_text(String::fromUTF8(event->string))
    194     , m_shiftKey(evas_key_modifier_is_set(event->modifiers, "Shift"))
    195     , m_ctrlKey(evas_key_modifier_is_set(event->modifiers, "Control"))
    196     , m_altKey(evas_key_modifier_is_set(event->modifiers, "Alt"))
    197     , m_metaKey(evas_key_modifier_is_set(event->modifiers, "Meta"))
    198 {
    199     String keyName = String(event->key);
    200     m_keyIdentifier = keyIdentifierForEvasKeyName(keyName);
    201     m_windowsVirtualKeyCode = windowsKeyCodeForEvasKeyName(keyName);
    202 
    203     // FIXME:
    204     m_isKeypad = false;
    205     m_autoRepeat = false;
    206 }
    207 
    208 PlatformKeyboardEvent::PlatformKeyboardEvent(const Evas_Event_Key_Up* event)
    209     : m_type(KeyUp)
    210     , m_text(String::fromUTF8(event->string))
    211     , m_shiftKey(evas_key_modifier_is_set(event->modifiers, "Shift"))
    212     , m_ctrlKey(evas_key_modifier_is_set(event->modifiers, "Control"))
    213     , m_altKey(evas_key_modifier_is_set(event->modifiers, "Alt"))
    214     , m_metaKey(evas_key_modifier_is_set(event->modifiers, "Meta"))
    215 {
    216     String keyName = String(event->key);
    217     m_keyIdentifier = keyIdentifierForEvasKeyName(keyName);
    218     m_windowsVirtualKeyCode = windowsKeyCodeForEvasKeyName(keyName);
    219 
    220     // FIXME:
    221     m_isKeypad = false;
    222     m_autoRepeat = false;
    223 }
    224 
    225 void PlatformKeyboardEvent::disambiguateKeyDownEvent(Type type, bool)
    226 {
    227     ASSERT(m_type == KeyDown);
    228     m_type = type;
    229 
    230     if (type == RawKeyDown) {
    231         m_text = String();
    232         m_unmodifiedText = String();
    233     } else {
    234         m_keyIdentifier = String();
    235         m_windowsVirtualKeyCode = 0;
    236     }
    237 }
    238 
    239 bool PlatformKeyboardEvent::currentCapsLockState()
    240 {
    241     notImplemented();
    242     return false;
    243 }
    244 
    245 void PlatformKeyboardEvent::getCurrentModifierState(bool& shiftKey, bool& ctrlKey, bool& altKey, bool& metaKey)
    246 {
    247     notImplemented();
    248     shiftKey = false;
    249     ctrlKey = false;
    250     altKey = false;
    251     metaKey = false;
    252 }
    253 
    254 }
    255