15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006-2009 Google Inc.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "WebInputEventFactory.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <ApplicationServices/ApplicationServices.h>
31591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#import <AvailabilityMacros.h>
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#import <Cocoa/Cocoa.h>
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "WebInputEvent.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#import "core/platform/cocoa/KeyEventCocoa.h"
36591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/ASCIICType.h"
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#if __MAC_OS_X_VERSION_MAX_ALLOWED == 1060
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Additional Lion APIs.
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSEventPhaseNone        = 0,
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSEventPhaseBegan       = 0x1 << 0,
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSEventPhaseStationary  = 0x1 << 1,
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSEventPhaseChanged     = 0x1 << 2,
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSEventPhaseEnded       = 0x1 << 3,
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSEventPhaseCancelled   = 0x1 << 4
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef NSUInteger NSEventPhase;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)@interface NSEvent (LionSDKDeclarations)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)- (NSEventPhase)phase;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)- (NSEventPhase)momentumPhase;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)@end
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#endif  // __MAC_OS_X_VERSION_MAX_ALLOWED == 1060
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if __MAC_OS_X_VERSION_MAX_ALLOWED < 1080
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Additional Mountain Lion APIs.
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum {
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSEventPhaseMayBegin    = 0x1 << 5
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif  // __MAC_OS_X_VERSION_MAX_ALLOWED < 1080
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebKit {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebKeyboardEvent -----------------------------------------------------------
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------------------------------------------------------
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Begin Apple code, copied from KeyEventMac.mm
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// We can share some of this code if we factored it out of KeyEventMac, but
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// the main problem is that it relies on the NSString ctor on String for
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// conversions, and since we're building without PLATFORM(MAC), we don't have
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// that. As a result we have to use NSString here exclusively and thus tweak
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// the code so it's not re-usable as-is. One possiblity would be to make the
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// upstream code only use NSString, but I'm not certain how far that change
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// would propagate.
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool isKeyUpEvent(NSEvent* event)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([event type] != NSFlagsChanged)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return [event type] == NSKeyUp;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: This logic fails if the user presses both Shift keys at once, for example:
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // we treat releasing one of them as keyDown.
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch ([event keyCode]) {
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 54: // Right Command
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 55: // Left Command
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ([event modifierFlags] & NSCommandKeyMask) == 0;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 57: // Capslock
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ([event modifierFlags] & NSAlphaShiftKeyMask) == 0;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 56: // Left Shift
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 60: // Right Shift
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ([event modifierFlags] & NSShiftKeyMask) == 0;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 58: // Left Alt
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 61: // Right Alt
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ([event modifierFlags] & NSAlternateKeyMask) == 0;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 59: // Left Ctrl
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 62: // Right Ctrl
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ([event modifierFlags] & NSControlKeyMask) == 0;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 63: // Function
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ([event modifierFlags] & NSFunctionKeyMask) == 0;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isKeypadEvent(NSEvent* event)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Check that this is the type of event that has a keyCode.
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch ([event type]) {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSKeyDown:
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSKeyUp:
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSFlagsChanged:
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch ([event keyCode]) {
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 71: // Clear
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 81: // =
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 75: // /
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 67: // *
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 78: // -
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 69: // +
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 76: // Enter
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 65: // .
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 82: // 0
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 83: // 1
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 84: // 2
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 85: // 3
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 86: // 4
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 87: // 5
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 88: // 6
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 89: // 7
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 91: // 8
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 92: // 9
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static int windowsKeyCodeForKeyEvent(NSEvent* event)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int code = 0;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // There are several kinds of characters for which we produce key code from char code:
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 1. Roman letters. Windows keyboard layouts affect both virtual key codes and character codes for these,
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //    so e.g. 'A' gets the same keyCode on QWERTY, AZERTY or Dvorak layouts.
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 2. Keys for which there is no known Mac virtual key codes, like PrintScreen.
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 3. Certain punctuation keys. On Windows, these are also remapped depending on current keyboard layout,
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //    but see comment in windowsKeyCodeForCharCode().
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isKeypadEvent(event) && ([event type] == NSKeyDown || [event type] == NSKeyUp)) {
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Cmd switches Roman letters for Dvorak-QWERTY layout, so try modified characters first.
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NSString* s = [event characters];
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        code = [s length] > 0 ? WebCore::windowsKeyCodeForCharCode([s characterAtIndex:0]) : 0;
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (code)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return code;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ctrl+A on an AZERTY keyboard would get VK_Q keyCode if we relied on -[NSEvent keyCode] below.
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s = [event charactersIgnoringModifiers];
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        code = [s length] > 0 ? WebCore::windowsKeyCodeForCharCode([s characterAtIndex:0]) : 0;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (code)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return code;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Map Mac virtual key code directly to Windows one for any keys not handled above.
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // E.g. the key next to Caps Lock has the same Event.keyCode on U.S. keyboard ('A') and on Russian keyboard (CYRILLIC LETTER EF).
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebCore::windowsKeyCodeForKeyCode([event keyCode]);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static WebInputEvent::Type gestureEventTypeForEvent(NSEvent *event)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch ([event type]) {
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSEventTypeBeginGesture:
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebInputEvent::GestureScrollBegin;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSEventTypeEndGesture:
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebInputEvent::GestureScrollEnd;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebInputEvent::GestureScrollEnd;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline NSString* textFromEvent(NSEvent* event)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([event type] == NSFlagsChanged)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"";
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return [event characters];
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline NSString* unmodifiedTextFromEvent(NSEvent* event)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([event type] == NSFlagsChanged)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"";
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return [event charactersIgnoringModifiers];
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static NSString* keyIdentifierForKeyEvent(NSEvent* event)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([event type] == NSFlagsChanged) {
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch ([event keyCode]) {
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 54: // Right Command
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 55: // Left Command
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return @"Meta";
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 57: // Capslock
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return @"CapsLock";
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 56: // Left Shift
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 60: // Right Shift
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return @"Shift";
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 58: // Left Alt
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 61: // Right Alt
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return @"Alt";
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 59: // Left Ctrl
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 62: // Right Ctrl
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return @"Control";
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Begin non-Apple addition/modification --------------------------------------
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 63: // Function
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return @"Function";
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default: // Unknown, but this may be a strange/new keyboard.
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return @"Unidentified";
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// End non-Apple addition/modification ----------------------------------------
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSString* s = [event charactersIgnoringModifiers];
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([s length] != 1)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Unidentified";
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unichar c = [s characterAtIndex:0];
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (c) {
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Each identifier listed in the DOM spec is listed here.
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Many are simply commented out since they do not appear on standard Macintosh keyboards
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // or are on a key that doesn't have a corresponding character.
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Accept"
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "AllCandidates"
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Alt"
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSMenuFunctionKey:
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Alt";
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Apps"
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "BrowserBack"
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "BrowserForward"
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "BrowserHome"
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "BrowserRefresh"
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "BrowserSearch"
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "BrowserStop"
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "CapsLock"
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Clear"
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSClearLineFunctionKey:
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Clear";
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "CodeInput"
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Compose"
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Control"
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Crsel"
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Convert"
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Copy"
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Cut"
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Down"
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSDownArrowFunctionKey:
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Down";
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "End"
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSEndFunctionKey:
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"End";
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Enter"
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 0x3: case 0xA: case 0xD: // Macintosh calls the one on the main keyboard Return, but Windows calls it Enter, so we'll do the same for the DOM
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Enter";
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "EraseEof"
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Execute"
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSExecuteFunctionKey:
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Execute";
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Exsel"
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F1"
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF1FunctionKey:
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F1";
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F2"
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF2FunctionKey:
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F2";
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F3"
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF3FunctionKey:
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F3";
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F4"
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF4FunctionKey:
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F4";
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F5"
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF5FunctionKey:
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F5";
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F6"
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF6FunctionKey:
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F6";
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F7"
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF7FunctionKey:
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F7";
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F8"
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF8FunctionKey:
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F8";
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F9"
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF9FunctionKey:
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F9";
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F10"
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF10FunctionKey:
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F10";
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F11"
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF11FunctionKey:
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F11";
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F12"
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF12FunctionKey:
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F12";
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F13"
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF13FunctionKey:
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F13";
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F14"
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF14FunctionKey:
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F14";
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F15"
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF15FunctionKey:
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F15";
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F16"
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF16FunctionKey:
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F16";
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F17"
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF17FunctionKey:
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F17";
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F18"
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF18FunctionKey:
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F18";
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F19"
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF19FunctionKey:
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F19";
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F20"
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF20FunctionKey:
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F20";
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F21"
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF21FunctionKey:
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F21";
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F22"
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF22FunctionKey:
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F22";
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F23"
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF23FunctionKey:
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F23";
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "F24"
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF24FunctionKey:
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F24";
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "FinalMode"
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Find"
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSFindFunctionKey:
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Find";
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "FullWidth"
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "HalfWidth"
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "HangulMode"
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "HanjaMode"
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Help"
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSHelpFunctionKey:
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Help";
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Hiragana"
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Home"
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSHomeFunctionKey:
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Home";
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Insert"
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSInsertFunctionKey:
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Insert";
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "JapaneseHiragana"
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "JapaneseKatakana"
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "JapaneseRomaji"
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "JunjaMode"
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "KanaMode"
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "KanjiMode"
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Katakana"
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "LaunchApplication1"
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "LaunchApplication2"
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "LaunchMail"
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Left"
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSLeftArrowFunctionKey:
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Left";
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Meta"
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "MediaNextTrack"
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "MediaPlayPause"
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "MediaPreviousTrack"
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "MediaStop"
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "ModeChange"
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSModeSwitchFunctionKey:
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"ModeChange";
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Nonconvert"
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "NumLock"
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "PageDown"
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSPageDownFunctionKey:
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"PageDown";
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "PageUp"
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSPageUpFunctionKey:
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"PageUp";
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Paste"
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Pause"
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSPauseFunctionKey:
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Pause";
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Play"
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "PreviousCandidate"
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "PrintScreen"
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSPrintScreenFunctionKey:
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"PrintScreen";
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Process"
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Props"
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Right"
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSRightArrowFunctionKey:
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Right";
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "RomanCharacters"
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Scroll"
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSScrollLockFunctionKey:
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Scroll";
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Select"
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSSelectFunctionKey:
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Select";
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "SelectMedia"
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Shift"
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Stop"
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSStopFunctionKey:
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Stop";
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Up"
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSUpArrowFunctionKey:
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Up";
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Undo"
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSUndoFunctionKey:
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"Undo";
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "VolumeDown"
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "VolumeMute"
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "VolumeUp"
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Win"
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "Zoom"
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // More function keys, not in the key identifier specification.
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF25FunctionKey:
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F25";
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF26FunctionKey:
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F26";
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF27FunctionKey:
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F27";
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF28FunctionKey:
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F28";
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF29FunctionKey:
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F29";
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF30FunctionKey:
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F30";
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF31FunctionKey:
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F31";
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF32FunctionKey:
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F32";
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF33FunctionKey:
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F33";
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF34FunctionKey:
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F34";
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSF35FunctionKey:
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"F35";
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Turn 0x7F into 0x08, because backspace needs to always be 0x08.
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case 0x7F:
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"U+0008";
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Standard says that DEL becomes U+007F.
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSDeleteFunctionKey:
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"U+007F";
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Always use 0x09 for tab instead of AppKit's backtab character.
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSBackTabCharacter:
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return @"U+0009";
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSBeginFunctionKey:
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSBreakFunctionKey:
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSClearDisplayFunctionKey:
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSDeleteCharFunctionKey:
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSDeleteLineFunctionKey:
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSInsertCharFunctionKey:
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSInsertLineFunctionKey:
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSNextFunctionKey:
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSPrevFunctionKey:
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSPrintFunctionKey:
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSRedoFunctionKey:
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSResetFunctionKey:
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSSysReqFunctionKey:
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSSystemFunctionKey:
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSUserFunctionKey:
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: We should use something other than the vendor-area Unicode values for the above keys.
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // For now, just fall through to the default.
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return [NSString stringWithFormat:@"U+%04X", WTF::toASCIIUpper(c)];
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// End Apple code.
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------------------------------------------------------
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline int modifiersFromEvent(NSEvent* event) {
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int modifiers = 0;
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([event modifierFlags] & NSControlKeyMask)
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        modifiers |= WebInputEvent::ControlKey;
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([event modifierFlags] & NSShiftKeyMask)
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        modifiers |= WebInputEvent::ShiftKey;
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([event modifierFlags] & NSAlternateKeyMask)
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        modifiers |= WebInputEvent::AltKey;
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([event modifierFlags] & NSCommandKeyMask)
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        modifiers |= WebInputEvent::MetaKey;
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([event modifierFlags] & NSAlphaShiftKeyMask)
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        modifiers |= WebInputEvent::CapsLockOn;
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // TODO(port): Set mouse button states
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return modifiers;
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline void setWebEventLocationFromEventInView(WebMouseEvent* result,
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                      NSEvent* event,
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                      NSView* view) {
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSPoint windowLocal = [event locationInWindow];
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSPoint screenLocal = [[view window] convertBaseToScreen:windowLocal];
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result->globalX = screenLocal.x;
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Flip y.
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSScreen* primaryScreen = ([[NSScreen screens] count] > 0) ?
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        [[NSScreen screens] objectAtIndex:0] : nil;
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (primaryScreen)
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result->globalY = [primaryScreen frame].size.height - screenLocal.y;
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result->globalY = screenLocal.y;
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSPoint contentLocal = [view convertPoint:windowLocal fromView:nil];
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result->x = contentLocal.x;
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result->y = [view frame].size.height - contentLocal.y;  // Flip y.
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result->windowX = result->x;
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result->windowY = result->y;
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result->movementX = [event deltaX];
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result->movementY = [event deltaY];
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebKeyboardEvent WebInputEventFactory::keyboardEvent(NSEvent* event)
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebKeyboardEvent result;
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.type =
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        isKeyUpEvent(event) ? WebInputEvent::KeyUp : WebInputEvent::RawKeyDown;
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.modifiers = modifiersFromEvent(event);
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isKeypadEvent(event))
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.modifiers |= WebInputEvent::IsKeyPad;
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (([event type] != NSFlagsChanged) && [event isARepeat])
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.modifiers |= WebInputEvent::IsAutoRepeat;
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int windowsKeyCode = windowsKeyCodeForKeyEvent(event);
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.windowsKeyCode = WebKeyboardEvent::windowsKeyCodeWithoutLocation(windowsKeyCode);
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.modifiers |= WebKeyboardEvent::locationModifiersFromWindowsKeyCode(windowsKeyCode);
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.nativeKeyCode = [event keyCode];
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSString* textStr = textFromEvent(event);
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSString* unmodifiedStr = unmodifiedTextFromEvent(event);
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSString* identifierStr = keyIdentifierForKeyEvent(event);
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Begin Apple code, copied from KeyEventMac.mm
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Always use 13 for Enter/Return -- we don't want to use AppKit's
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // different character for Enter.
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (result.windowsKeyCode == '\r') {
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        textStr = @"\r";
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unmodifiedStr = @"\r";
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The adjustments below are only needed in backward compatibility mode,
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // but we cannot tell what mode we are in from here.
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Turn 0x7F into 8, because backspace needs to always be 8.
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([textStr isEqualToString:@"\x7F"])
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        textStr = @"\x8";
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([unmodifiedStr isEqualToString:@"\x7F"])
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unmodifiedStr = @"\x8";
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Always use 9 for tab -- we don't want to use AppKit's different character
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // for shift-tab.
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (result.windowsKeyCode == 9) {
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        textStr = @"\x9";
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unmodifiedStr = @"\x9";
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // End Apple code.
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ([textStr length] < WebKeyboardEvent::textLengthCap &&
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        [unmodifiedStr length] < WebKeyboardEvent::textLengthCap) {
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        [textStr getCharacters:&result.text[0]];
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        [unmodifiedStr getCharacters:&result.unmodifiedText[0]];
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    [identifierStr getCString:&result.keyIdentifier[0]
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    maxLength:sizeof(result.keyIdentifier)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     encoding:NSASCIIStringEncoding];
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.timeStampSeconds = [event timestamp];
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Windows and Linux set |isSystemKey| if alt is down. WebKit looks at this
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // flag to decide if it should handle a key or not. E.g. alt-left/right
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // shouldn't be used by WebKit to scroll the current page, because we want
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to get that key back for it to do history navigation. Hence, the
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // corresponding situation on OS X is to set this for cmd key presses.
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (result.modifiers & WebInputEvent::MetaKey)
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.isSystemKey = true;
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebKeyboardEvent WebInputEventFactory::keyboardEvent(wchar_t character,
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                     int modifiers,
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                     double timeStampSeconds)
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // keyboardEvent(NSEvent*) depends on the NSEvent object and
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // it is hard to use it from methods of the NSTextInput protocol. For
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // such methods, this function creates a WebInputEvent::Char event without
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // using a NSEvent object.
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebKeyboardEvent result;
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.type = WebKit::WebInputEvent::Char;
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.timeStampSeconds = timeStampSeconds;
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.modifiers = modifiers;
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.windowsKeyCode = character;
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.nativeKeyCode = character;
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.text[0] = character;
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.unmodifiedText[0] = character;
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Windows and Linux set |isSystemKey| if alt is down. WebKit looks at this
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // flag to decide if it should handle a key or not. E.g. alt-left/right
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // shouldn't be used by WebKit to scroll the current page, because we want
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to get that key back for it to do history navigation. Hence, the
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // corresponding situation on OS X is to set this for cmd key presses.
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (result.modifiers & WebInputEvent::MetaKey)
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.isSystemKey = true;
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebMouseEvent --------------------------------------------------------------
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebMouseEvent WebInputEventFactory::mouseEvent(NSEvent* event, NSView* view)
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebMouseEvent result;
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.clickCount = 0;
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch ([event type]) {
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSMouseExited:
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseLeave;
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.button = WebMouseEvent::ButtonNone;
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSLeftMouseDown:
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseDown;
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.clickCount = [event clickCount];
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.button = WebMouseEvent::ButtonLeft;
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSOtherMouseDown:
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseDown;
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.clickCount = [event clickCount];
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.button = WebMouseEvent::ButtonMiddle;
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSRightMouseDown:
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseDown;
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.clickCount = [event clickCount];
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.button = WebMouseEvent::ButtonRight;
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSLeftMouseUp:
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseUp;
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.clickCount = [event clickCount];
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.button = WebMouseEvent::ButtonLeft;
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSOtherMouseUp:
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseUp;
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.clickCount = [event clickCount];
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.button = WebMouseEvent::ButtonMiddle;
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSRightMouseUp:
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseUp;
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.clickCount = [event clickCount];
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.button = WebMouseEvent::ButtonRight;
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSMouseMoved:
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSMouseEntered:
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseMove;
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSLeftMouseDragged:
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseMove;
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.button = WebMouseEvent::ButtonLeft;
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSOtherMouseDragged:
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseMove;
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.button = WebMouseEvent::ButtonMiddle;
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NSRightMouseDragged:
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.type = WebInputEvent::MouseMove;
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.button = WebMouseEvent::ButtonRight;
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setWebEventLocationFromEventInView(&result, event, view);
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.modifiers = modifiersFromEvent(event);
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.timeStampSeconds = [event timestamp];
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebMouseWheelEvent ---------------------------------------------------------
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static WebMouseWheelEvent::Phase phaseForNSEventPhase(NSEventPhase eventPhase)
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t phase = WebMouseWheelEvent::PhaseNone;
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventPhase & NSEventPhaseBegan)
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        phase |= WebMouseWheelEvent::PhaseBegan;
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventPhase & NSEventPhaseStationary)
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        phase |= WebMouseWheelEvent::PhaseStationary;
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventPhase & NSEventPhaseChanged)
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        phase |= WebMouseWheelEvent::PhaseChanged;
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventPhase & NSEventPhaseEnded)
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        phase |= WebMouseWheelEvent::PhaseEnded;
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventPhase & NSEventPhaseCancelled)
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        phase |= WebMouseWheelEvent::PhaseCancelled;
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventPhase & NSEventPhaseMayBegin)
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        phase |= WebMouseWheelEvent::PhaseMayBegin;
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebMouseWheelEvent::Phase>(phase);
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static WebMouseWheelEvent::Phase phaseForEvent(NSEvent *event)
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (![event respondsToSelector:@selector(phase)])
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebMouseWheelEvent::PhaseNone;
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSEventPhase eventPhase = [event phase];
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return phaseForNSEventPhase(eventPhase);
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static WebMouseWheelEvent::Phase momentumPhaseForEvent(NSEvent *event)
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (![event respondsToSelector:@selector(momentumPhase)])
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebMouseWheelEvent::PhaseNone;
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSEventPhase eventMomentumPhase = [event momentumPhase];
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return phaseForNSEventPhase(eventMomentumPhase);
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebMouseWheelEvent WebInputEventFactory::mouseWheelEvent(NSEvent* event, NSView* view)
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebMouseWheelEvent result;
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.type = WebInputEvent::MouseWheel;
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.button = WebMouseEvent::ButtonNone;
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.modifiers = modifiersFromEvent(event);
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setWebEventLocationFromEventInView(&result, event, view);
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Of Mice and Men
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ---------------
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // There are three types of scroll data available on a scroll wheel CGEvent.
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Apple's documentation ([1]) is rather vague in their differences, and not
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // terribly helpful in deciding which to use. This is what's really going on.
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // First, these events behave very differently depending on whether a standard
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // wheel mouse is used (one that scrolls in discrete units) or a
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // trackpad/Mighty Mouse is used (which both provide continuous scrolling).
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // You must check to see which was used for the event by testing the
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // kCGScrollWheelEventIsContinuous field.
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Second, these events refer to "axes". Axis 1 is the y-axis, and axis 2 is
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the x-axis.
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Third, there is a concept of mouse acceleration. Scrolling the same amount
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // of physical distance will give you different results logically depending on
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // whether you scrolled a little at a time or in one continuous motion. Some
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // fields account for this while others do not.
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Fourth, for trackpads there is a concept of chunkiness. When scrolling
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // continuously, events can be delivered in chunks. That is to say, lots of
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // scroll events with delta 0 will be delivered, and every so often an event
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // with a non-zero delta will be delivered, containing the accumulated deltas
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // from all the intermediate moves. [2]
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For notchy wheel mice (kCGScrollWheelEventIsContinuous == 0)
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ------------------------------------------------------------
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // kCGScrollWheelEventDeltaAxis*
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   This is the rawest of raw events. For each mouse notch you get a value of
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   +1/-1. This does not take acceleration into account and thus is less
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   useful for building UIs.
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // kCGScrollWheelEventPointDeltaAxis*
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   This is smarter. In general, for each mouse notch you get a value of
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   +1/-1, but this _does_ take acceleration into account, so you will get
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   larger values on longer scrolls. This field would be ideal for building
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   UIs except for one nasty bug: when the shift key is pressed, this set of
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   fields fails to move the value into the axis2 field (the other two types
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   of data do). This wouldn't be so bad except for the fact that while the
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   number of axes is used in the creation of a CGScrollWheelEvent, there is
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   no way to get that information out of the event once created.
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // kCGScrollWheelEventFixedPtDeltaAxis*
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   This is a fixed value, and for each mouse notch you get a value of
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   +0.1/-0.1 (but, like above, scaled appropriately for acceleration). This
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   value takes acceleration into account, and in fact is identical to the
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   results you get from -[NSEvent delta*]. (That is, if you linked on Tiger
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   or greater; see [2] for details.)
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // A note about continuous devices
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // -------------------------------
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // There are two devices that provide continuous scrolling events (trackpads
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and Mighty Mouses) and they behave rather differently. The Mighty Mouse
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // behaves a lot like a regular mouse. There is no chunking, and the
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FixedPtDelta values are the PointDelta values multiplied by 0.1. With the
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // trackpad, though, there is chunking. While the FixedPtDelta values are
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // reasonable (they occur about every fifth event but have values five times
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // larger than usual) the Delta values are unreasonable. They don't appear to
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // accumulate properly.
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For continuous devices (kCGScrollWheelEventIsContinuous != 0)
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // -------------------------------------------------------------
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // kCGScrollWheelEventDeltaAxis*
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   This provides values with no acceleration. With a trackpad, these values
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   are chunked but each non-zero value does not appear to be cumulative.
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   This seems to be a bug.
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // kCGScrollWheelEventPointDeltaAxis*
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   This provides values with acceleration. With a trackpad, these values are
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   not chunked and are highly accurate.
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // kCGScrollWheelEventFixedPtDeltaAxis*
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   This provides values with acceleration. With a trackpad, these values are
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   chunked but unlike Delta events are properly cumulative.
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Summary
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // -------
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // In general the best approach to take is: determine if the event is
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // continuous. If it is not, then use the FixedPtDelta events (or just stick
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // with Cocoa events). They provide both acceleration and proper horizontal
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // scrolling. If the event is continuous, then doing pixel scrolling with the
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // PointDelta is the way to go. In general, avoid the Delta events. They're
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the oldest (dating back to 10.4, before CGEvents were public) but they lack
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // acceleration and precision, making them useful only in specific edge cases.
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // References
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ----------
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // [1] <http://developer.apple.com/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html>
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // [2] <http://developer.apple.com/releasenotes/Cocoa/AppKitOlderNotes.html>
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //     Scroll to the section headed "NSScrollWheel events".
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // P.S. The "smooth scrolling" option in the system preferences is utterly
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // unrelated to any of this.
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CGEventRef cgEvent = [event CGEvent];
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(cgEvent);
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Wheel ticks are supposed to be raw, unaccelerated values, one per physical
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // mouse wheel notch. The delta event is perfect for this (being a good
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // "specific edge case" as mentioned above). Trackpads, unfortunately, do
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // event chunking, and sending mousewheel events with 0 ticks causes some
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // websites to malfunction. Therefore, for all continuous input devices we use
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the point delta data instead, since we cannot distinguish trackpad data
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // from data from any other continuous device.
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Conversion between wheel delta amounts and number of pixels to scroll.
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const double scrollbarPixelsPerCocoaTick = 40.0;
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventIsContinuous)) {
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.deltaX = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis2);
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.deltaY = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventPointDeltaAxis1);
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.wheelTicksX = result.deltaX / scrollbarPixelsPerCocoaTick;
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.wheelTicksY = result.deltaY / scrollbarPixelsPerCocoaTick;
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.hasPreciseScrollingDeltas = true;
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.deltaX = [event deltaX] * scrollbarPixelsPerCocoaTick;
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.deltaY = [event deltaY] * scrollbarPixelsPerCocoaTick;
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.wheelTicksY = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis1);
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.wheelTicksX = CGEventGetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis2);
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.timeStampSeconds = [event timestamp];
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.phase              = phaseForEvent(event);
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.momentumPhase      = momentumPhaseForEvent(event);
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebGestureEvent WebInputEventFactory::gestureEvent(NSEvent *event, NSView *view)
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebGestureEvent result;
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Use a temporary WebMouseEvent to get the location.
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebMouseEvent temp;
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setWebEventLocationFromEventInView(&temp, event, view);
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.x = temp.x;
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.y = temp.y;
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.globalX = temp.globalX;
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.globalY = temp.globalY;
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.type = gestureEventTypeForEvent(event);
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.modifiers = modifiersFromEvent(event);
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.timeStampSeconds = [event timestamp];
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebKit
959