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