render_widget_host_view_views.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
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 "app/keyboard_code_conversion_gtk.h"
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "app/l10n_util.h"
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "app/x11_util.h"
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/command_line.h"
14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/logging.h"
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/message_loop.h"
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h"
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_number_conversions.h"
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/task.h"
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/time.h"
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/renderer_host/backing_store_x.h"
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/renderer_host/gpu_view_host.h"
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/renderer_host/render_widget_host.h"
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/renderer_host/video_layer_x.h"
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/chrome_switches.h"
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/native_web_keyboard_event.h"
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/render_messages.h"
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/gtk/WebInputEventFactory.h"
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h"
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "views/event.h"
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "views/widget/widget.h"
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kMaxWindowWidth = 4000;
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kMaxWindowHeight = 4000;
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const char* kRenderWidgetHostViewKey = "__RENDER_WIDGET_HOST_VIEW__";
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebInputEventFactory;
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebMouseWheelEvent;
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace {
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickint WebInputEventFlagsFromViewsEvent(const views::Event& event) {
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int modifiers = 0;
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsShiftDown())
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    modifiers |= WebKit::WebInputEvent::ShiftKey;
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsControlDown())
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    modifiers |= WebKit::WebInputEvent::ControlKey;
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsAltDown())
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    modifiers |= WebKit::WebInputEvent::AltKey;
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return modifiers;
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
57731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget(
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    RenderWidgetHost* widget) {
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return new RenderWidgetHostViewViews(widget);
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
62731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostViewViews::RenderWidgetHostViewViews(RenderWidgetHost* host)
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : host_(host),
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      enable_gpu_rendering_(false),
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      about_to_validate_and_paint_(false),
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_hidden_(false),
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_loading_(false),
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_showing_context_menu_(false),
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      visually_deemphasized_(false) {
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SetFocusable(true);
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_->set_view(this);
72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Enable experimental out-of-process GPU rendering.
74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  CommandLine* command_line = CommandLine::ForCurrentProcess();
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  enable_gpu_rendering_ =
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      command_line->HasSwitch(switches::kEnableGPURendering);
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
79731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostViewViews::~RenderWidgetHostViewViews() {
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::InitAsChild() {
83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Show();
84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
86731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHost* RenderWidgetHostViewViews::GetRenderWidgetHost() const {
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return host_;
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::InitAsPopup(
91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    RenderWidgetHostView* parent_host_view,
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const gfx::Rect& pos) {
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): figure out cases where popups occur and implement
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::InitAsFullscreen(
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    RenderWidgetHostView* parent_host_view) {
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidBecomeSelected() {
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!is_hidden_)
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (tab_switch_paint_time_.is_null())
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    tab_switch_paint_time_ = base::TimeTicks::Now();
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  is_hidden_ = false;
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_->WasRestored();
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::WasHidden() {
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (is_hidden_)
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If we receive any more paint messages while we are hidden, we want to
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // ignore them so we don't re-allocate the backing store.  We will paint
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // everything again when we become selected again.
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  is_hidden_ = true;
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If we have a renderer, then inform it that we are being hidden so it can
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // reduce its resource utilization.
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetRenderWidgetHost()->WasHidden();
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetSize(const gfx::Size& size) {
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This is called when webkit has sent us a Move message.
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int width = std::min(size.width(), kMaxWindowWidth);
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int height = std::min(size.height(), kMaxWindowHeight);
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (requested_size_.width() != width ||
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      requested_size_.height() != height) {
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    requested_size_ = gfx::Size(width, height);
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SetBounds(GetViewBounds());
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    host_->WasResized();
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::MovePluginWindows(
139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const std::vector<webkit_glue::WebPluginGeometry>& moves) {
140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): NIY
141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Focus() {
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RequestFocus();
146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::HasFocus() {
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return View::HasFocus();
150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Show() {
153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SetVisible(true);
154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Hide() {
157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SetVisible(false);
158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Blur() {
161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(estade): We should be clearing native focus as well, but I know of no
162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // way to do that without focusing another widget.
163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_->Blur();
164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::IsShowing() {
168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return IsVisible();
169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::Rect RenderWidgetHostViewViews::GetViewBounds() const {
172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return bounds();
173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::UpdateCursor(const WebCursor& cursor) {
176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Optimize the common case, where the cursor hasn't changed.
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // However, we can switch between different pixmaps, so only on the
178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // non-pixmap branch.
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (current_cursor_.GetCursorType() != GDK_CURSOR_IS_PIXMAP &&
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      current_cursor_.GetCursorType() == cursor.GetCursorType()) {
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  current_cursor_ = cursor;
185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ShowCurrentCursor();
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetIsLoading(bool is_loading) {
189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  is_loading_ = is_loading;
190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Only call ShowCurrentCursor() when it will actually change the cursor.
191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (current_cursor_.GetCursorType() == GDK_LAST_CURSOR)
192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ShowCurrentCursor();
193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ImeUpdateTextInputState(
196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebTextInputType type,
197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const gfx::Rect& caret_rect) {
198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(bryeung): im_context_->UpdateInputMethodState(type, caret_rect);
199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ImeCancelComposition() {
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(bryeung): im_context_->CancelComposition();
204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidUpdateBackingStore(
208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy,
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const std::vector<gfx::Rect>& copy_rects) {
210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (is_hidden_)
211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(darin): Implement the equivalent of Win32's ScrollWindowEX.  Can that
214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // be done using XCopyArea?  Perhaps similar to
215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // BackingStore::ScrollBackingStore?
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (about_to_validate_and_paint_)
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    invalid_rect_ = invalid_rect_.Union(scroll_rect);
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  else
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    SchedulePaint(scroll_rect, false);
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (size_t i = 0; i < copy_rects.size(); ++i) {
222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Avoid double painting.  NOTE: This is only relevant given the call to
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Paint(scroll_rect) above.
224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gfx::Rect rect = copy_rects[i].Subtract(scroll_rect);
225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (rect.IsEmpty())
226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      continue;
227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (about_to_validate_and_paint_)
229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      invalid_rect_ = invalid_rect_.Union(rect);
230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    else
231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      SchedulePaint(rect, false);
232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::RenderViewGone() {
236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Destroy();
237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Destroy() {
240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): deal with any special popup cleanup
241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetTooltipText(const std::wstring& tip) {
245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): decide if we want tooltips for touch (none specified
246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // right now/might want a press-and-hold display)
247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // NOTIMPLEMENTED(); ... too annoying, it triggers for every mousemove
248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SelectionChanged(const std::string& text) {
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): deal with the clipboard without GTK
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ShowingContextMenu(bool showing) {
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  is_showing_context_menu_ = showing;
257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::NeedsInputGrab() {
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return popup_type_ == WebKit::WebPopupTypeSelect;
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::IsPopup() {
264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return popup_type_ != WebKit::WebPopupTypeNone;
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
267731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBackingStore* RenderWidgetHostViewViews::AllocBackingStore(
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const gfx::Size& size) {
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (enable_gpu_rendering_) {
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Use a special GPU accelerated backing store.
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!gpu_view_host_.get()) {
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Here we lazily make the GpuViewHost. This must be allocated when we
273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // have a native view realized, which happens sometime after creation
274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // when our owner puts us in the parent window.
275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      DCHECK(GetNativeView());
276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      XID window_xid = x11_util::GetX11WindowFromGtkWidget(GetNativeView());
277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      gpu_view_host_.reset(new GpuViewHost(host_, window_xid));
278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return gpu_view_host_->CreateBackingStore(size);
280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return new BackingStoreX(host_, size,
283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           x11_util::GetVisualFromGtkWidget(native_view()),
284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           gtk_widget_get_visual(native_view())->depth);
285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::NativeView RenderWidgetHostViewViews::native_view() const {
288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return GetWidget()->GetNativeView();
289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
290731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
291731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickVideoLayer* RenderWidgetHostViewViews::AllocVideoLayer(const gfx::Size& size) {
292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (enable_gpu_rendering_) {
293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // TODO(scherkus): is it possible for a video layer to be allocated before a
294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // backing store?
295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DCHECK(gpu_view_host_.get())
296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        << "AllocVideoLayer() called before AllocBackingStore()";
297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return gpu_view_host_->CreateVideoLayer(size);
298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return new VideoLayerX(host_, size,
301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                         x11_util::GetVisualFromGtkWidget(native_view()),
302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                         gtk_widget_get_visual(native_view())->depth);
303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetBackground(const SkBitmap& background) {
306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RenderWidgetHostView::SetBackground(background);
307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_->Send(new ViewMsg_SetBackground(host_->routing_id(), background));
308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::Paint(gfx::Canvas* canvas) {
311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (enable_gpu_rendering_) {
312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // When we're proxying painting, we don't actually display the web page
313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // ourselves.
314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (gpu_view_host_.get())
315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      gpu_view_host_->OnWindowPainted();
316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Erase the background. This will prevent a flash of black when resizing
318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // or exposing the window. White is usually better than black.
319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Don't do any painting if the GPU process is rendering directly
323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // into the View.
324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RenderWidgetHost* render_widget_host = GetRenderWidgetHost();
325731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (render_widget_host->is_gpu_rendering_active()) {
326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
327731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GdkWindow* window = native_view()->window;
330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(!about_to_validate_and_paint_);
331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): get the damage somehow
333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  //invalid_rect_ = damage_rect;
334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  invalid_rect_ = bounds();
335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  about_to_validate_and_paint_ = true;
336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BackingStoreX* backing_store = static_cast<BackingStoreX*>(
337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      host_->GetBackingStore(true));
338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Calling GetBackingStore maybe have changed |invalid_rect_|...
339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  about_to_validate_and_paint_ = false;
340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gfx::Rect paint_rect = gfx::Rect(0, 0, kMaxWindowWidth, kMaxWindowHeight);
342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  paint_rect = paint_rect.Intersect(invalid_rect_);
343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (backing_store) {
345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Only render the widget if it is attached to a window; there's a short
346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // period where this object isn't attached to a window but hasn't been
347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Destroy()ed yet and it receives paint messages...
348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (window) {
349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      if (!visually_deemphasized_) {
350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // In the common case, use XCopyArea. We don't draw more than once, so
351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // we don't need to double buffer.
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        backing_store->XShowRect(
353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            paint_rect, x11_util::GetX11WindowFromGtkWidget(native_view()));
354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // Paint the video layer using XCopyArea.
356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // TODO(scherkus): implement VideoLayerX::CairoShow() for grey
357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // blending.
358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        VideoLayerX* video_layer = static_cast<VideoLayerX*>(
359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            host_->video_layer());
360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        if (video_layer)
361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          video_layer->XShow(
362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick              x11_util::GetX11WindowFromGtkWidget(native_view()));
363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      } else {
364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // If the grey blend is showing, we make two drawing calls. Use double
365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // buffering to prevent flicker. Use CairoShowRect because XShowRect
366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        // shortcuts GDK's double buffering.
367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        GdkRectangle rect = { paint_rect.x(), paint_rect.y(),
368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              paint_rect.width(), paint_rect.height() };
369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        gdk_window_begin_paint_rect(window, &rect);
370731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        backing_store->CairoShowRect(paint_rect, GDK_DRAWABLE(window));
372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        cairo_t* cr = gdk_cairo_create(window);
374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        gdk_cairo_rectangle(cr, &rect);
375731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        cairo_set_source_rgba(cr, 0, 0, 0, 0.7);
376731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        cairo_fill(cr);
377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        cairo_destroy(cr);
378731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
379731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        gdk_window_end_paint(window);
380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      }
381731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!whiteout_start_time_.is_null()) {
383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      base::TimeDelta whiteout_duration = base::TimeTicks::Now() -
384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          whiteout_start_time_;
385731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UMA_HISTOGRAM_TIMES("MPArch.RWHH_WhiteoutDuration", whiteout_duration);
386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
387731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Reset the start time to 0 so that we start recording again the next
388731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // time the backing store is NULL...
389731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      whiteout_start_time_ = base::TimeTicks();
390731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
391731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!tab_switch_paint_time_.is_null()) {
392731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      base::TimeDelta tab_switch_paint_duration = base::TimeTicks::Now() -
393731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          tab_switch_paint_time_;
394731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UMA_HISTOGRAM_TIMES("MPArch.RWH_TabSwitchPaintDuration",
395731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          tab_switch_paint_duration);
396731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Reset tab_switch_paint_time_ to 0 so future tab selections are
397731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // recorded.
398731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      tab_switch_paint_time_ = base::TimeTicks();
399731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
400731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  } else {
401731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (window)
402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      gdk_window_clear(window);
403731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (whiteout_start_time_.is_null())
404731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      whiteout_start_time_ = base::TimeTicks::Now();
405731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
406731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
407731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
408731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMousePressed(const views::MouseEvent& event) {
409731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RequestFocus();
410731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
411731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): validate event generation.
412731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event);
413731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): deal with double clicks
415731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  e.type = WebKit::WebInputEvent::MouseDown;
416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  e.clickCount = 1;
417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetRenderWidgetHost()->ForwardMouseEvent(e);
419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return true;
420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
422731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseReleased(const views::MouseEvent& event,
423731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                bool canceled) {
424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event);
425731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
426731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  e.type = WebKit::WebInputEvent::MouseUp;
427731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  e.clickCount = 1;
428731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
429731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetRenderWidgetHost()->ForwardMouseEvent(e);
430731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
431731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMouseDragged(const views::MouseEvent& event) {
433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  OnMouseMoved(event);
434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return true;
435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
437731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseMoved(const views::MouseEvent& event) {
438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  WebKit::WebMouseEvent e = WebMouseEventFromViewsEvent(event);
439731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
440731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  e.type = WebKit::WebInputEvent::MouseMove;
441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
442731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetRenderWidgetHost()->ForwardMouseEvent(e);
443731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseEntered(const views::MouseEvent& event) {
446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Already generated synthetically by webkit.
447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::OnMouseExited(const views::MouseEvent& event) {
450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Already generated synthetically by webkit.
451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
452731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
453731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnMouseWheel(const views::MouseWheelEvent& e) {
454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return false;
456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnKeyPressed(const views::KeyEvent &e) {
459731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Send key event to input method.
460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO host_view->im_context_->ProcessKeyEvent(event);
461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NativeWebKeyboardEvent wke;
462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
463731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wke.type = WebKit::WebInputEvent::KeyDown;
464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wke.windowsKeyCode = e.GetKeyCode();
465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wke.setKeyIdentifierFromWindowsKeyCode();
466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wke.text[0] = wke.unmodifiedText[0] =
468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    static_cast<unsigned short>(gdk_keyval_to_unicode(
469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          app::GdkKeyCodeForWindowsKeyCode(e.GetKeyCode(), false /*shift*/)));
470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
471731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wke.modifiers = WebInputEventFlagsFromViewsEvent(e);
472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ForwardKeyboardEvent(wke);
473731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
474731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // send the keypress event
475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wke.type = WebKit::WebInputEvent::Char;
476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): fear this comment from GTK land
478731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // We return TRUE because we did handle the event. If it turns out webkit
479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // can't handle the event, we'll deal with it in
480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // RenderView::UnhandledKeyboardEvent().
481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return TRUE;
483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::OnKeyReleased(const views::KeyEvent &e) {
486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(bryeung): deal with input methods
487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NativeWebKeyboardEvent wke;
488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
489731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wke.type = WebKit::WebInputEvent::KeyUp;
490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wke.windowsKeyCode = e.GetKeyCode();
491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wke.setKeyIdentifierFromWindowsKeyCode();
492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ForwardKeyboardEvent(wke);
494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
495731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return TRUE;
496731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
498731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DidGainFocus() {
499731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if 0
500731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): - is this needed/replicable?
501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Comes from the GTK equivalent.
502731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
503731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int x, y;
504731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gtk_widget_get_pointer(native_view(), &x, &y);
505731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // http://crbug.com/13389
506731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If the cursor is in the render view, fake a mouse move event so that
507731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // webkit updates its state. Otherwise webkit might think the cursor is
508731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // somewhere it's not.
509731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (x >= 0 && y >= 0 && x < native_view()->allocation.width &&
510731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      y < native_view()->allocation.height) {
511731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WebKit::WebMouseEvent fake_event;
512731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.timeStampSeconds = base::Time::Now().ToDoubleT();
513731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.modifiers = 0;
514731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.windowX = fake_event.x = x;
515731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.windowY = fake_event.y = y;
516731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gdk_window_get_origin(native_view()->window, &x, &y);
517731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.globalX = fake_event.x + x;
518731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.globalY = fake_event.y + y;
519731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.type = WebKit::WebInputEvent::MouseMove;
520731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    fake_event.button = WebKit::WebMouseEvent::ButtonNone;
521731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    GetRenderWidgetHost()->ForwardMouseEvent(fake_event);
522731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
523731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif
524731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
525731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ShowCurrentCursor();
526731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GetRenderWidgetHost()->GotFocus();
527731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
528731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::WillLoseFocus() {
530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If we are showing a context menu, maintain the illusion that webkit has
531731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // focus.
532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!is_showing_context_menu_)
533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    GetRenderWidgetHost()->Blur();
534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
537731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ShowCurrentCursor() {
538731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // The widget may not have a window. If that's the case, abort mission. This
539731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // is the same issue as that explained above in Paint().
540731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!native_view()->window)
541731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
542731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
543731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): change to set cursors without GTK
544731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
545731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
546731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::CreatePluginContainer(
547731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gfx::PluginWindowHandle id) {
548731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): plugin_container_manager_.CreatePluginContainer(id);
549731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
550731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
551731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::DestroyPluginContainer(
552731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gfx::PluginWindowHandle id) {
553731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao): plugin_container_manager_.DestroyPluginContainer(id);
554731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
555731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
556731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::SetVisuallyDeemphasized(bool deemphasized) {
557731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(anicolao)
558731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
559731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
560731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool RenderWidgetHostViewViews::ContainsNativeView(
561731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    gfx::NativeView native_view) const {
562731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(port)
563731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTREACHED() <<
564731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    "RenderWidgetHostViewViews::ContainsNativeView not implemented.";
565731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return false;
566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
568731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickWebKit::WebMouseEvent RenderWidgetHostViewViews::WebMouseEventFromViewsEvent(
569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const views::MouseEvent& event) {
570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  WebKit::WebMouseEvent wmevent;
571731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
572731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wmevent.timeStampSeconds = base::Time::Now().ToDoubleT();
573731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wmevent.windowX = wmevent.x = event.x();
574731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wmevent.windowY = wmevent.y = event.y();
575731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int x, y;
576731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gdk_window_get_origin(GetNativeView()->window, &x, &y);
577731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wmevent.globalX = wmevent.x + x;
578731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wmevent.globalY = wmevent.y + y;
579731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  wmevent.modifiers = WebInputEventFlagsFromViewsEvent(event);
580731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
581731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Setting |wmevent.button| is not necessary for -move events, but it is
582731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // necessary for -clicks and -drags.
583731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsMiddleMouseButton()) {
584731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.modifiers |= WebKit::WebInputEvent::MiddleButtonDown;
585731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.button = WebKit::WebMouseEvent::ButtonMiddle;
586731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
587731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsRightMouseButton()) {
588731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.modifiers |= WebKit::WebInputEvent::RightButtonDown;
589731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.button = WebKit::WebMouseEvent::ButtonRight;
590731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
591731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (event.IsLeftMouseButton()) {
592731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.modifiers |= WebKit::WebInputEvent::LeftButtonDown;
593731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    wmevent.button = WebKit::WebMouseEvent::ButtonLeft;
594731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
595731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
596731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return wmevent;
597731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
598731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
599731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid RenderWidgetHostViewViews::ForwardKeyboardEvent(
600731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const NativeWebKeyboardEvent& event) {
601731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!host_)
602731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
603731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
604731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EditCommands edit_commands;
605731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if 0
606731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTODO(bryeung): key bindings
607731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!event.skip_in_browser &&
608731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      key_bindings_handler_->Match(event, &edit_commands)) {
609731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    host_->ForwardEditCommandsForNextKeyEvent(edit_commands);
610731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
611731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif
612731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  host_->ForwardKeyboardEvent(event);
613731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
614731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
615731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
616731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickRenderWidgetHostView*
617731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView(
618731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        gfx::NativeView widget) {
619731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gpointer user_data = g_object_get_data(G_OBJECT(widget),
620731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                         kRenderWidgetHostViewKey);
621731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return reinterpret_cast<RenderWidgetHostView*>(user_data);
622731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
623