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