Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1306)

Unified Diff: chrome/browser/ui/views/panels/panel_stack_view.cc

Issue 16035007: Provide the custom thumbnail for live preview of stacked panels (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..d7d4b9ed7e986fed32385d597d3222ac70cc6aa8 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
@@ -46,6 +45,7 @@ PanelStackView::PanelStackView(NativePanelStackWindowDelegate* delegate)
window_(NULL),
is_closing_(false),
is_drawing_attention_(false),
+ is_minimizing_(false),
animate_bounds_updates_(false),
bounds_updates_started_(false) {
DCHECK(delegate);
@@ -74,6 +74,10 @@ void PanelStackView::AddPanel(Panel* panel) {
window_->UpdateWindowTitle();
window_->UpdateWindowIcon();
+
+#if defined(OS_WIN)
+ StartOrStopCustomThumbnailForMinimizePanel();
+#endif
}
void PanelStackView::RemovePanel(Panel* panel) {
@@ -81,6 +85,10 @@ void PanelStackView::RemovePanel(Panel* panel) {
MakeStackWindowOwnPanelWindow(panel, NULL);
UpdateStackWindowBounds();
+
+#if defined(OS_WIN)
+ StartOrStopCustomThumbnailForMinimizePanel();
+#endif
}
void PanelStackView::MergeWith(NativePanelStackWindow* another) {
@@ -172,10 +180,15 @@ void PanelStackView::Minimize() {
// 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();
+ CaptureThumbnailForLivePreview(true);
#endif
+ // On Windows, the system will activate the window before it is minimized.
+ // Set this flag such that the thumbnailer will not be stopped in
+ // OnWidgetActivationChanged.
+ is_minimizing_ = true;
window_->Minimize();
+ is_minimizing_ = false;
}
bool PanelStackView::IsMinimized() const {
@@ -273,7 +286,7 @@ void PanelStackView::OnWidgetDestroying(views::Widget* widget) {
void PanelStackView::OnWidgetActivationChanged(views::Widget* widget,
bool active) {
#if defined(OS_WIN)
- if (active && thumbnailer_)
+ if (active && !is_minimizing_ && thumbnailer_)
thumbnailer_->Stop();
#endif
}
@@ -296,6 +309,20 @@ void PanelStackView::OnNativeFocusChange(gfx::NativeView focused_before,
#endif
}
+#if defined(OS_WIN)
+std::vector<HWND> PanelStackView::GetSnapshotWindowHandles() const {
+ std::vector<HWND> native_panel_windows;
+ for (Panels::const_iterator iter = panels_.begin();
+ iter != panels_.end(); ++iter) {
+ Panel* panel = *iter;
+ native_panel_windows.push_back(
+ views::HWNDForWidget(
+ static_cast<PanelView*>(panel->native_panel())->window()));
+ }
+ return native_panel_windows;
+}
+#endif
+
void PanelStackView::AnimationEnded(const ui::Animation* animation) {
bounds_updates_started_ = false;
@@ -307,6 +334,10 @@ void PanelStackView::AnimationEnded(const ui::Animation* animation) {
bounds_updates_.clear();
delegate_->PanelBoundsBatchUpdateCompleted();
+
+#if defined(OS_WIN)
+ StartOrStopCustomThumbnailForMinimizePanel();
+#endif
}
void PanelStackView::AnimationProgressed(const ui::Animation* animation) {
@@ -455,7 +486,30 @@ void PanelStackView::EnsureWindowCreated() {
}
#if defined(OS_WIN)
-void PanelStackView::CaptureThumbnailForLivePreview() {
+void PanelStackView::StartOrStopCustomThumbnailForMinimizePanel() {
Dmitry Titov 2013/05/29 01:14:48 Is it possible to have a StartThumbnailer() and St
jianli 2013/05/29 18:31:52 All 3 places need the same code because otherwise
+ bool has_minimized_panel = false;
+ for (Panels::const_iterator iter = panels_.begin();
+ iter != panels_.end(); ++iter) {
+ if ((*iter)->IsMinimized()) {
+ has_minimized_panel = true;
+ break;
+ }
+ }
+
+ // If custom thumbnail is still needed, stopping the thumbnailer and starting
+ // it again will make the system use the fresh snapshot.
+ if (thumbnailer_)
+ thumbnailer_->Stop();
+
+ // Start the thumbnailer to capture the snapshot only when the system requests
+ // it. When a panel has just been changed, its rendering might not be
+ // completed at this point. So we want to delay the snapshot until the system
+ // asks for it.
+ if (has_minimized_panel)
+ CaptureThumbnailForLivePreview(false);
+}
+
+void PanelStackView::CaptureThumbnailForLivePreview(bool should_capture_now) {
// Live preview is only available since Windows 7.
if (base::win::GetVersion() < base::win::VERSION_WIN7)
return;
@@ -464,19 +518,11 @@ void PanelStackView::CaptureThumbnailForLivePreview() {
if (!thumbnailer_.get()) {
DCHECK(native_window);
- thumbnailer_.reset(new TaskbarWindowThumbnailerWin(native_window));
+ thumbnailer_.reset(new TaskbarWindowThumbnailerWin(native_window, this));
ui::HWNDSubclass::AddFilterToTarget(native_window, thumbnailer_.get());
}
- std::vector<HWND> native_panel_windows;
- for (Panels::const_iterator iter = panels_.begin();
- iter != panels_.end(); ++iter) {
- Panel* panel = *iter;
- native_panel_windows.push_back(
- views::HWNDForWidget(
- static_cast<PanelView*>(panel->native_panel())->window()));
- }
- thumbnailer_->Start(native_panel_windows);
+ thumbnailer_->Start(should_capture_now);
}
void PanelStackView::DeferUpdateNativeWindowBounds(HDWP defer_window_pos_info,

Powered by Google App Engine
This is Rietveld 408576698