render_widget_host_view_views.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be 3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file. 4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/renderer_host/render_widget_host_view_views.h" 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <algorithm> 8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <string> 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/command_line.h" 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/logging.h" 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/message_loop.h" 13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h" 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_number_conversions.h" 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/task.h" 16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/time.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/renderer_host/backing_store_skia.h" 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/renderer_host/backing_store_x.h" 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/renderer_host/render_widget_host.h" 20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/native_web_keyboard_event.h" 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/render_messages.h" 2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/result_codes.h" 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/gtk/WebInputEventFactory.h" 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/keycodes/keyboard_code_conversion_gtk.h" 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/x/x11_util.h" 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas.h" 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas_skia.h" 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/events/event.h" 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/ime/ime_context.h" 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "views/widget/widget.h" 3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "views/widget/widget_gtk.h" 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kMaxWindowWidth = 4000; 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kMaxWindowHeight = 4000; 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstatic const char kRenderWidgetHostViewKey[] = "__RENDER_WIDGET_HOST_VIEW__"; 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstatic const char kBackingStoreSkiaSwitch[] = "use-backing-store-skia"; 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copied from third_party/WebKit/Source/WebCore/page/EventHandler.cpp 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Match key code of composition keydown event on windows. 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// IE sends VK_PROCESSKEY which has value 229; 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Please refer to following documents for detals: 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// - Virtual-Key Codes 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// - How the IME System Works 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// http://msdn.microsoft.com/en-us/library/cc194848.aspx 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// - ImmGetVirtualKey Function 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// http://msdn.microsoft.com/en-us/library/dd318570(VS.85).aspx 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstatic const int kCompositionEventKeyCode = 229; 53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebInputEventFactory; 55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebMouseWheelEvent; 56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochusing WebKit::WebTouchEvent; 57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst char RenderWidgetHostViewViews::kViewClassName[] = 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "browser/renderer_host/RenderWidgetHostViewViews"; 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace { 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool UsingBackingStoreSkia() { 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static bool decided = false; 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static bool use_skia = false; 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!decided) { 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CommandLine* cmdline = CommandLine::ForCurrentProcess(); 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen use_skia = (cmdline && cmdline->HasSwitch(kBackingStoreSkiaSwitch)); 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen decided = true; 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return use_skia; 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickint WebInputEventFlagsFromViewsEvent(const views::Event& event) { 76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int modifiers = 0; 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (event.IsShiftDown()) 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick modifiers |= WebKit::WebInputEvent::ShiftKey; 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (event.IsControlDown()) 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick modifiers |= WebKit::WebInputEvent::ControlKey; 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (event.IsAltDown()) 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick modifiers |= WebKit::WebInputEvent::AltKey; 84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (event.IsCapsLockDown()) 85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch modifiers |= WebKit::WebInputEvent::CapsLockOn; 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return modifiers; 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochWebKit::WebTouchPoint::State TouchPointStateFromEvent( 91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const views::TouchEvent* event) { 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen switch (event->type()) { 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_PRESSED: 94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebTouchPoint::StatePressed; 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_RELEASED: 96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebTouchPoint::StateReleased; 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_MOVED: 98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebTouchPoint::StateMoved; 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_CANCELLED: 100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebTouchPoint::StateCancelled; 101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch default: 102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebTouchPoint::StateUndefined; 103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochWebKit::WebInputEvent::Type TouchEventTypeFromEvent( 107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const views::TouchEvent* event) { 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen switch (event->type()) { 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_PRESSED: 110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebInputEvent::TouchStart; 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_RELEASED: 112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebInputEvent::TouchEnd; 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_MOVED: 114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebInputEvent::TouchMove; 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_CANCELLED: 116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebInputEvent::TouchCancel; 117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch default: 118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return WebKit::WebInputEvent::Undefined; 119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid UpdateTouchPointPosition(const views::TouchEvent* event, 123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const gfx::Point& origin, 124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebKit::WebTouchPoint* tpoint) { 125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tpoint->position.x = event->x(); 126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tpoint->position.y = event->y(); 127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tpoint->screenPosition.x = tpoint->position.x + origin.x(); 129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tpoint->screenPosition.y = tpoint->position.y + origin.y(); 130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid InitializeWebMouseEventFromViewsEvent(const views::LocatedEvent& e, 133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const gfx::Point& origin, 134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebKit::WebMouseEvent* wmevent) { 135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmevent->timeStampSeconds = base::Time::Now().ToDoubleT(); 136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmevent->modifiers = WebInputEventFlagsFromViewsEvent(e); 137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmevent->windowX = wmevent->x = e.x(); 139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmevent->windowY = wmevent->y = e.y(); 140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmevent->globalX = wmevent->x + origin.x(); 141201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmevent->globalY = wmevent->y + origin.y(); 142201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace 145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass IMEContextHandler : public views::CommitTextListener, 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public views::CompositionListener, 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public views::ForwardKeyEventListener { 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public: 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen explicit IMEContextHandler( 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderWidgetHostViewViews* host_view) 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : host_view_(host_view), 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen is_enabled_(false), 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen is_focused_(false), 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_(views::IMEContext::Create(host_view_)) { 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->set_commit_text_listener(this); 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->set_composition_listener(this); 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->set_forward_key_event_listener(this); 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // IMEContext Listeners implementation 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void OnCommitText(views::IMEContext* sender, 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16& text) { 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(ime_context_ == sender); 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderWidgetHost* host = host_view_->GetRenderWidgetHost(); 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (host) { 16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendFakeCompositionWebKeyboardEvent(WebKit::WebInputEvent::RawKeyDown); 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host->ImeConfirmComposition(text); 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendFakeCompositionWebKeyboardEvent(WebKit::WebInputEvent::KeyUp); 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void OnStartComposition(views::IMEContext* sender) { 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(ime_context_ == sender); 17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void OnEndComposition(views::IMEContext* sender) { 17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(ime_context_ == sender); 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderWidgetHost* host = host_view_->GetRenderWidgetHost(); 18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (host) 18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host->ImeCancelComposition(); 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void OnSetComposition(views::IMEContext* sender, 18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16& text, 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const views::CompositionAttributeList& attributes, 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen uint32 cursor_pos) { 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(ime_context_ == sender); 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderWidgetHost* host = host_view_->GetRenderWidgetHost(); 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (host) { 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendFakeCompositionWebKeyboardEvent(WebKit::WebInputEvent::RawKeyDown); 19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Cast CompositonAttribute to WebKit::WebCompositionUnderline directly, 19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // becasue CompositionAttribute is duplicated from 19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // WebKit::WebCompositionUnderline. 19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::vector<WebKit::WebCompositionUnderline>& underlines = 20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen reinterpret_cast<const std::vector<WebKit::WebCompositionUnderline>&>( 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen attributes); 20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host->ImeSetComposition(text, underlines, cursor_pos, cursor_pos); 20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendFakeCompositionWebKeyboardEvent(WebKit::WebInputEvent::KeyUp); 20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void OnForwardKeyEvent(views::IMEContext* sender, 20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const views::KeyEvent& event) { 20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(ime_context_ == sender); 21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host_view_->ForwardKeyEvent(event); 21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool FilterKeyEvent(const views::KeyEvent& event) { 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return is_enabled_ && ime_context_->FilterKeyEvent(event); 21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void Focus() { 21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!is_focused_) { 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->Focus(); 22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen is_focused_ = true; 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Enables RenderWidget's IME related events, so that we can be notified 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // when WebKit wants to enable or disable IME. 22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderWidgetHost* host = host_view_->GetRenderWidgetHost(); 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (host) 22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host->SetInputMethodActive(true); 22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void Blur() { 23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (is_focused_) { 23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->Blur(); 23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen is_focused_ = false; 23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Disable RenderWidget's IME related events to save bandwidth. 23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderWidgetHost* host = host_view_->GetRenderWidgetHost(); 23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (host) 24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host->SetInputMethodActive(false); 24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void ImeUpdateTextInputState(WebKit::WebTextInputType type, 24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const gfx::Rect& caret_rect) { 24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool enable = 24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen (type != WebKit::WebTextInputTypeNone) && 24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen (type != WebKit::WebTextInputTypePassword); 24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (is_enabled_ != enable) { 25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen is_enabled_ = enable; 25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (is_focused_) { 25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (is_enabled_) 25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->Focus(); 25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen else 25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->Blur(); 25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (is_enabled_) { 26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen gfx::Point p(caret_rect.origin()); 26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::View::ConvertPointToScreen(host_view_, &p); 26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->SetCursorLocation(gfx::Rect(p, caret_rect.size())); 26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void Reset() { 26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->Reset(); 26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private: 27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void SendFakeCompositionWebKeyboardEvent(WebKit::WebInputEvent::Type type) { 27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NativeWebKeyboardEvent fake_event; 27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen fake_event.windowsKeyCode = kCompositionEventKeyCode; 27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen fake_event.skip_in_browser = true; 27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen fake_event.type = type; 27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host_view_->ForwardWebKeyboardEvent(fake_event); 27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private: 28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RenderWidgetHostViewViews* host_view_; 28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool is_enabled_; 28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool is_focused_; 28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_ptr<views::IMEContext> ime_context_; 28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DISALLOW_COPY_AND_ASSIGN(IMEContextHandler); 28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}; 28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static 290731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( 291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RenderWidgetHost* widget) { 292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return new RenderWidgetHostViewViews(widget); 293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 295731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostViewViews::RenderWidgetHostViewViews(RenderWidgetHost* host) 296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : host_(host), 297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick about_to_validate_and_paint_(false), 298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_hidden_(false), 299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_loading_(false), 300201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch native_cursor_(NULL), 301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_showing_context_menu_(false), 302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch visually_deemphasized_(false), 30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen touch_event_() { 304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetFocusable(true); 305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick host_->set_view(this); 306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 308731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostViewViews::~RenderWidgetHostViewViews() { 309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::InitAsChild() { 312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Show(); 31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_.reset(new IMEContextHandler(this)); 314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 316731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHost* RenderWidgetHostViewViews::GetRenderWidgetHost() const { 317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return host_; 318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::InitAsPopup( 321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RenderWidgetHostView* parent_host_view, 322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const gfx::Rect& pos) { 323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): figure out cases where popups occur and implement 324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTIMPLEMENTED(); 325731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 32772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid RenderWidgetHostViewViews::InitAsFullscreen() { 328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTIMPLEMENTED(); 329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidBecomeSelected() { 332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!is_hidden_) 333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (tab_switch_paint_time_.is_null()) 336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick tab_switch_paint_time_ = base::TimeTicks::Now(); 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_hidden_ = false; 338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick host_->WasRestored(); 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::WasHidden() { 342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (is_hidden_) 343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If we receive any more paint messages while we are hidden, we want to 346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // ignore them so we don't re-allocate the backing store. We will paint 347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // everything again when we become selected again. 348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_hidden_ = true; 349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If we have a renderer, then inform it that we are being hidden so it can 351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // reduce its resource utilization. 352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetRenderWidgetHost()->WasHidden(); 353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetSize(const gfx::Size& size) { 356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // This is called when webkit has sent us a Move message. 357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int width = std::min(size.width(), kMaxWindowWidth); 358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int height = std::min(size.height(), kMaxWindowHeight); 359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (requested_size_.width() != width || 360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick requested_size_.height() != height) { 361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick requested_size_ = gfx::Size(width, height); 36272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SetBounds(x(), y(), width, height); 363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick host_->WasResized(); 364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::MovePluginWindows( 36821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const std::vector<webkit::npapi::WebPluginGeometry>& moves) { 369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): NIY 37021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // NOTIMPLEMENTED(); 371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Focus() { 374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RequestFocus(); 375731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 376731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::HasFocus() { 378731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return View::HasFocus(); 379731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 381731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Show() { 382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetVisible(true); 383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 385731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Hide() { 386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SetVisible(false); 387731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 388731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 389731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Blur() { 390731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(estade): We should be clearing native focus as well, but I know of no 391731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // way to do that without focusing another widget. 392731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick host_->Blur(); 393731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 394731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 395731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::IsShowing() { 396731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return IsVisible(); 397731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 398731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 399731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::Rect RenderWidgetHostViewViews::GetViewBounds() const { 400731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return bounds(); 401731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 403731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::UpdateCursor(const WebCursor& cursor) { 404731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Optimize the common case, where the cursor hasn't changed. 405731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // However, we can switch between different pixmaps, so only on the 406731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // non-pixmap branch. 407731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (current_cursor_.GetCursorType() != GDK_CURSOR_IS_PIXMAP && 408731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick current_cursor_.GetCursorType() == cursor.GetCursorType()) { 409731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 410731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 411731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 412731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick current_cursor_ = cursor; 413731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowCurrentCursor(); 414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 415731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetIsLoading(bool is_loading) { 417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_loading_ = is_loading; 418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Only call ShowCurrentCursor() when it will actually change the cursor. 419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (current_cursor_.GetCursorType() == GDK_LAST_CURSOR) 420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowCurrentCursor(); 421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 422731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 423731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ImeUpdateTextInputState( 424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebTextInputType type, 425731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const gfx::Rect& caret_rect) { 42672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->ImeUpdateTextInputState(type, caret_rect); 427731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 428731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 429731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ImeCancelComposition() { 43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->Reset(); 431731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidUpdateBackingStore( 434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy, 435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::vector<gfx::Rect>& copy_rects) { 436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (is_hidden_) 437731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 439731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(darin): Implement the equivalent of Win32's ScrollWindowEX. Can that 440731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // be done using XCopyArea? Perhaps similar to 441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // BackingStore::ScrollBackingStore? 442731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (about_to_validate_and_paint_) 443731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick invalid_rect_ = invalid_rect_.Union(scroll_rect); 444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick else 445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SchedulePaint(scroll_rect, false); 446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (size_t i = 0; i < copy_rects.size(); ++i) { 448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Avoid double painting. NOTE: This is only relevant given the call to 449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Paint(scroll_rect) above. 450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::Rect rect = copy_rects[i].Subtract(scroll_rect); 451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (rect.IsEmpty()) 452731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick continue; 453731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (about_to_validate_and_paint_) 455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick invalid_rect_ = invalid_rect_.Union(rect); 456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick else 457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SchedulePaint(rect, false); 458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen invalid_rect_ = invalid_rect_.Intersect(bounds()); 460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 46221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid RenderWidgetHostViewViews::RenderViewGone(base::TerminationStatus status, 46321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int error_code) { 464513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GetRenderWidgetHost()->ViewDestroyed(); 465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Destroy(); 466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Destroy() { 46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // host_'s destruction brought us here, null it out so we don't use it 47072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host_ = NULL; 47172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 47272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (parent()) 47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen parent()->RemoveChildView(this); 47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MessageLoop::current()->DeleteSoon(FROM_HERE, this); 475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetTooltipText(const std::wstring& tip) { 478731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): decide if we want tooltips for touch (none specified 479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // right now/might want a press-and-hold display) 480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // NOTIMPLEMENTED(); ... too annoying, it triggers for every mousemove 481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SelectionChanged(const std::string& text) { 484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): deal with the clipboard without GTK 485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTIMPLEMENTED(); 486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ShowingContextMenu(bool showing) { 489731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick is_showing_context_menu_ = showing; 490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::NeedsInputGrab() { 493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return popup_type_ == WebKit::WebPopupTypeSelect; 494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 495731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 496731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::IsPopup() { 497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return popup_type_ != WebKit::WebPopupTypeNone; 498731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 499731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 500731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBackingStore* RenderWidgetHostViewViews::AllocBackingStore( 501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const gfx::Size& size) { 50272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen gfx::NativeView nview = GetInnerNativeView(); 50372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!nview) 50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return NULL; 50572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 50672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (UsingBackingStoreSkia()) { 50772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return new BackingStoreSkia(host_, size); 50872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return new BackingStoreX(host_, size, 51072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::GetVisualFromGtkWidget(nview), 51172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen gtk_widget_get_visual(nview)->depth); 51272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 513731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 514731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 51572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsengfx::NativeView RenderWidgetHostViewViews::GetInnerNativeView() const { 51621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // TODO(sad): Ideally this function should be equivalent to GetNativeView, and 51721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // WidgetGtk-specific function call should not be necessary. 51872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const views::WidgetGtk* widget = 51972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<const views::WidgetGtk*>(GetWidget()); 52021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return widget ? widget->window_contents() : NULL; 52121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 52221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 52321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsengfx::NativeView RenderWidgetHostViewViews::GetNativeView() { 524201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (GetWidget()) 525201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return GetWidget()->GetNativeView(); 526201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return NULL; 527731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 528731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetBackground(const SkBitmap& background) { 530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RenderWidgetHostView::SetBackground(background); 531731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick host_->Send(new ViewMsg_SetBackground(host_->routing_id(), background)); 532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Paint(gfx::Canvas* canvas) { 535201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (is_hidden_) { 536201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return; 537201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 538201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 539201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Paint a "hole" in the canvas so that the render of the web page is on 540201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // top of whatever else has already been painted in the views hierarchy. 541201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Later views might still get to paint on top. 54272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen canvas->FillRectInt(SK_ColorBLACK, 0, 0, 54372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bounds().width(), bounds().height(), 544201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch SkXfermode::kClear_Mode); 545201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 546731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Don't do any painting if the GPU process is rendering directly 547731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // into the View. 548731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RenderWidgetHost* render_widget_host = GetRenderWidgetHost(); 549201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (render_widget_host->is_accelerated_compositing_active()) { 550731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 551731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 552731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 55372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GdkWindow* window = GetInnerNativeView()->window; 554731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(!about_to_validate_and_paint_); 555731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 556731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): get the damage somehow 557513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // invalid_rect_ = damage_rect; 558731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick invalid_rect_ = bounds(); 559201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch gfx::Point origin; 560201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ConvertPointToWidget(this, &origin); 561201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 562731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick about_to_validate_and_paint_ = true; 56372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BackingStore* backing_store = host_->GetBackingStore(true); 564731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Calling GetBackingStore maybe have changed |invalid_rect_|... 565731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick about_to_validate_and_paint_ = false; 566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::Rect paint_rect = gfx::Rect(0, 0, kMaxWindowWidth, kMaxWindowHeight); 568731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick paint_rect = paint_rect.Intersect(invalid_rect_); 569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (backing_store) { 571731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Only render the widget if it is attached to a window; there's a short 572731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // period where this object isn't attached to a window but hasn't been 573731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Destroy()ed yet and it receives paint messages... 574731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (window) { 575731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!visually_deemphasized_) { 576731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // In the common case, use XCopyArea. We don't draw more than once, so 577731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // we don't need to double buffer. 57872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 57972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (UsingBackingStoreSkia()) { 58072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<BackingStoreSkia*>(backing_store)->SkiaShowRect( 58172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen gfx::Point(paint_rect.x(), paint_rect.y()), canvas); 58272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 58372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<BackingStoreX*>(backing_store)->XShowRect(origin, 58472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen paint_rect, ui::GetX11WindowFromGdkWindow(window)); 58572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 58672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else if (!UsingBackingStoreSkia()) { 587731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If the grey blend is showing, we make two drawing calls. Use double 588731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // buffering to prevent flicker. Use CairoShowRect because XShowRect 589731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // shortcuts GDK's double buffering. 590731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GdkRectangle rect = { paint_rect.x(), paint_rect.y(), 591731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick paint_rect.width(), paint_rect.height() }; 592731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gdk_window_begin_paint_rect(window, &rect); 593731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 59472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<BackingStoreX*>(backing_store)->CairoShowRect( 59572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen paint_rect, GDK_DRAWABLE(window)); 596731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 597731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cairo_t* cr = gdk_cairo_create(window); 598731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gdk_cairo_rectangle(cr, &rect); 599731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cairo_set_source_rgba(cr, 0, 0, 0, 0.7); 600731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cairo_fill(cr); 601731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cairo_destroy(cr); 602731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 603731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gdk_window_end_paint(window); 60472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 60572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TODO(sad) 60672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NOTIMPLEMENTED(); 607731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 608731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 609731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!whiteout_start_time_.is_null()) { 610731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick base::TimeDelta whiteout_duration = base::TimeTicks::Now() - 611731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick whiteout_start_time_; 612731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick UMA_HISTOGRAM_TIMES("MPArch.RWHH_WhiteoutDuration", whiteout_duration); 613731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 614731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Reset the start time to 0 so that we start recording again the next 615731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // time the backing store is NULL... 616731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick whiteout_start_time_ = base::TimeTicks(); 617731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 618731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!tab_switch_paint_time_.is_null()) { 619731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick base::TimeDelta tab_switch_paint_duration = base::TimeTicks::Now() - 620731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick tab_switch_paint_time_; 621731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick UMA_HISTOGRAM_TIMES("MPArch.RWH_TabSwitchPaintDuration", 622731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick tab_switch_paint_duration); 623731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Reset tab_switch_paint_time_ to 0 so future tab selections are 624731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // recorded. 625731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick tab_switch_paint_time_ = base::TimeTicks(); 626731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 627731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 628731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (whiteout_start_time_.is_null()) 629731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick whiteout_start_time_ = base::TimeTicks::Now(); 630731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 631731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 632731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 633201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochgfx::NativeCursor RenderWidgetHostViewViews::GetCursorForPoint( 63472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::EventType type, const gfx::Point& point) { 635201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return native_cursor_; 636201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 637201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 638731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMousePressed(const views::MouseEvent& event) { 639731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RequestFocus(); 640731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 641731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): validate event generation. 642731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event); 643731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 644731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): deal with double clicks 645731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick e.type = WebKit::WebInputEvent::MouseDown; 646731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick e.clickCount = 1; 647731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 648731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetRenderWidgetHost()->ForwardMouseEvent(e); 649731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return true; 650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 652731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseReleased(const views::MouseEvent& event, 653731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool canceled) { 654731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event); 655731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 656731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick e.type = WebKit::WebInputEvent::MouseUp; 657731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick e.clickCount = 1; 658731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 659731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetRenderWidgetHost()->ForwardMouseEvent(e); 660731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 661731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 662731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMouseDragged(const views::MouseEvent& event) { 663731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick OnMouseMoved(event); 664731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return true; 665731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 666731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 667731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseMoved(const views::MouseEvent& event) { 668731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event); 669731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 670731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick e.type = WebKit::WebInputEvent::MouseMove; 671731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 672731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetRenderWidgetHost()->ForwardMouseEvent(e); 673731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 674731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 675731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseEntered(const views::MouseEvent& event) { 676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Already generated synthetically by webkit. 677731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 678731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 679731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseExited(const views::MouseEvent& event) { 680731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Already generated synthetically by webkit. 681731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 682731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 683731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMouseWheel(const views::MouseWheelEvent& e) { 684201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebMouseWheelEvent wmwe; 68572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitializeWebMouseEventFromViewsEvent(e, GetMirroredPosition(), &wmwe); 686201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 687201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmwe.type = WebKit::WebInputEvent::MouseWheel; 688201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmwe.button = WebKit::WebMouseEvent::ButtonNone; 689201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 690201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // TODO(sadrul): How do we determine if it's a horizontal scroll? 69172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wmwe.deltaY = e.offset(); 692201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch wmwe.wheelTicksY = wmwe.deltaY > 0 ? 1 : -1; 693201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 694201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch GetRenderWidgetHost()->ForwardWheelEvent(wmwe); 695201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return true; 696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 697731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 69872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool RenderWidgetHostViewViews::OnKeyPressed(const views::KeyEvent& e) { 69972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!ime_context_->FilterKeyEvent(e)) 70072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ForwardKeyEvent(e); 701731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TRUE; 702731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 703731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 70472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool RenderWidgetHostViewViews::OnKeyReleased(const views::KeyEvent& e) { 70572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!ime_context_->FilterKeyEvent(e)) 70672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ForwardKeyEvent(e); 707731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TRUE; 708731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 709731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 710731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidGainFocus() { 711731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if 0 712731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): - is this needed/replicable? 713731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Comes from the GTK equivalent. 714731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 715731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int x, y; 716731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gtk_widget_get_pointer(native_view(), &x, &y); 717731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // http://crbug.com/13389 718731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If the cursor is in the render view, fake a mouse move event so that 719731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // webkit updates its state. Otherwise webkit might think the cursor is 720731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // somewhere it's not. 721731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (x >= 0 && y >= 0 && x < native_view()->allocation.width && 722731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick y < native_view()->allocation.height) { 723731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebMouseEvent fake_event; 724731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_event.timeStampSeconds = base::Time::Now().ToDoubleT(); 725731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_event.modifiers = 0; 726731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_event.windowX = fake_event.x = x; 727731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_event.windowY = fake_event.y = y; 728731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gdk_window_get_origin(native_view()->window, &x, &y); 729731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_event.globalX = fake_event.x + x; 730731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_event.globalY = fake_event.y + y; 731731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_event.type = WebKit::WebInputEvent::MouseMove; 732731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fake_event.button = WebKit::WebMouseEvent::ButtonNone; 733731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetRenderWidgetHost()->ForwardMouseEvent(fake_event); 734731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 735731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 73672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->Focus(); 737731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowCurrentCursor(); 738731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetRenderWidgetHost()->GotFocus(); 739731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 740731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 741731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::WillLoseFocus() { 742731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If we are showing a context menu, maintain the illusion that webkit has 743731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // focus. 74472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!is_showing_context_menu_ && !is_hidden_ && host_) 74572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen host_->Blur(); 74672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ime_context_->Blur(); 747731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 748731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 749731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 750731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ShowCurrentCursor() { 751731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The widget may not have a window. If that's the case, abort mission. This 752731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // is the same issue as that explained above in Paint(). 75372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!GetInnerNativeView() || !GetInnerNativeView()->window) 754731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 755731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 756201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch native_cursor_ = current_cursor_.GetNativeCursor(); 757731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 758731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 759731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::CreatePluginContainer( 760731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::PluginWindowHandle id) { 761731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): plugin_container_manager_.CreatePluginContainer(id); 762731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 763731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 764731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DestroyPluginContainer( 765731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::PluginWindowHandle id) { 766731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao): plugin_container_manager_.DestroyPluginContainer(id); 767731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 768731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 769201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid RenderWidgetHostViewViews::SetVisuallyDeemphasized( 770201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const SkColor* color, bool animate) { 771731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(anicolao) 772731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 773731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 774731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::ContainsNativeView( 775731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::NativeView native_view) const { 776731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(port) 777731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTREACHED() << 778731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "RenderWidgetHostViewViews::ContainsNativeView not implemented."; 779731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return false; 780731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 781731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 782201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid RenderWidgetHostViewViews::AcceleratedCompositingActivated( 783201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool activated) { 784201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // TODO(anicolao): figure out if we need something here 785201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (activated) 786201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch NOTIMPLEMENTED(); 787201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 788201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 789731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickWebKit::WebMouseEvent RenderWidgetHostViewViews::WebMouseEventFromViewsEvent( 790731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const views::MouseEvent& event) { 791731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebMouseEvent wmevent; 79272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitializeWebMouseEventFromViewsEvent(event, GetMirroredPosition(), &wmevent); 793731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 794731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Setting |wmevent.button| is not necessary for -move events, but it is 795731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // necessary for -clicks and -drags. 796731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (event.IsMiddleMouseButton()) { 797731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick wmevent.modifiers |= WebKit::WebInputEvent::MiddleButtonDown; 798731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick wmevent.button = WebKit::WebMouseEvent::ButtonMiddle; 799731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 800731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (event.IsRightMouseButton()) { 801731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick wmevent.modifiers |= WebKit::WebInputEvent::RightButtonDown; 802731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick wmevent.button = WebKit::WebMouseEvent::ButtonRight; 803731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 804731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (event.IsLeftMouseButton()) { 805731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick wmevent.modifiers |= WebKit::WebInputEvent::LeftButtonDown; 806731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick wmevent.button = WebKit::WebMouseEvent::ButtonLeft; 807731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 808731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 809731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return wmevent; 810731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 811731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 81272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid RenderWidgetHostViewViews::ForwardKeyEvent( 81372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const views::KeyEvent& event) { 81472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // This is how it works: 81572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // (1) If a RawKeyDown event is an accelerator for a reserved command (see 81672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Browser::IsReservedCommand), then the command is executed. Otherwise, 81772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // the event is first sent off to the renderer. The renderer is also 81872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // notified whether the event would trigger an accelerator in the browser. 81972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // (2) A Char event is then sent to the renderer. 82072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // (3) If the renderer does not process the event in step (1), and the event 82172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // triggers an accelerator, then it will ignore the event in step (2). The 82272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // renderer also sends back notification to the browser for both steps (1) 82372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // and (2) about whether the events were processed or not. If the event 82472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // for (1) is not processed by the renderer, then it is processed by the 82572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // browser, and (2) is ignored. 82672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (event.type() == ui::ET_KEY_PRESSED) { 82772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NativeWebKeyboardEvent wke; 82872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 82972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wke.type = WebKit::WebInputEvent::RawKeyDown; 83072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wke.windowsKeyCode = event.key_code(); 83172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wke.setKeyIdentifierFromWindowsKeyCode(); 83272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 83372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int keyval = ui::GdkKeyCodeForWindowsKeyCode(event.key_code(), 83472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event.IsShiftDown() ^ event.IsCapsLockDown()); 83572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 83672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wke.text[0] = wke.unmodifiedText[0] = 83772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<unsigned short>(gdk_keyval_to_unicode(keyval)); 83872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 83972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wke.modifiers = WebInputEventFlagsFromViewsEvent(event); 84072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 84172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ForwardWebKeyboardEvent(wke); 84272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 84372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wke.type = WebKit::WebInputEvent::Char; 84472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ForwardWebKeyboardEvent(wke); 84572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 84672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NativeWebKeyboardEvent wke; 84772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 84872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wke.type = WebKit::WebInputEvent::KeyUp; 84972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wke.windowsKeyCode = event.key_code(); 85072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wke.setKeyIdentifierFromWindowsKeyCode(); 85172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ForwardWebKeyboardEvent(wke); 85272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 85372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 85472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 85572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid RenderWidgetHostViewViews::ForwardWebKeyboardEvent( 856731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const NativeWebKeyboardEvent& event) { 857731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!host_) 858731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 859731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 860731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EditCommands edit_commands; 861731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if 0 86272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TODO(bryeung): key bindings 863731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!event.skip_in_browser && 864731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick key_bindings_handler_->Match(event, &edit_commands)) { 865731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick host_->ForwardEditCommandsForNextKeyEvent(edit_commands); 866731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 867731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 86872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 869731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick host_->ForwardKeyboardEvent(event); 870731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 871731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 87272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenviews::View::TouchStatus RenderWidgetHostViewViews::OnTouchEvent( 87372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const views::TouchEvent& e) { 874201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Update the list of touch points first. 875201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebKit::WebTouchPoint* point = NULL; 87672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TouchStatus status = TOUCH_STATUS_UNKNOWN; 877201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 87872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen switch (e.type()) { 87972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_PRESSED: 880201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Add a new touch point. 881201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (touch_event_.touchPointsLength < 882201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebTouchEvent::touchPointsLengthCap) { 883201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch point = &touch_event_.touchPoints[touch_event_.touchPointsLength++]; 884201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch point->id = e.identity(); 88572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 88672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (touch_event_.touchPointsLength == 1) { 88772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // A new touch sequence has started. 88872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen status = TOUCH_STATUS_START; 88972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 89072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We also want the focus. 89172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RequestFocus(); 89272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 893201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 894201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch break; 89572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_RELEASED: 89672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_CANCELLED: 89772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case ui::ET_TOUCH_MOVED: { 898201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The touch point should have been added to the event from an earlier 899201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // _PRESSED event. So find that. 900201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // At the moment, only a maximum of 4 touch-points are allowed. So a 901201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // simple loop should be sufficient. 90272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (int i = 0; i < touch_event_.touchPointsLength; ++i) { 903201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch point = touch_event_.touchPoints + i; 904201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (point->id == e.identity()) { 905201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch break; 906201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 907201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch point = NULL; 908201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 909201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch break; 910201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 911201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch default: 91272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DLOG(WARNING) << "Unknown touch event " << e.type(); 913201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch break; 914201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 915201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 916201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (!point) 91772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return TOUCH_STATUS_UNKNOWN; 91872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 91972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (status != TOUCH_STATUS_START) 92072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen status = TOUCH_STATUS_CONTINUE; 921201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 922201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Update the location and state of the point. 923201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch point->state = TouchPointStateFromEvent(&e); 92472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (point->state == WebKit::WebTouchPoint::StateMoved) { 92572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // It is possible for badly written touch drivers to emit Move events even 92672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // when the touch location hasn't changed. In such cases, consume the event 92772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // and pretend nothing happened. 92872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (point->position.x == e.x() && point->position.y == e.y()) { 92972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return status; 93072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 93172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 93272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UpdateTouchPointPosition(&e, GetMirroredPosition(), point); 933201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 934201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Mark the rest of the points as stationary. 935201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (int i = 0; i < touch_event_.touchPointsLength; ++i) { 936201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch WebKit::WebTouchPoint* iter = touch_event_.touchPoints + i; 937201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (iter != point) { 938201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch iter->state = WebKit::WebTouchPoint::StateStationary; 939201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 940201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 941201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 942201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Update the type of the touch event. 943201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch touch_event_.type = TouchEventTypeFromEvent(&e); 94472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen touch_event_.timeStampSeconds = base::Time::Now().ToDoubleT(); 945201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 946201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The event and all the touches have been updated. Dispatch. 947201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch host_->ForwardTouchEvent(touch_event_); 948201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 949201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // If the touch was released, then remove it from the list of touch points. 95072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (e.type() == ui::ET_TOUCH_RELEASED) { 951201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch --touch_event_.touchPointsLength; 952201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch for (int i = point - touch_event_.touchPoints; 953201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch i < touch_event_.touchPointsLength; 954201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ++i) { 955201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch touch_event_.touchPoints[i] = touch_event_.touchPoints[i + 1]; 956201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 95772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (touch_event_.touchPointsLength == 0) 95872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen status = TOUCH_STATUS_END; 95972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else if (e.type() == ui::ET_TOUCH_CANCELLED) { 96072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen status = TOUCH_STATUS_CANCEL; 961201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 962201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 96372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return status; 96472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 96572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 96672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::string RenderWidgetHostViewViews::GetClassName() const { 96772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return kViewClassName; 968201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 969201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 970731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static 971731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostView* 972731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView( 973731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::NativeView widget) { 974731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gpointer user_data = g_object_get_data(G_OBJECT(widget), 975731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick kRenderWidgetHostViewKey); 976731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return reinterpret_cast<RenderWidgetHostView*>(user_data); 977731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 978