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