summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-13 19:37:45 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-13 19:37:45 +0000
commit1b07256074df9f6f291c46f61c0846131f9fc1b2 (patch)
treecf5bebe6594636c963fbd209c4b522a068a0da87 /chrome/browser/renderer_host
parent26a9acf48d0c411045030f3e6bd70dca6ab90d83 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view.h9
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.cc65
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.h21
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.h2
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.mm5
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_views.cc3
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_views.h2
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_win.cc27
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_win.h8
-rw-r--r--chrome/browser/renderer_host/test/test_render_view_host.h2
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) { }