| Index: chrome/browser/ui/views/panels/panel_stack_view.cc
|
| diff --git a/chrome/browser/ui/views/panels/panel_stack_view.cc b/chrome/browser/ui/views/panels/panel_stack_view.cc
|
| index 96c19750835938facf0140d7a1241593a823291d..6dc75dcb82a568fe2605d727bc18e6a7f5c96e05 100644
|
| --- a/chrome/browser/ui/views/panels/panel_stack_view.cc
|
| +++ b/chrome/browser/ui/views/panels/panel_stack_view.cc
|
| @@ -19,7 +19,6 @@
|
| #if defined(OS_WIN)
|
| #include "base/win/windows_version.h"
|
| #include "chrome/browser/shell_integration.h"
|
| -#include "chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.h"
|
| #include "ui/base/win/shell.h"
|
| #include "ui/views/win/hwnd_util.h"
|
| #endif
|
| @@ -152,7 +151,7 @@ void PanelStackView::EndBatchUpdatePanelBounds() {
|
| }
|
|
|
| bounds_updates_started_ = false;
|
| - delegate_->PanelBoundsBatchUpdateCompleted();
|
| + NotifyBoundsUpdateCompleted();
|
| return;
|
| }
|
|
|
| @@ -163,16 +162,25 @@ void PanelStackView::EndBatchUpdatePanelBounds() {
|
| bounds_animator_->Start();
|
| }
|
|
|
| +void PanelStackView::NotifyBoundsUpdateCompleted() {
|
| + delegate_->PanelBoundsBatchUpdateCompleted();
|
| +
|
| +#if defined(OS_WIN)
|
| + // Refresh the thumbnail each time when any bounds updates are done.
|
| + RefreshLivePreviewThumbnail();
|
| +#endif
|
| +}
|
| +
|
| bool PanelStackView::IsAnimatingPanelBounds() const {
|
| return bounds_updates_started_ && animate_bounds_updates_;
|
| }
|
|
|
| void PanelStackView::Minimize() {
|
| #if defined(OS_WIN)
|
| - // When the owner stack window is minimized by the system, its live preview
|
| - // is lost. We need to set it explicitly. This has to be done before the
|
| - // minimization.
|
| - CaptureThumbnailForLivePreview();
|
| + // When the stack window is minimized by the system, its snapshot could not
|
| + // be obtained. We need to capture the snapshot before the minimization.
|
| + if (thumbnailer_)
|
| + thumbnailer_->CaptureSnapshot();
|
| #endif
|
|
|
| window_->Minimize();
|
| @@ -190,6 +198,10 @@ void PanelStackView::DrawSystemAttention(bool draw_attention) {
|
| is_drawing_attention_ = draw_attention;
|
|
|
| #if defined(OS_WIN)
|
| + // Refresh the thumbnail when a panel could change something for the
|
| + // attention.
|
| + RefreshLivePreviewThumbnail();
|
| +
|
| if (draw_attention) {
|
| // The default implementation of Widget::FlashFrame only flashes 5 times.
|
| // We need more than that.
|
| @@ -270,14 +282,6 @@ void PanelStackView::OnWidgetDestroying(views::Widget* widget) {
|
| window_ = NULL;
|
| }
|
|
|
| -void PanelStackView::OnWidgetActivationChanged(views::Widget* widget,
|
| - bool active) {
|
| -#if defined(OS_WIN)
|
| - if (active && thumbnailer_)
|
| - thumbnailer_->Stop();
|
| -#endif
|
| -}
|
| -
|
| void PanelStackView::OnNativeFocusChange(gfx::NativeView focused_before,
|
| gfx::NativeView focused_now) {
|
| // When the user selects the stacked panels via ALT-TAB or WIN-TAB, the
|
| @@ -306,7 +310,7 @@ void PanelStackView::AnimationEnded(const ui::Animation* animation) {
|
| }
|
| bounds_updates_.clear();
|
|
|
| - delegate_->PanelBoundsBatchUpdateCompleted();
|
| + NotifyBoundsUpdateCompleted();
|
| }
|
|
|
| void PanelStackView::AnimationProgressed(const ui::Animation* animation) {
|
| @@ -378,6 +382,12 @@ gfx::Rect PanelStackView::GetStackWindowBounds() const {
|
|
|
| void PanelStackView::UpdateStackWindowBounds() {
|
| window_->SetBounds(GetStackWindowBounds());
|
| +
|
| +#if defined(OS_WIN)
|
| + // Refresh the thumbnail each time whne the stack window is changed, due to
|
| + // adding or removing a panel.
|
| + RefreshLivePreviewThumbnail();
|
| +#endif
|
| }
|
|
|
| // static
|
| @@ -440,6 +450,12 @@ views::Widget* PanelStackView::CreateWindowWithBounds(const gfx::Rect& bounds) {
|
| ShellIntegration::GetAppModelIdForProfile(UTF8ToWide(panel->app_name()),
|
| panel->profile()->GetPath()),
|
| views::HWNDForWidget(window));
|
| +
|
| + if (base::win::GetVersion() >= base::win::VERSION_WIN7) {
|
| + HWND native_window = views::HWNDForWidget(window);
|
| + thumbnailer_.reset(new TaskbarWindowThumbnailerWin(native_window, this));
|
| + thumbnailer_->Start();
|
| + }
|
| #endif
|
|
|
| return window;
|
| @@ -455,19 +471,7 @@ void PanelStackView::EnsureWindowCreated() {
|
| }
|
|
|
| #if defined(OS_WIN)
|
| -void PanelStackView::CaptureThumbnailForLivePreview() {
|
| - // Live preview is only available since Windows 7.
|
| - if (base::win::GetVersion() < base::win::VERSION_WIN7)
|
| - return;
|
| -
|
| - HWND native_window = views::HWNDForWidget(window_);
|
| -
|
| - if (!thumbnailer_.get()) {
|
| - DCHECK(native_window);
|
| - thumbnailer_.reset(new TaskbarWindowThumbnailerWin(native_window));
|
| - ui::HWNDSubclass::AddFilterToTarget(native_window, thumbnailer_.get());
|
| - }
|
| -
|
| +std::vector<HWND> PanelStackView::GetSnapshotWindowHandles() const {
|
| std::vector<HWND> native_panel_windows;
|
| for (Panels::const_iterator iter = panels_.begin();
|
| iter != panels_.end(); ++iter) {
|
| @@ -476,7 +480,13 @@ void PanelStackView::CaptureThumbnailForLivePreview() {
|
| views::HWNDForWidget(
|
| static_cast<PanelView*>(panel->native_panel())->window()));
|
| }
|
| - thumbnailer_->Start(native_panel_windows);
|
| + return native_panel_windows;
|
| +}
|
| +
|
| +void PanelStackView::RefreshLivePreviewThumbnail() {
|
| + if (!thumbnailer_.get())
|
| + return;
|
| + thumbnailer_->InvalidateSnapshot();
|
| }
|
|
|
| void PanelStackView::DeferUpdateNativeWindowBounds(HDWP defer_window_pos_info,
|
|
|