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