// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import #include "base/logging.h" #include "webkit/plugins/npapi/plugin_web_event_converter_mac.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" using WebKit::WebInputEvent; using WebKit::WebKeyboardEvent; using WebKit::WebMouseEvent; using WebKit::WebMouseWheelEvent; namespace webkit { namespace npapi { namespace { // Returns true if the given key is a modifier key. bool KeyIsModifier(int native_key_code) { switch (native_key_code) { case 55: // Left command case 54: // Right command case 58: // Left option case 61: // Right option case 59: // Left control case 62: // Right control case 56: // Left shift case 60: // Right shift case 57: // Caps lock return true; default: return false; } } // Returns true if the caps lock flag should be set for the given event. bool CapsLockIsActive(const WebInputEvent& event) { // Only key events have accurate information for the caps lock flag; see // . // For other types, use the live state. if (WebInputEvent::isKeyboardEventType(event.type)) return (event.modifiers & WebInputEvent::CapsLockOn) != 0; else return ([[NSApp currentEvent] modifierFlags] & NSAlphaShiftKeyMask) != 0; } } // namespace #pragma mark - PluginWebEventConverter::PluginWebEventConverter() { } PluginWebEventConverter::~PluginWebEventConverter() { } bool PluginWebEventConverter::InitWithEvent(const WebInputEvent& web_event) { memset(&cocoa_event_, 0, sizeof(cocoa_event_)); if (web_event.type == WebInputEvent::MouseWheel) { return ConvertMouseWheelEvent( *static_cast(&web_event)); } else if (WebInputEvent::isMouseEventType(web_event.type)) { return ConvertMouseEvent(*static_cast(&web_event)); } else if (WebInputEvent::isKeyboardEventType(web_event.type)) { return ConvertKeyboardEvent( *static_cast(&web_event)); } DLOG(WARNING) << "Unknown event type " << web_event.type; return false; } bool PluginWebEventConverter::ConvertKeyboardEvent( const WebKeyboardEvent& key_event) { cocoa_event_.data.key.keyCode = key_event.nativeKeyCode; cocoa_event_.data.key.modifierFlags |= CocoaModifiers(key_event); // Modifier keys have their own event type, and don't get character or // repeat data. if (KeyIsModifier(key_event.nativeKeyCode)) { cocoa_event_.type = NPCocoaEventFlagsChanged; return true; } cocoa_event_.data.key.characters = reinterpret_cast( [NSString stringWithFormat:@"%S", key_event.text]); cocoa_event_.data.key.charactersIgnoringModifiers = reinterpret_cast( [NSString stringWithFormat:@"%S", key_event.unmodifiedText]); if (key_event.modifiers & WebInputEvent::IsAutoRepeat) cocoa_event_.data.key.isARepeat = true; switch (key_event.type) { case WebInputEvent::KeyDown: cocoa_event_.type = NPCocoaEventKeyDown; return true; case WebInputEvent::KeyUp: cocoa_event_.type = NPCocoaEventKeyUp; return true; case WebInputEvent::RawKeyDown: case WebInputEvent::Char: // May be used eventually for IME, but currently not needed. return false; default: NOTREACHED(); return false; } } bool PluginWebEventConverter::ConvertMouseEvent( const WebMouseEvent& mouse_event) { cocoa_event_.data.mouse.pluginX = mouse_event.x; cocoa_event_.data.mouse.pluginY = mouse_event.y; cocoa_event_.data.mouse.modifierFlags |= CocoaModifiers(mouse_event); cocoa_event_.data.mouse.clickCount = mouse_event.clickCount; switch (mouse_event.button) { case WebMouseEvent::ButtonLeft: cocoa_event_.data.mouse.buttonNumber = 0; break; case WebMouseEvent::ButtonMiddle: cocoa_event_.data.mouse.buttonNumber = 2; break; case WebMouseEvent::ButtonRight: cocoa_event_.data.mouse.buttonNumber = 1; break; default: cocoa_event_.data.mouse.buttonNumber = mouse_event.button; break; } switch (mouse_event.type) { case WebInputEvent::MouseDown: cocoa_event_.type = NPCocoaEventMouseDown; return true; case WebInputEvent::MouseUp: cocoa_event_.type = NPCocoaEventMouseUp; return true; case WebInputEvent::MouseMove: { bool mouse_is_down = (mouse_event.modifiers & WebInputEvent::LeftButtonDown) || (mouse_event.modifiers & WebInputEvent::RightButtonDown) || (mouse_event.modifiers & WebInputEvent::MiddleButtonDown); cocoa_event_.type = mouse_is_down ? NPCocoaEventMouseDragged : NPCocoaEventMouseMoved; return true; } case WebInputEvent::MouseEnter: cocoa_event_.type = NPCocoaEventMouseEntered; return true; case WebInputEvent::MouseLeave: cocoa_event_.type = NPCocoaEventMouseExited; return true; default: NOTREACHED(); return false; } } bool PluginWebEventConverter::ConvertMouseWheelEvent( const WebMouseWheelEvent& wheel_event) { cocoa_event_.type = NPCocoaEventScrollWheel; cocoa_event_.data.mouse.pluginX = wheel_event.x; cocoa_event_.data.mouse.pluginY = wheel_event.y; cocoa_event_.data.mouse.modifierFlags |= CocoaModifiers(wheel_event); cocoa_event_.data.mouse.deltaX = wheel_event.deltaX; cocoa_event_.data.mouse.deltaY = wheel_event.deltaY; return true; } NSUInteger PluginWebEventConverter::CocoaModifiers( const WebInputEvent& web_event) { NSInteger modifiers = 0; if (web_event.modifiers & WebInputEvent::ControlKey) modifiers |= NSControlKeyMask; if (web_event.modifiers & WebInputEvent::ShiftKey) modifiers |= NSShiftKeyMask; if (web_event.modifiers & WebInputEvent::AltKey) modifiers |= NSAlternateKeyMask; if (web_event.modifiers & WebInputEvent::MetaKey) modifiers |= NSCommandKeyMask; if (CapsLockIsActive(web_event)) modifiers |= NSAlphaShiftKeyMask; return modifiers; } } // namespace npapi } // namespace webkit