diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-13 19:37:45 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-13 19:37:45 +0000 |
commit | 1b07256074df9f6f291c46f61c0846131f9fc1b2 (patch) | |
tree | cf5bebe6594636c963fbd209c4b522a068a0da87 /chrome/browser/renderer_host | |
parent | 26a9acf48d0c411045030f3e6bd70dca6ab90d83 (diff) | |
download | chromium_src-1b07256074df9f6f291c46f61c0846131f9fc1b2.zip chromium_src-1b07256074df9f6f291c46f61c0846131f9fc1b2.tar.gz chromium_src-1b07256074df9f6f291c46f61c0846131f9fc1b2.tar.bz2 |
[gtk] tabcontents fade-out for instant.
BUG=58937
TEST=manual
Review URL: http://codereview.chromium.org/5790002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@69032 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/renderer_host')
10 files changed, 106 insertions, 38 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host_view.h b/chrome/browser/renderer_host/render_widget_host_view.h index 81de506..af6300e 100644 --- a/chrome/browser/renderer_host/render_widget_host_view.h +++ b/chrome/browser/renderer_host/render_widget_host_view.h @@ -17,6 +17,7 @@ #include "gfx/native_widget_types.h" #include "gfx/rect.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkColor.h" #include "third_party/WebKit/WebKit/chromium/public/WebPopupType.h" #include "third_party/WebKit/WebKit/chromium/public/WebTextInputType.h" @@ -253,8 +254,12 @@ class RenderWidgetHostView { #endif // Toggles visual muting of the render view area. This is on when a - // constrained window is showing. - virtual void SetVisuallyDeemphasized(bool deemphasized) = 0; + // constrained window is showing, for example. |color| is the shade of + // the overlay that covers the render view. If |animate| is true, the overlay + // gradually fades in; otherwise it takes effect immediately. To remove the + // fade effect, pass a NULL value for |color|. In this case, |animate| is + // ignored. + virtual void SetVisuallyDeemphasized(const SkColor* color, bool animate) = 0; void set_popup_type(WebKit::WebPopupType popup_type) { popup_type_ = popup_type; diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc index 517378e..78b26e2 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc @@ -46,21 +46,28 @@ #include "views/widget/tooltip_window_gtk.h" #endif // defined(OS_CHROMEOS) -static const int kMaxWindowWidth = 4000; -static const int kMaxWindowHeight = 4000; -static const char* kRenderWidgetHostViewKey = "__RENDER_WIDGET_HOST_VIEW__"; +namespace { + +const int kMaxWindowWidth = 4000; +const int kMaxWindowHeight = 4000; +const char* kRenderWidgetHostViewKey = "__RENDER_WIDGET_HOST_VIEW__"; + +// The duration of the fade-out animation. See |overlay_animation_|. +const int kFadeEffectDuration = 300; #if defined(OS_CHROMEOS) // TODO(davemoore) Under Chromeos we are increasing the rate that the trackpad // generates events to get better precisions. Eventually we will coordinate the // driver and this setting to ensure they match. -static const float kDefaultScrollPixelsPerTick = 20; +const float kDefaultScrollPixelsPerTick = 20; #else // See WebInputEventFactor.cpp for a reason for this being the default // scroll size for linux. -static const float kDefaultScrollPixelsPerTick = 160.0f / 3.0f; +const float kDefaultScrollPixelsPerTick = 160.0f / 3.0f; #endif +} // namespace + using WebKit::WebInputEventFactory; using WebKit::WebMouseWheelEvent; @@ -480,7 +487,8 @@ RenderWidgetHostViewGtk::RenderWidgetHostViewGtk(RenderWidgetHost* widget_host) is_hidden_(false), is_loading_(false), is_showing_context_menu_(false), - visually_deemphasized_(false), + overlay_color_(0), + overlay_animation_(this), parent_host_view_(NULL), parent_(NULL), is_popup_first_mouse_release_(true), @@ -507,6 +515,9 @@ void RenderWidgetHostViewGtk::InitAsChild() { tooltip_window_.reset(new views::TooltipWindowGtk(view_.get())); #endif // defined(OS_CHROMEOS) + overlay_animation_.SetDuration(kFadeEffectDuration); + overlay_animation_.SetSlideDuration(kFadeEffectDuration); + gtk_widget_show(view_.get()); } @@ -838,7 +849,7 @@ void RenderWidgetHostViewGtk::Paint(const gfx::Rect& damage_rect) { // period where this object isn't attached to a window but hasn't been // Destroy()ed yet and it receives paint messages... if (window) { - if (!visually_deemphasized_) { + if (SkColorGetA(overlay_color_) == 0) { // In the common case, use XCopyArea. We don't draw more than once, so // we don't need to double buffer. backing_store->XShowRect(gfx::Point(0, 0), @@ -863,7 +874,15 @@ void RenderWidgetHostViewGtk::Paint(const gfx::Rect& damage_rect) { cairo_t* cr = gdk_cairo_create(window); gdk_cairo_rectangle(cr, &rect); - cairo_set_source_rgba(cr, 0, 0, 0, 0.7); + SkColor overlay = SkColorSetA( + overlay_color_, + SkColorGetA(overlay_color_) * + overlay_animation_.GetCurrentValue()); + float r = SkColorGetR(overlay) / 255.; + float g = SkColorGetG(overlay) / 255.; + float b = SkColorGetB(overlay) / 255.; + float a = SkColorGetA(overlay) / 255.; + cairo_set_source_rgba(cr, r, g, b, a); cairo_fill(cr); cairo_destroy(cr); @@ -1031,12 +1050,22 @@ void RenderWidgetHostViewGtk::DestroyPluginContainer( plugin_container_manager_.DestroyPluginContainer(id); } -void RenderWidgetHostViewGtk::SetVisuallyDeemphasized(bool deemphasized) { - if (deemphasized == visually_deemphasized_) +void RenderWidgetHostViewGtk::SetVisuallyDeemphasized( + const SkColor* color, bool animate) { + // Do nothing unless |color| has changed, meaning |animate| is only + // respected for the first call. + if (color && (*color == overlay_color_)) return; - visually_deemphasized_ = deemphasized; - gtk_widget_queue_draw(view_.get()); + overlay_color_ = color ? *color : 0; + + if (animate) { + overlay_animation_.Reset(); + overlay_animation_.Show(); + } else { + overlay_animation_.Reset(1.0); + gtk_widget_queue_draw(view_.get()); + } } bool RenderWidgetHostViewGtk::ContainsNativeView( @@ -1067,6 +1096,18 @@ void RenderWidgetHostViewGtk::ForwardKeyboardEvent( host_->ForwardKeyboardEvent(event); } +void RenderWidgetHostViewGtk::AnimationEnded(const Animation* animation) { + gtk_widget_queue_draw(view_.get()); +} + +void RenderWidgetHostViewGtk::AnimationProgressed(const Animation* animation) { + gtk_widget_queue_draw(view_.get()); +} + +void RenderWidgetHostViewGtk::AnimationCanceled(const Animation* animation) { + gtk_widget_queue_draw(view_.get()); +} + // static RenderWidgetHostView* RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView( diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.h b/chrome/browser/renderer_host/render_widget_host_view_gtk.h index 0665558..cd89ddb 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_gtk.h +++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.h @@ -11,6 +11,8 @@ #include <vector> #include <string> +#include "app/animation_delegate.h" +#include "app/slide_animation.h" #include "base/scoped_ptr.h" #include "base/time.h" #include "chrome/browser/gtk/owned_widget_gtk.h" @@ -40,7 +42,8 @@ typedef struct _GtkSelectionData GtkSelectionData; // ----------------------------------------------------------------------------- // See comments in render_widget_host_view.h about this class and its members. // ----------------------------------------------------------------------------- -class RenderWidgetHostViewGtk : public RenderWidgetHostView { +class RenderWidgetHostViewGtk : public RenderWidgetHostView, + public AnimationDelegate { public: explicit RenderWidgetHostViewGtk(RenderWidgetHost* widget); ~RenderWidgetHostViewGtk(); @@ -84,10 +87,15 @@ class RenderWidgetHostViewGtk : public RenderWidgetHostView { virtual void SetBackground(const SkBitmap& background); virtual void CreatePluginContainer(gfx::PluginWindowHandle id); virtual void DestroyPluginContainer(gfx::PluginWindowHandle id); - virtual void SetVisuallyDeemphasized(bool deemphasized); + virtual void SetVisuallyDeemphasized(const SkColor* color, bool animate); virtual bool ContainsNativeView(gfx::NativeView native_view) const; virtual void AcceleratedCompositingActivated(bool activated); + // AnimationDelegate implementation. + virtual void AnimationEnded(const Animation* animation); + virtual void AnimationProgressed(const Animation* animation); + virtual void AnimationCanceled(const Animation* animation); + gfx::NativeView native_view() const { return view_.get(); } // If the widget is aligned with an edge of the monitor its on and the user @@ -164,8 +172,13 @@ class RenderWidgetHostViewGtk : public RenderWidgetHostView { // The time it took after this view was selected for it to be fully painted. base::TimeTicks tab_switch_paint_time_; - // If true, fade the render widget when painting it. - bool visually_deemphasized_; + // A color we use to shade the entire render view. If 100% transparent, we do + // not shade the render view. + SkColor overlay_color_; + + // The animation used for the abovementioned shade effect. The animation's + // value affects the alpha we use for |overlay_color_|. + SlideAnimation overlay_animation_; // Variables used only for popups -------------------------------------------- // Our parent widget. diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.h b/chrome/browser/renderer_host/render_widget_host_view_mac.h index e831674..f4dfd25 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.h +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.h @@ -262,7 +262,7 @@ class RenderWidgetHostViewMac : public RenderWidgetHostView { // to be reloaded. void ForceTextureReload(); - virtual void SetVisuallyDeemphasized(bool deemphasized); + virtual void SetVisuallyDeemphasized(const SkColor* color, bool animate); void KillSelf(); diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm index bd4a722..f88025e 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm @@ -1121,8 +1121,9 @@ void RenderWidgetHostViewMac::ForceTextureReload() { plugin_container_manager_.ForceTextureReload(); } -void RenderWidgetHostViewMac::SetVisuallyDeemphasized(bool deemphasized) { - // Mac uses tab-modal sheets, so this is a no-op. +void RenderWidgetHostViewMac::SetVisuallyDeemphasized(const SkColor* color, + bool animate) { + // This is not used on mac. } void RenderWidgetHostViewMac::ShutdownHost() { 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 b9f386e..371f60e 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_views.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_views.cc @@ -591,7 +591,8 @@ void RenderWidgetHostViewViews::DestroyPluginContainer( // TODO(anicolao): plugin_container_manager_.DestroyPluginContainer(id); } -void RenderWidgetHostViewViews::SetVisuallyDeemphasized(bool deemphasized) { +void RenderWidgetHostViewViews::SetVisuallyDeemphasized( + const SkColor* color, bool animate) { // TODO(anicolao) } diff --git a/chrome/browser/renderer_host/render_widget_host_view_views.h b/chrome/browser/renderer_host/render_widget_host_view_views.h index d05f3a1..5a1b07e 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_views.h +++ b/chrome/browser/renderer_host/render_widget_host_view_views.h @@ -70,7 +70,7 @@ class RenderWidgetHostViewViews : public RenderWidgetHostView, virtual void SetBackground(const SkBitmap& background); virtual void CreatePluginContainer(gfx::PluginWindowHandle id); virtual void DestroyPluginContainer(gfx::PluginWindowHandle id); - virtual void SetVisuallyDeemphasized(bool deemphasized); + virtual void SetVisuallyDeemphasized(const SkColor* color, bool animate); virtual bool ContainsNativeView(gfx::NativeView native_view) const; virtual void AcceleratedCompositingActivated(bool activated); diff --git a/chrome/browser/renderer_host/render_widget_host_view_win.cc b/chrome/browser/renderer_host/render_widget_host_view_win.cc index 022d027..a665794 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_win.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_win.cc @@ -246,7 +246,8 @@ BOOL CALLBACK DetachPluginWindowsCallback(HWND window, LPARAM param) { // Draw the contents of |backing_store_dc| onto |paint_rect| with a 70% grey // filter. -void DrawDeemphasized(const gfx::Rect& paint_rect, +void DrawDeemphasized(const SkColor& color, + const gfx::Rect& paint_rect, HDC backing_store_dc, HDC paint_dc) { gfx::CanvasSkia canvas(paint_rect.width(), paint_rect.height(), true); @@ -261,9 +262,7 @@ void DrawDeemphasized(const gfx::Rect& paint_rect, paint_rect.y(), SRCCOPY); canvas.endPlatformPaint(); - // 178 is 70% grey. - canvas.FillRectInt(SkColorSetARGB(178, 0, 0, 0), 0, 0, - paint_rect.width(), paint_rect.height()); + canvas.FillRectInt(color, 0, 0, paint_rect.width(), paint_rect.height()); canvas.getTopPlatformDevice().drawToHDC(paint_dc, paint_rect.x(), paint_rect.y(), NULL); } @@ -296,7 +295,7 @@ RenderWidgetHostViewWin::RenderWidgetHostViewWin(RenderWidgetHost* widget) shutdown_factory_(this), parent_hwnd_(NULL), is_loading_(false), - visually_deemphasized_(false), + overlay_color_(0), text_input_type_(WebKit::WebTextInputTypeNone) { render_widget_host_->set_view(this); registrar_.Add(this, @@ -808,11 +807,16 @@ bool RenderWidgetHostViewWin::ContainsNativeView( return false; } -void RenderWidgetHostViewWin::SetVisuallyDeemphasized(bool deemphasized) { - if (visually_deemphasized_ == deemphasized) +void RenderWidgetHostViewWin::SetVisuallyDeemphasized(const SkColor* color, + bool animate) { + // |animate| is not yet implemented, and currently isn't used. + CHECK(!animate); + + SkColor overlay_color = color ? *color : 0; + if (overlay_color_ == overlay_color) return; + overlay_color_ = overlay_color; - visually_deemphasized_ = deemphasized; InvalidateRect(NULL, FALSE); } @@ -922,8 +926,11 @@ void RenderWidgetHostViewWin::OnPaint(HDC unused_dc) { for (DWORD i = 0; i < region_data->rdh.nCount; ++i) { gfx::Rect paint_rect = bitmap_rect.Intersect(gfx::Rect(region_rects[i])); if (!paint_rect.IsEmpty()) { - if (visually_deemphasized_) { - DrawDeemphasized(paint_rect, backing_store->hdc(), paint_dc.m_hDC); + if (SkColorGetA(overlay_color_) > 0) { + DrawDeemphasized(overlay_color_, + paint_rect, + backing_store->hdc(), + paint_dc.m_hDC); } else { BitBlt(paint_dc.m_hDC, paint_rect.x(), diff --git a/chrome/browser/renderer_host/render_widget_host_view_win.h b/chrome/browser/renderer_host/render_widget_host_view_win.h index b2b7546..282dfe9 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_win.h +++ b/chrome/browser/renderer_host/render_widget_host_view_win.h @@ -156,7 +156,7 @@ class RenderWidgetHostViewWin virtual BackingStore* AllocBackingStore(const gfx::Size& size); virtual void SetBackground(const SkBitmap& background); virtual bool ContainsNativeView(gfx::NativeView native_view) const; - virtual void SetVisuallyDeemphasized(bool deemphasized); + virtual void SetVisuallyDeemphasized(const SkColor* color, bool animate); virtual gfx::PluginWindowHandle GetCompositorHostWindow(); virtual void ShowCompositorHostWindow(bool show); @@ -338,9 +338,9 @@ class RenderWidgetHostViewWin // The time it took after this view was selected for it to be fully painted. base::TimeTicks tab_switch_paint_time_; - // True if we are showing a constrained window. We will grey out the view - // whenever we paint. - bool visually_deemphasized_; + // A color we use to shade the entire render view. If 100% transparent, we do + // not shade the render view. + SkColor overlay_color_; // Registrar so we can listen to RENDERER_PROCESS_TERMINATED events. NotificationRegistrar registrar_; diff --git a/chrome/browser/renderer_host/test/test_render_view_host.h b/chrome/browser/renderer_host/test/test_render_view_host.h index 01ed8e4..a2ff8f7 100644 --- a/chrome/browser/renderer_host/test/test_render_view_host.h +++ b/chrome/browser/renderer_host/test/test_render_view_host.h @@ -130,7 +130,7 @@ class TestRenderWidgetHostView : public RenderWidgetHostView { virtual void WillWmDestroy(); virtual void ShowCompositorHostWindow(bool show); #endif - virtual void SetVisuallyDeemphasized(bool deemphasized) { } + virtual void SetVisuallyDeemphasized(const SkColor* color, bool animate) { } #if defined(TOOLKIT_USES_GTK) virtual void CreatePluginContainer(gfx::PluginWindowHandle id) { } |