Chromium Code Reviews| Index: chrome/browser/renderer_host/render_widget_host_view_views.cc |
| diff --git a/chrome/browser/renderer_host/render_widget_host_view_views.cc b/chrome/browser/renderer_host/render_widget_host_view_views.cc |
| index 9e4a2c95f3e477adafbf7c22ae98f25179d376f9..bca53a588048080d31bf613d78c0e2ff50729bec 100644 |
| --- a/chrome/browser/renderer_host/render_widget_host_view_views.cc |
| +++ b/chrome/browser/renderer_host/render_widget_host_view_views.cc |
| @@ -14,12 +14,14 @@ |
| #include "base/string_number_conversions.h" |
| #include "base/task.h" |
| #include "base/time.h" |
| +#include "chrome/browser/renderer_host/backing_store_skia.h" |
| #include "chrome/browser/renderer_host/backing_store_x.h" |
| #include "chrome/browser/renderer_host/render_widget_host.h" |
| #include "chrome/common/native_web_keyboard_event.h" |
| #include "chrome/common/render_messages.h" |
| #include "chrome/common/result_codes.h" |
| #include "gfx/canvas.h" |
| +#include "gfx/canvas_skia.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/gtk/WebInputEventFactory.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
| #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" |
| @@ -32,6 +34,7 @@ |
| static const int kMaxWindowWidth = 4000; |
| static const int kMaxWindowHeight = 4000; |
| static const char* kRenderWidgetHostViewKey = "__RENDER_WIDGET_HOST_VIEW__"; |
| +static const char* kBackingStoreSkiaSwitch = "use-backing-store-skia"; |
|
agl
2011/02/07 17:26:47
use |char kBackingStoreSkiaSwitch[]| to save a rel
sadrul
2011/02/07 18:22:38
Done.
|
| using WebKit::WebInputEventFactory; |
| using WebKit::WebMouseWheelEvent; |
| @@ -39,6 +42,18 @@ using WebKit::WebTouchEvent; |
| namespace { |
| +bool UsingBackingStoreSkia() { |
| + static bool decided = false; |
| + static bool use_skia = false; |
| + if (!decided) { |
| + CommandLine* cmdline = CommandLine::ForCurrentProcess(); |
| + use_skia = (cmdline && cmdline->HasSwitch(kBackingStoreSkiaSwitch)); |
| + decided = true; |
| + } |
| + |
| + return use_skia; |
| +} |
| + |
| int WebInputEventFlagsFromViewsEvent(const views::Event& event) { |
| int modifiers = 0; |
| @@ -328,9 +343,13 @@ BackingStore* RenderWidgetHostViewViews::AllocBackingStore( |
| gfx::NativeView nview = GetInnerNativeView(); |
| if (!nview) |
| return NULL; |
| - return new BackingStoreX(host_, size, |
| - ui::GetVisualFromGtkWidget(nview), |
| - gtk_widget_get_visual(nview)->depth); |
| + |
| + if (UsingBackingStoreSkia()) |
|
agl
2011/02/07 17:26:47
the style guide lets you do this, although I would
sadrul
2011/02/07 18:22:38
Done.
|
| + return new BackingStoreSkia(host_, size); |
| + else |
| + return new BackingStoreX(host_, size, |
| + ui::GetVisualFromGtkWidget(nview), |
| + gtk_widget_get_visual(nview)->depth); |
| } |
| gfx::NativeView RenderWidgetHostViewViews::GetInnerNativeView() const { |
| @@ -380,8 +399,7 @@ void RenderWidgetHostViewViews::Paint(gfx::Canvas* canvas) { |
| ConvertPointToWidget(this, &origin); |
| about_to_validate_and_paint_ = true; |
| - BackingStoreX* backing_store = static_cast<BackingStoreX*>( |
| - host_->GetBackingStore(true)); |
| + BackingStore* backing_store = host_->GetBackingStore(true); |
| // Calling GetBackingStore maybe have changed |invalid_rect_|... |
| about_to_validate_and_paint_ = false; |
| @@ -396,9 +414,15 @@ void RenderWidgetHostViewViews::Paint(gfx::Canvas* canvas) { |
| if (!visually_deemphasized_) { |
| // In the common case, use XCopyArea. We don't draw more than once, so |
| // we don't need to double buffer. |
| - backing_store->XShowRect(origin, |
| - paint_rect, ui::GetX11WindowFromGdkWindow(window)); |
| - } else { |
| + |
| + if (UsingBackingStoreSkia()) { |
| + static_cast<BackingStoreSkia*>(backing_store)->SkiaShowRect( |
| + gfx::Point(paint_rect.x(), paint_rect.y()), canvas); |
| + } else { |
| + static_cast<BackingStoreX*>(backing_store)->XShowRect(origin, |
| + paint_rect, ui::GetX11WindowFromGdkWindow(window)); |
| + } |
| + } else if (!UsingBackingStoreSkia()) { |
| // If the grey blend is showing, we make two drawing calls. Use double |
| // buffering to prevent flicker. Use CairoShowRect because XShowRect |
| // shortcuts GDK's double buffering. |
| @@ -406,7 +430,8 @@ void RenderWidgetHostViewViews::Paint(gfx::Canvas* canvas) { |
| paint_rect.width(), paint_rect.height() }; |
| gdk_window_begin_paint_rect(window, &rect); |
| - backing_store->CairoShowRect(paint_rect, GDK_DRAWABLE(window)); |
| + static_cast<BackingStoreX*>(backing_store)->CairoShowRect( |
| + paint_rect, GDK_DRAWABLE(window)); |
| cairo_t* cr = gdk_cairo_create(window); |
| gdk_cairo_rectangle(cr, &rect); |
| @@ -415,6 +440,9 @@ void RenderWidgetHostViewViews::Paint(gfx::Canvas* canvas) { |
| cairo_destroy(cr); |
| gdk_window_end_paint(window); |
| + } else { |
| + // TODO(sad) |
| + NOTIMPLEMENTED(); |
|
agl
2011/02/07 17:26:47
NOTREACHED()?
sadrul
2011/02/07 18:22:38
It's not clear to me when |visually_deemphasized_|
|
| } |
| } |
| if (!whiteout_start_time_.is_null()) { |
| @@ -590,7 +618,7 @@ void RenderWidgetHostViewViews::DidGainFocus() { |
| void RenderWidgetHostViewViews::WillLoseFocus() { |
| // If we are showing a context menu, maintain the illusion that webkit has |
| // focus. |
| - if (!is_showing_context_menu_ && !is_hidden_) |
| + if (!is_showing_context_menu_ && !is_hidden_ && GetRenderWidgetHost()) |
|
agl
2011/02/07 17:26:47
This seems like it doesn't belong. If it's fixing
sadrul
2011/02/07 18:22:38
Indeed. This is a fix for a bug, and sneaked into
|
| GetRenderWidgetHost()->Blur(); |
| } |