| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 2006-2009 Google Inc. All rights reserved. | 2  * Copyright (C) 2006-2009 Google Inc. All rights reserved. | 
| 3  * | 3  * | 
| 4  * Redistribution and use in source and binary forms, with or without | 4  * Redistribution and use in source and binary forms, with or without | 
| 5  * modification, are permitted provided that the following conditions are | 5  * modification, are permitted provided that the following conditions are | 
| 6  * met: | 6  * met: | 
| 7  * | 7  * | 
| 8  *     * Redistributions of source code must retain the above copyright | 8  *     * Redistributions of source code must retain the above copyright | 
| 9  * notice, this list of conditions and the following disclaimer. | 9  * notice, this list of conditions and the following disclaimer. | 
| 10  *     * Redistributions in binary form must reproduce the above | 10  *     * Redistributions in binary form must reproduce the above | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 64 #endif | 64 #endif | 
| 65     if (state & GDK_BUTTON1_MASK) | 65     if (state & GDK_BUTTON1_MASK) | 
| 66         modifiers |= WebInputEvent::LeftButtonDown; | 66         modifiers |= WebInputEvent::LeftButtonDown; | 
| 67     if (state & GDK_BUTTON2_MASK) | 67     if (state & GDK_BUTTON2_MASK) | 
| 68         modifiers |= WebInputEvent::MiddleButtonDown; | 68         modifiers |= WebInputEvent::MiddleButtonDown; | 
| 69     if (state & GDK_BUTTON3_MASK) | 69     if (state & GDK_BUTTON3_MASK) | 
| 70         modifiers |= WebInputEvent::RightButtonDown; | 70         modifiers |= WebInputEvent::RightButtonDown; | 
| 71     return modifiers; | 71     return modifiers; | 
| 72 } | 72 } | 
| 73 | 73 | 
|  | 74 static int gdkEventToWindowsKeyCode(const GdkEventKey* event) | 
|  | 75 { | 
|  | 76     static const unsigned int hardwareCodeToGDKKeyval[] = { | 
|  | 77         0,                 // 0x00: | 
|  | 78         0,                 // 0x01: | 
|  | 79         0,                 // 0x02: | 
|  | 80         0,                 // 0x03: | 
|  | 81         0,                 // 0x04: | 
|  | 82         0,                 // 0x05: | 
|  | 83         0,                 // 0x06: | 
|  | 84         0,                 // 0x07: | 
|  | 85         0,                 // 0x08: | 
|  | 86         0,                 // 0x09: GDK_Escape | 
|  | 87         GDK_1,             // 0x0A: GDK_1 | 
|  | 88         GDK_2,             // 0x0B: GDK_2 | 
|  | 89         GDK_3,             // 0x0C: GDK_3 | 
|  | 90         GDK_4,             // 0x0D: GDK_4 | 
|  | 91         GDK_5,             // 0x0E: GDK_5 | 
|  | 92         GDK_6,             // 0x0F: GDK_6 | 
|  | 93         GDK_7,             // 0x10: GDK_7 | 
|  | 94         GDK_8,             // 0x11: GDK_8 | 
|  | 95         GDK_9,             // 0x12: GDK_9 | 
|  | 96         GDK_0,             // 0x13: GDK_0 | 
|  | 97         GDK_minus,         // 0x14: GDK_minus | 
|  | 98         GDK_equal,         // 0x15: GDK_equal | 
|  | 99         0,                 // 0x16: GDK_BackSpace | 
|  | 100         0,                 // 0x17: GDK_Tab | 
|  | 101         GDK_q,             // 0x18: GDK_q | 
|  | 102         GDK_w,             // 0x19: GDK_w | 
|  | 103         GDK_e,             // 0x1A: GDK_e | 
|  | 104         GDK_r,             // 0x1B: GDK_r | 
|  | 105         GDK_t,             // 0x1C: GDK_t | 
|  | 106         GDK_y,             // 0x1D: GDK_y | 
|  | 107         GDK_u,             // 0x1E: GDK_u | 
|  | 108         GDK_i,             // 0x1F: GDK_i | 
|  | 109         GDK_o,             // 0x20: GDK_o | 
|  | 110         GDK_p,             // 0x21: GDK_p | 
|  | 111         GDK_bracketleft,   // 0x22: GDK_bracketleft | 
|  | 112         GDK_bracketright,  // 0x23: GDK_bracketright | 
|  | 113         0,                 // 0x24: GDK_Return | 
|  | 114         0,                 // 0x25: GDK_Control_L | 
|  | 115         GDK_a,             // 0x26: GDK_a | 
|  | 116         GDK_s,             // 0x27: GDK_s | 
|  | 117         GDK_d,             // 0x28: GDK_d | 
|  | 118         GDK_f,             // 0x29: GDK_f | 
|  | 119         GDK_g,             // 0x2A: GDK_g | 
|  | 120         GDK_h,             // 0x2B: GDK_h | 
|  | 121         GDK_j,             // 0x2C: GDK_j | 
|  | 122         GDK_k,             // 0x2D: GDK_k | 
|  | 123         GDK_l,             // 0x2E: GDK_l | 
|  | 124         GDK_semicolon,     // 0x2F: GDK_semicolon | 
|  | 125         GDK_apostrophe,    // 0x30: GDK_apostrophe | 
|  | 126         GDK_grave,         // 0x31: GDK_grave | 
|  | 127         0,                 // 0x32: GDK_Shift_L | 
|  | 128         GDK_backslash,     // 0x33: GDK_backslash | 
|  | 129         GDK_z,             // 0x34: GDK_z | 
|  | 130         GDK_x,             // 0x35: GDK_x | 
|  | 131         GDK_c,             // 0x36: GDK_c | 
|  | 132         GDK_v,             // 0x37: GDK_v | 
|  | 133         GDK_b,             // 0x38: GDK_b | 
|  | 134         GDK_n,             // 0x39: GDK_n | 
|  | 135         GDK_m,             // 0x3A: GDK_m | 
|  | 136         GDK_comma,         // 0x3B: GDK_comma | 
|  | 137         GDK_period,        // 0x3C: GDK_period | 
|  | 138         GDK_slash,         // 0x3D: GDK_slash | 
|  | 139         0,                 // 0x3E: GDK_Shift_R | 
|  | 140     }; | 
|  | 141 | 
|  | 142     // |windowKeyCode| shouldn't change even when we change the keyboard | 
|  | 143     // layout, e.g. when we type an 'A' key of a US keyboard on the French | 
|  | 144     // layout, |windowsKeyCode| should be VK_A. On the other hand, | 
|  | 145     // |event->keyval| may change when we change the keyboard layout (the | 
|  | 146     // GdkKeymap object attached to the GdkDisplay object), e.g. when we type | 
|  | 147     // an 'A' key of a US keyboard on the French (or Hebrew) layout, | 
|  | 148     // |event->keyval| becomes GDK_q (or GDK_hebrew_shin). | 
|  | 149     // To improve compatibilty with Windows, we use |event->hardware_keycode| | 
|  | 150     // for retrieving its Windows key-code for the keys that can be changed by | 
|  | 151     // GdkKeymap objects (keyboard-layout drivers). | 
|  | 152     // We shouldn't use |event->hardware_keycode| for keys that GdkKeymap | 
|  | 153     // objects cannot change because |event->hardware_keycode| doesn't change | 
|  | 154     // even when we change the layout options, e.g. when we swap a control | 
|  | 155     // key and a caps-lock key, GTK doesn't swap their | 
|  | 156     // |event->hardware_keycode| values but swap their |event->keyval| values. | 
|  | 157     const int tableSize = sizeof(hardwareCodeToGDKKeyval) / sizeof(hardwareCodeToGDKKeyval[0]); | 
|  | 158     if (event->hardware_keycode < tableSize) { | 
|  | 159         int keyval = hardwareCodeToGDKKeyval[event->hardware_keycode]; | 
|  | 160         if (keyval) | 
|  | 161             return WebCore::windowsKeyCodeForKeyEvent(keyval); | 
|  | 162     } | 
|  | 163 | 
|  | 164     // This key is one that keyboard-layout drivers cannot change. | 
|  | 165     // Use |event->keyval| to retrieve its |windowsKeyCode| value. | 
|  | 166     return WebCore::windowsKeyCodeForKeyEvent(event->keyval); | 
|  | 167 } | 
|  | 168 | 
| 74 // WebKeyboardEvent ----------------------------------------------------------- | 169 // WebKeyboardEvent ----------------------------------------------------------- | 
| 75 | 170 | 
| 76 WebKeyboardEvent WebInputEventFactory::keyboardEvent(const GdkEventKey* event) | 171 WebKeyboardEvent WebInputEventFactory::keyboardEvent(const GdkEventKey* event) | 
| 77 { | 172 { | 
| 78     WebKeyboardEvent result; | 173     WebKeyboardEvent result; | 
| 79 | 174 | 
| 80     result.timeStampSeconds = gdkEventTimeToWebEventTime(event->time); | 175     result.timeStampSeconds = gdkEventTimeToWebEventTime(event->time); | 
| 81     result.modifiers = gdkStateToWebEventModifiers(event->state); | 176     result.modifiers = gdkStateToWebEventModifiers(event->state); | 
| 82 | 177 | 
| 83     switch (event->type) { | 178     switch (event->type) { | 
| 84     case GDK_KEY_RELEASE: | 179     case GDK_KEY_RELEASE: | 
| 85         result.type = WebInputEvent::KeyUp; | 180         result.type = WebInputEvent::KeyUp; | 
| 86         break; | 181         break; | 
| 87     case GDK_KEY_PRESS: | 182     case GDK_KEY_PRESS: | 
| 88         result.type = WebInputEvent::KeyDown; | 183         result.type = WebInputEvent::RawKeyDown; | 
| 89         break; | 184         break; | 
| 90     default: | 185     default: | 
| 91         ASSERT_NOT_REACHED(); | 186         ASSERT_NOT_REACHED(); | 
| 92     } | 187     } | 
| 93 | 188 | 
| 94     // The key code tells us which physical key was pressed (for example, the | 189     // The key code tells us which physical key was pressed (for example, the | 
| 95     // A key went down or up).  It does not determine whether A should be lower | 190     // A key went down or up).  It does not determine whether A should be lower | 
| 96     // or upper case.  This is what text does, which should be the keyval. | 191     // or upper case.  This is what text does, which should be the keyval. | 
| 97     result.windowsKeyCode = WebCore::windowsKeyCodeForKeyEvent(event->keyval); | 192     result.windowsKeyCode = gdkEventToWindowsKeyCode(event); | 
| 98     result.nativeKeyCode = event->hardware_keycode; | 193     result.nativeKeyCode = event->hardware_keycode; | 
| 99 | 194 | 
| 100     switch (event->keyval) { | 195     switch (event->keyval) { | 
| 101     // We need to treat the enter key as a key press of character \r.  This | 196     // We need to treat the enter key as a key press of character \r.  This | 
| 102     // is apparently just how webkit handles it and what it expects. | 197     // is apparently just how webkit handles it and what it expects. | 
| 103     case GDK_ISO_Enter: | 198     case GDK_ISO_Enter: | 
| 104     case GDK_KP_Enter: | 199     case GDK_KP_Enter: | 
| 105     case GDK_Return: | 200     case GDK_Return: | 
| 106         result.unmodifiedText[0] = result.text[0] = static_cast<WebUChar>('\r'); | 201         result.unmodifiedText[0] = result.text[0] = static_cast<WebUChar>('\r'); | 
| 107         break; | 202         break; | 
| 108     default: | 203     default: | 
| 109         // This should set text to 0 when it's not a real character. | 204         // This should set text to 0 when it's not a real character. | 
| 110         // FIXME: fix for non BMP chars | 205         // FIXME: fix for non BMP chars | 
| 111         result.unmodifiedText[0] = result.text[0] = | 206         result.unmodifiedText[0] = result.text[0] = | 
| 112             static_cast<WebUChar>(gdk_keyval_to_unicode(event->keyval)); | 207             static_cast<WebUChar>(gdk_keyval_to_unicode(event->keyval)); | 
| 113     } | 208     } | 
| 114 | 209 | 
| 115     result.setKeyIdentifierFromWindowsKeyCode(); | 210     result.setKeyIdentifierFromWindowsKeyCode(); | 
| 116 | 211 | 
| 117     // FIXME: Do we need to set IsAutoRepeat or IsKeyPad? | 212     // FIXME: Do we need to set IsAutoRepeat or IsKeyPad? | 
| 118 | 213 | 
| 119     return result; | 214     return result; | 
| 120 } | 215 } | 
| 121 | 216 | 
|  | 217 WebKeyboardEvent WebInputEventFactory::keyboardEvent(wchar_t character, double timeStampSeconds) | 
|  | 218 { | 
|  | 219     // keyboardEvent(const GdkEventKey*) depends on the GdkEventKey object and | 
|  | 220     // it is hard to use/ it from signal handlers which don't use GdkEventKey | 
|  | 221     // objects (e.g. GtkIMContext signal handlers.) For such handlers, this | 
|  | 222     // function creates a WebInputEvent::Char event without using a | 
|  | 223     // GdkEventKey object. | 
|  | 224     WebKeyboardEvent result; | 
|  | 225     result.type = WebKit::WebInputEvent::Char; | 
|  | 226     result.timeStampSeconds = timeStampSeconds; | 
|  | 227     result.windowsKeyCode = character; | 
|  | 228     result.nativeKeyCode = character; | 
|  | 229     result.text[0] = character; | 
|  | 230     result.unmodifiedText[0] = character; | 
|  | 231     return result; | 
|  | 232 } | 
|  | 233 | 
| 122 // WebMouseEvent -------------------------------------------------------------- | 234 // WebMouseEvent -------------------------------------------------------------- | 
| 123 | 235 | 
| 124 WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event) | 236 WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event) | 
| 125 { | 237 { | 
| 126     WebMouseEvent result; | 238     WebMouseEvent result; | 
| 127 | 239 | 
| 128     result.timeStampSeconds = gdkEventTimeToWebEventTime(event->time); | 240     result.timeStampSeconds = gdkEventTimeToWebEventTime(event->time); | 
| 129 | 241 | 
| 130     result.modifiers = gdkStateToWebEventModifiers(event->state); | 242     result.modifiers = gdkStateToWebEventModifiers(event->state); | 
| 131     result.x = static_cast<int>(event->x); | 243     result.x = static_cast<int>(event->x); | 
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 244     case GDK_SCROLL_RIGHT: | 356     case GDK_SCROLL_RIGHT: | 
| 245         result.deltaX = -scrollbarPixelsPerTick; | 357         result.deltaX = -scrollbarPixelsPerTick; | 
| 246         result.wheelTicksX = 1; | 358         result.wheelTicksX = 1; | 
| 247         break; | 359         break; | 
| 248     } | 360     } | 
| 249 | 361 | 
| 250     return result; | 362     return result; | 
| 251 } | 363 } | 
| 252 | 364 | 
| 253 } // namespace WebKit | 365 } // namespace WebKit | 
| OLD | NEW | 
|---|