18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Inc. All Rights Reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API) 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNetscapePluginEventHandlerCocoa.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "WebKitSystemInterface.h" 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebNetscapePluginView.h" 32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <wtf/UnusedParam.h> 33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <wtf/Vector.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWebNetscapePluginEventHandlerCocoa::WebNetscapePluginEventHandlerCocoa(WebNetscapePluginView* pluginView) 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : WebNetscapePluginEventHandler(pluginView) 37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#ifndef __LP64__ 38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark , m_keyEventHandler(0) 39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void initializeEvent(NPCocoaEvent* event, NPCocoaEventType type) 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event->type = type; 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event->version = 0; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebNetscapePluginEventHandlerCocoa::drawRect(CGContextRef context, const NSRect& rect) 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPCocoaEvent event; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeEvent(&event, NPCocoaEventDrawRect); 540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch event.data.draw.context = context; 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.draw.x = rect.origin.x; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.draw.y = rect.origin.y; 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.draw.width = rect.size.width; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.draw.height = rect.size.height; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RetainPtr<CGContextRef> protect(context); 610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendEvent(&event); 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseDown(NSEvent *event) 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendMouseEvent(event, NPCocoaEventMouseDown); 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseDragged(NSEvent *event) 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendMouseEvent(event, NPCocoaEventMouseDragged); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseEntered(NSEvent *event) 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendMouseEvent(event, NPCocoaEventMouseEntered); 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseExited(NSEvent *event) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendMouseEvent(event, NPCocoaEventMouseExited); 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseMoved(NSEvent *event) 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendMouseEvent(event, NPCocoaEventMouseMoved); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::mouseUp(NSEvent *event) 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendMouseEvent(event, NPCocoaEventMouseUp); 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::scrollWheel(NSEvent* event) 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return sendMouseEvent(event, NPCocoaEventScrollWheel); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::sendMouseEvent(NSEvent *nsEvent, NPCocoaEventType type) 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPCocoaEvent event; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSPoint point = [m_pluginView convertPoint:[nsEvent locationInWindow] fromView:nil]; 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int clickCount; 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (type == NPCocoaEventMouseEntered || type == NPCocoaEventMouseExited || type == NPCocoaEventScrollWheel) 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clickCount = 0; 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clickCount = [nsEvent clickCount]; 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeEvent(&event, type); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.mouse.modifierFlags = [nsEvent modifierFlags]; 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.mouse.buttonNumber = [nsEvent buttonNumber]; 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.mouse.clickCount = clickCount; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.mouse.pluginX = point.x; 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.mouse.pluginY = point.y; 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.mouse.deltaX = [nsEvent deltaX]; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.mouse.deltaY = [nsEvent deltaY]; 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.mouse.deltaZ = [nsEvent deltaZ]; 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return sendEvent(&event); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::keyDown(NSEvent *event) 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool retval = sendKeyEvent(event, NPCocoaEventKeyDown); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#ifndef __LP64__ 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the plug-in did not handle the event, pass it on to the Input Manager. 131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (retval) 132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark WKSendKeyEventToTSM(event); 133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#else 134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark UNUSED_PARAM(retval); 135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::keyUp(NSEvent *event) 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendKeyEvent(event, NPCocoaEventKeyUp); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::flagsChanged(NSEvent *nsEvent) 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPCocoaEvent event; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeEvent(&event, NPCocoaEventFlagsChanged); 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.key.modifierFlags = [nsEvent modifierFlags]; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.key.keyCode = [nsEvent keyCode]; 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.key.isARepeat = false; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.key.characters = 0; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.key.charactersIgnoringModifiers = 0; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendEvent(&event); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebNetscapePluginEventHandlerCocoa::syntheticKeyDownWithCommandModifier(int keyCode, char character) 1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch char nullTerminatedString[] = { character, '\0' }; 1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RetainPtr<NSString> characters(AdoptNS, [[NSString alloc] initWithUTF8String:nullTerminatedString]); 1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch NPCocoaEvent event; 1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch initializeEvent(&event, NPCocoaEventKeyDown); 1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch event.data.key.modifierFlags = NSCommandKeyMask; 1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch event.data.key.keyCode = keyCode; 1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch event.data.key.isARepeat = false; 1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch event.data.key.characters = (NPNSString *)characters.get(); 1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch event.data.key.charactersIgnoringModifiers = (NPNSString *)characters.get(); 1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sendEvent(&event); 1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::sendKeyEvent(NSEvent* nsEvent, NPCocoaEventType type) 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPCocoaEvent event; 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeEvent(&event, type); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.key.modifierFlags = [nsEvent modifierFlags]; 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.key.keyCode = [nsEvent keyCode]; 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.key.isARepeat = [nsEvent isARepeat]; 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.key.characters = (NPNSString *)[nsEvent characters]; 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.key.charactersIgnoringModifiers = (NPNSString *)[nsEvent charactersIgnoringModifiers]; 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return sendEvent(&event); 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::windowFocusChanged(bool hasFocus) 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPCocoaEvent event; 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeEvent(&event, NPCocoaEventWindowFocusChanged); 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.focus.hasFocus = hasFocus; 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendEvent(&event); 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCocoa::focusChanged(bool hasFocus) 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPCocoaEvent event; 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeEvent(&event, NPCocoaEventFocusChanged); 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.data.focus.hasFocus = hasFocus; 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendEvent(&event); 206563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 207563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (hasFocus) 208563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark installKeyEventHandler(); 209563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark else 210563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark removeKeyEventHandler(); 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid* WebNetscapePluginEventHandlerCocoa::platformWindow(NSWindow* window) 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return window; 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCocoa::sendEvent(NPCocoaEvent* event) 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (event->type) { 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPCocoaEventMouseDown: 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPCocoaEventMouseUp: 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPCocoaEventMouseDragged: 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPCocoaEventKeyDown: 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPCocoaEventKeyUp: 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPCocoaEventFlagsChanged: 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NPCocoaEventScrollWheel: 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_currentEventIsUserGesture = true; 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_currentEventIsUserGesture = false; 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool result = [m_pluginView sendEvent:event isDrawRect:event->type == NPCocoaEventDrawRect]; 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_currentEventIsUserGesture = false; 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 240563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#ifndef __LP64__ 241563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid WebNetscapePluginEventHandlerCocoa::installKeyEventHandler() 243563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark static const EventTypeSpec TSMEvents[] = 245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } 247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark }; 248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!m_keyEventHandler) 250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark InstallEventHandler(GetWindowEventTarget((WindowRef)[[m_pluginView window] windowRef]), 251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark NewEventHandlerUPP(TSMEventHandler), 252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark GetEventTypeCount(TSMEvents), 253563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark TSMEvents, 254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark this, 255563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark &m_keyEventHandler); 256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid WebNetscapePluginEventHandlerCocoa::removeKeyEventHandler() 259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (m_keyEventHandler) { 261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark RemoveEventHandler(m_keyEventHandler); 262563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_keyEventHandler = 0; 263563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 264563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 265563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 266563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkOSStatus WebNetscapePluginEventHandlerCocoa::TSMEventHandler(EventHandlerCallRef inHandlerRef, EventRef event, void* eventHandler) 267563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 268563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return static_cast<WebNetscapePluginEventHandlerCocoa*>(eventHandler)->handleTSMEvent(event); 269563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 270563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 271563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkOSStatus WebNetscapePluginEventHandlerCocoa::handleTSMEvent(EventRef eventRef) 272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 273563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark ASSERT(GetEventKind(eventRef) == kEventTextInputUnicodeForKeyEvent); 274563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 275563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark // Get the text buffer size. 276563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark ByteCount size; 277563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark OSStatus result = GetEventParameter(eventRef, kEventParamTextInputSendText, typeUnicodeText, 0, 0, &size, 0); 278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (result != noErr) 279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return result; 280563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 281563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark unsigned length = size / sizeof(UniChar); 282563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark Vector<UniChar, 16> characters(length); 283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark // Now get the actual text. 285563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark result = GetEventParameter(eventRef, kEventParamTextInputSendText, typeUnicodeText, 0, size, 0, characters.data()); 286563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (result != noErr) 287563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return result; 288563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 289563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark RetainPtr<CFStringRef> text(AdoptCF, CFStringCreateWithCharacters(0, characters.data(), length)); 290563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 291563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark NPCocoaEvent event; 292563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 293563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark initializeEvent(&event, NPCocoaEventTextInput); 294563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark event.data.text.text = (NPNSString*)text.get(); 295563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 296563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark sendEvent(&event); 297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return noErr; 299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif // __LP64__ 302563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(NETSCAPE_PLUGIN_API) 304