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) && !defined(__LP64__) 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNetscapePluginEventHandlerCarbon.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebNetscapePluginView.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitLogging.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitSystemInterface.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Send null events 50 times a second when active, so plug-ins like Flash get high frame rates. 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define NullEventIntervalActive 0.02 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define NullEventIntervalNotActive 0.25 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWebNetscapePluginEventHandlerCarbon::WebNetscapePluginEventHandlerCarbon(WebNetscapePluginView* pluginView) 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : WebNetscapePluginEventHandler(pluginView) 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_keyEventHandler(0) 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_suspendKeyUpEvents(false) 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void getCarbonEvent(EventRecord* carbonEvent) 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->what = nullEvent; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->message = 0; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->when = TickCount(); 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetGlobalMouse(&carbonEvent->where); 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->modifiers = GetCurrentKeyModifiers(); 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!Button()) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->modifiers |= btnState; 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic EventModifiers modifiersForEvent(NSEvent *event) 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventModifiers modifiers; 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned int modifierFlags = [event modifierFlags]; 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEventType eventType = [event type]; 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modifiers = 0; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (eventType != NSLeftMouseDown && eventType != NSRightMouseDown) 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modifiers |= btnState; 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (modifierFlags & NSCommandKeyMask) 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modifiers |= cmdKey; 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (modifierFlags & NSShiftKeyMask) 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modifiers |= shiftKey; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (modifierFlags & NSAlphaShiftKeyMask) 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modifiers |= alphaLock; 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (modifierFlags & NSAlternateKeyMask) 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modifiers |= optionKey; 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (modifierFlags & NSControlKeyMask || eventType == NSRightMouseDown) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modifiers |= controlKey; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return modifiers; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void getCarbonEvent(EventRecord *carbonEvent, NSEvent *cocoaEvent) 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (WKConvertNSEventToCarbonEvent(carbonEvent, cocoaEvent)) 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSPoint where = [[cocoaEvent window] convertBaseToScreen:[cocoaEvent locationInWindow]]; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->what = nullEvent; 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->message = 0; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->when = (UInt32)([cocoaEvent timestamp] * 60); // seconds to ticks 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->where.h = (short)where.x; 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->where.v = (short)(NSMaxY([[[NSScreen screens] objectAtIndex:0] frame]) - where.y); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonEvent->modifiers = modifiersForEvent(cocoaEvent); 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::sendNullEvent() 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRecord event; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getCarbonEvent(&event); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Plug-in should not react to cursor position when not active or when a menu is down. 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MenuTrackingData trackingData; 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus error = GetMenuTrackingData(NULL, &trackingData); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Plug-in should not react to cursor position when the actual window is not key. 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (![[m_pluginView window] isKeyWindow] || (error == noErr && trackingData.menu)) { 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Does passing a v and h of -1 really prevent it from reacting to the cursor position? 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.where.v = -1; 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.where.h = -1; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendEvent(&event); 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebNetscapePluginEventHandlerCarbon::drawRect(CGContextRef, const NSRect&) 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRecord event; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getCarbonEvent(&event); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.what = updateEvt; 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowRef windowRef = (WindowRef)[[m_pluginView window] windowRef]; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.message = (unsigned long)windowRef; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL acceptedEvent; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project acceptedEvent = sendEvent(&event); 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(PluginEvents, "NPP_HandleEvent(updateEvt): %d", acceptedEvent); 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::mouseDown(NSEvent* theEvent) 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRecord event; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getCarbonEvent(&event, theEvent); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.what = ::mouseDown; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL acceptedEvent; 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project acceptedEvent = sendEvent(&event); 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(PluginEvents, "NPP_HandleEvent(mouseDown): %d pt.v=%d, pt.h=%d", acceptedEvent, event.where.v, event.where.h); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::mouseUp(NSEvent* theEvent) 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRecord event; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getCarbonEvent(&event, theEvent); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.what = ::mouseUp; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL acceptedEvent; 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project acceptedEvent = sendEvent(&event); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(PluginEvents, "NPP_HandleEvent(mouseUp): %d pt.v=%d, pt.h=%d", acceptedEvent, event.where.v, event.where.h); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCarbon::scrollWheel(NSEvent* theEvent) 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::mouseEntered(NSEvent* theEvent) 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRecord event; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getCarbonEvent(&event, theEvent); 172a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch event.what = NPEventType_AdjustCursorEvent; 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL acceptedEvent; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project acceptedEvent = sendEvent(&event); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(PluginEvents, "NPP_HandleEvent(mouseEntered): %d", acceptedEvent); 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::mouseExited(NSEvent* theEvent) 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRecord event; 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getCarbonEvent(&event, theEvent); 185a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch event.what = NPEventType_AdjustCursorEvent; 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL acceptedEvent; 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project acceptedEvent = sendEvent(&event); 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(PluginEvents, "NPP_HandleEvent(mouseExited): %d", acceptedEvent); 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::mouseDragged(NSEvent*) 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebNetscapePluginEventHandlerCarbon::mouseMoved(NSEvent* theEvent) 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block EventRecord event; 200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block getCarbonEvent(&event, theEvent); 202a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch event.what = NPEventType_AdjustCursorEvent; 203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block BOOL acceptedEvent; 205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block acceptedEvent = sendEvent(&event); 206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block LOG(PluginEvents, "NPP_HandleEvent(mouseMoved): %d", acceptedEvent); 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::keyDown(NSEvent *theEvent) 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_suspendKeyUpEvents = true; 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WKSendKeyEventToTSM(theEvent); 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WebNetscapePluginEventHandlerCarbon::syntheticKeyDownWithCommandModifier(int keyCode, char character) 2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch EventRecord event; 2190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch getCarbonEvent(&event); 2200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch event.what = ::keyDown; 2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch event.modifiers |= cmdKey; 2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch event.message = keyCode << 8 | character; 2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sendEvent(&event); 2250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic UInt32 keyMessageForEvent(NSEvent *event) 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSData *data = [[event characters] dataUsingEncoding:CFStringConvertEncodingToNSStringEncoding(CFStringGetSystemEncoding())]; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!data) 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UInt8 characterCode; 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [data getBytes:&characterCode length:1]; 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UInt16 keyCode = [event keyCode]; 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return keyCode << 8 | characterCode; 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::keyUp(NSEvent* theEvent) 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WKSendKeyEventToTSM(theEvent); 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // TSM won't send keyUp events so we have to send them ourselves. 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Only send keyUp events after we receive the TSM callback because this is what plug-in expect from OS 9. 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_suspendKeyUpEvents) { 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRecord event; 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getCarbonEvent(&event, theEvent); 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.what = ::keyUp; 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (event.message == 0) 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.message = keyMessageForEvent(theEvent); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sendEvent(&event); 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::flagsChanged(NSEvent*) 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::focusChanged(bool hasFocus) 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRecord event; 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getCarbonEvent(&event); 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool acceptedEvent; 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasFocus) { 269a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch event.what = NPEventType_GetFocusEvent; 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project acceptedEvent = sendEvent(&event); 271a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch LOG(PluginEvents, "NPP_HandleEvent(NPEventType_GetFocusEvent): %d", acceptedEvent); 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project installKeyEventHandler(); 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 274a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch event.what = NPEventType_LoseFocusEvent; 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project acceptedEvent = sendEvent(&event); 276a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch LOG(PluginEvents, "NPP_HandleEvent(NPEventType_LoseFocusEvent): %d", acceptedEvent); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project removeKeyEventHandler(); 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::windowFocusChanged(bool hasFocus) 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WindowRef windowRef = (WindowRef)[[m_pluginView window] windowRef]; 284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project SetUserFocusWindow(windowRef); 286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRecord event; 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getCarbonEvent(&event); 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.what = activateEvt; 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.message = (unsigned long)windowRef; 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasFocus) 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project event.modifiers |= activeFlag; 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL acceptedEvent; 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project acceptedEvent = sendEvent(&event); 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(PluginEvents, "NPP_HandleEvent(activateEvent): %d isActive: %d", acceptedEvent, hasFocus); 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectOSStatus WebNetscapePluginEventHandlerCarbon::TSMEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEvent, void *eventHandler) 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRef rawKeyEventRef; 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus status = GetEventParameter(inEvent, kEventParamTextInputSendKeyboardEvent, typeEventRef, NULL, sizeof(EventRef), NULL, &rawKeyEventRef); 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (status != noErr) { 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ERROR("GetEventParameter failed with error: %d", status); 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Two-pass read to allocate/extract Mac charCodes 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ByteCount numBytes; 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project status = GetEventParameter(rawKeyEventRef, kEventParamKeyMacCharCodes, typeChar, NULL, 0, &numBytes, NULL); 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (status != noErr) { 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ERROR("GetEventParameter failed with error: %d", status); 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char *buffer = (char *)malloc(numBytes); 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project status = GetEventParameter(rawKeyEventRef, kEventParamKeyMacCharCodes, typeChar, NULL, numBytes, NULL, buffer); 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (status != noErr) { 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ERROR("GetEventParameter failed with error: %d", status); 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project free(buffer); 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRef cloneEvent = CopyEvent(rawKeyEventRef); 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned i; 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (i = 0; i < numBytes; i++) { 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project status = SetEventParameter(cloneEvent, kEventParamKeyMacCharCodes, typeChar, 1 /* one char code */, &buffer[i]); 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (status != noErr) { 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ERROR("SetEventParameter failed with error: %d", status); 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project free(buffer); 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRecord eventRec; 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ConvertEventRefToEventRecord(cloneEvent, &eventRec)) { 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL acceptedEvent; 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project acceptedEvent = static_cast<WebNetscapePluginEventHandlerCarbon*>(eventHandler)->sendEvent(&eventRec); 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(PluginEvents, "NPP_HandleEvent(keyDown): %d charCode:%c keyCode:%lu", 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project acceptedEvent, (char) (eventRec.message & charCodeMask), (eventRec.message & keyCodeMask)); 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We originally thought that if the plug-in didn't accept this event, 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we should pass it along so that keyboard scrolling, for example, will work. 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In practice, this is not a good idea, because plug-ins tend to eat the event but return false. 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // MacIE handles each key event twice because of this, but we will emulate the other browsers instead. 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ReleaseEvent(cloneEvent); 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project free(buffer); 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::installKeyEventHandler() 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static const EventTypeSpec sTSMEvents[] = 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_keyEventHandler) { 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project InstallEventHandler(GetWindowEventTarget((WindowRef)[[m_pluginView window] windowRef]), 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NewEventHandlerUPP(TSMEventHandler), 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventTypeCount(sTSMEvents), 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sTSMEvents, 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this, 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project &m_keyEventHandler); 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::removeKeyEventHandler() 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_keyEventHandler) { 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RemoveEventHandler(m_keyEventHandler); 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_keyEventHandler = 0; 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::nullEventTimerFired(CFRunLoopTimerRef timerRef, void *context) 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static_cast<WebNetscapePluginEventHandlerCarbon*>(context)->sendNullEvent(); 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::startTimers(bool throttleTimers) 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!m_nullEventTimer); 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFTimeInterval interval = !throttleTimers ? NullEventIntervalActive : NullEventIntervalNotActive; 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRunLoopTimerContext context = { 0, this, NULL, NULL, NULL }; 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_nullEventTimer.adoptCF(CFRunLoopTimerCreate(0, CFAbsoluteTimeGetCurrent() + interval, interval, 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 0, 0, nullEventTimerFired, &context)); 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRunLoopAddTimer(CFRunLoopGetCurrent(), m_nullEventTimer.get(), kCFRunLoopDefaultMode); 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebNetscapePluginEventHandlerCarbon::stopTimers() 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_nullEventTimer) 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRunLoopTimerInvalidate(m_nullEventTimer.get()); 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_nullEventTimer = 0; 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid* WebNetscapePluginEventHandlerCarbon::platformWindow(NSWindow* window) 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [window windowRef]; 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool WebNetscapePluginEventHandlerCarbon::sendEvent(EventRecord* event) 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If at any point the user clicks or presses a key from within a plugin, set the 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // currentEventIsUserGesture flag to true. This is important to differentiate legitimate 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // window.open() calls; we still want to allow those. See rdar://problem/4010765 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (event->what == ::mouseDown || event->what == ::keyDown || event->what == ::mouseUp || event->what == ::autoKey) 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_currentEventIsUserGesture = true; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_suspendKeyUpEvents = false; 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool result = [m_pluginView sendEvent:event isDrawRect:event->what == updateEvt]; 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_currentEventIsUserGesture = false; 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(NETSCAPE_PLUGIN_API) && !defined(__LP64__) 430