Index: chrome/browser/ui/panels/auto_hiding_desktop_bar_win.cc |
=================================================================== |
--- chrome/browser/ui/panels/auto_hiding_desktop_bar_win.cc (revision 0) |
+++ chrome/browser/ui/panels/auto_hiding_desktop_bar_win.cc (revision 0) |
@@ -0,0 +1,194 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/panels/auto_hiding_desktop_bar_win.h" |
+ |
+#include <shellapi.h> |
+ |
+#include "base/logging.h" |
+#include "views/widget/monitor_win.h" |
+ |
+namespace { |
+// The thickness of the area of an auto-hiding taskbar that is still visible |
+// when the taskbar becomes hidden. |
+const int kHiddenAutoHideTaskbarThickness = 2; |
+ |
+// The polling interval to check auto-hiding taskbars. |
+const int kCheckTaskbarPollingIntervalMs = 500; |
+} // namespace |
+ |
+AutoHidingDesktopBarWin::AutoHidingDesktopBarWin(Observer* observer) |
+ : observer_(observer) { |
+ DCHECK(observer); |
+ memset(taskbars_, 0, sizeof(taskbars_)); |
+} |
+ |
+AutoHidingDesktopBarWin::~AutoHidingDesktopBarWin() { |
+} |
+ |
+void AutoHidingDesktopBarWin::UpdateWorkArea(const gfx::Rect& work_area) { |
+ if (work_area_ == work_area) |
+ return; |
+ work_area_ = work_area; |
+ |
+ RECT rect = work_area_.ToRECT(); |
+ monitor_ = ::MonitorFromRect(&rect, MONITOR_DEFAULTTOPRIMARY); |
+ DCHECK(monitor_); |
+ |
+ bool taskbar_exists = CheckTaskbars(false); |
+ |
+ // If no auto-hiding taskbar exists, we do not need to start the polling |
+ // timer. If a taskbar is then set to auto-hiding, UpdateWorkArea will be |
+ // called due to the work area change. |
+ if (taskbar_exists) { |
+ if (!polling_timer_.IsRunning()) { |
+ polling_timer_.Start( |
+ base::TimeDelta::FromMilliseconds(kCheckTaskbarPollingIntervalMs), |
+ this, |
+ &AutoHidingDesktopBarWin::OnPollingTimer); |
+ } |
+ } else { |
+ if (polling_timer_.IsRunning()) |
+ polling_timer_.Stop(); |
+ } |
+} |
+ |
+bool AutoHidingDesktopBarWin::IsEnabled( |
+ AutoHidingDesktopBar::Alignment alignment) { |
+ CheckTaskbars(false); |
+ return taskbars_[static_cast<int>(alignment)].window != NULL; |
+} |
+ |
+int AutoHidingDesktopBarWin::GetThickness( |
+ AutoHidingDesktopBar::Alignment alignment) const { |
+ return GetThicknessFromBounds(alignment, GetBounds(alignment)); |
+} |
+ |
+AutoHidingDesktopBar::Visibility AutoHidingDesktopBarWin::GetVisibility( |
+ AutoHidingDesktopBar::Alignment alignment) const { |
+ return GetVisibilityFromBounds(alignment, GetBounds(alignment)); |
+} |
+ |
+gfx::Rect AutoHidingDesktopBarWin::GetBounds( |
+ AutoHidingDesktopBar::Alignment alignment) const { |
+ HWND taskbar_window = taskbars_[static_cast<int>(alignment)].window; |
+ if (!taskbar_window) |
+ return gfx::Rect(); |
+ |
+ RECT rect; |
+ if (!::GetWindowRect(taskbar_window, &rect)) |
+ return gfx::Rect(); |
+ return gfx::Rect(rect); |
+} |
+ |
+int AutoHidingDesktopBarWin::GetThicknessFromBounds( |
+ AutoHidingDesktopBar::Alignment alignment, |
+ const gfx::Rect& taskbar_bounds) const { |
+ switch (alignment) { |
+ case AutoHidingDesktopBar::ALIGN_BOTTOM: |
+ return taskbar_bounds.height(); |
+ case AutoHidingDesktopBar::ALIGN_LEFT: |
+ case AutoHidingDesktopBar::ALIGN_RIGHT: |
+ return taskbar_bounds.width(); |
+ default: |
+ NOTREACHED(); |
+ return 0; |
+ } |
+} |
+ |
+AutoHidingDesktopBar::Visibility |
+AutoHidingDesktopBarWin::GetVisibilityFromBounds( |
+ AutoHidingDesktopBar::Alignment alignment, |
+ const gfx::Rect& taskbar_bounds) const { |
+ switch (alignment) { |
+ case AutoHidingDesktopBar::ALIGN_BOTTOM: |
+ if (taskbar_bounds.bottom() <= work_area_.bottom()) |
+ return VISIBLE; |
+ else if (taskbar_bounds.y() >= |
+ work_area_.bottom() - kHiddenAutoHideTaskbarThickness) |
+ return HIDDEN; |
+ else |
+ return ANIMATING; |
+ |
+ case AutoHidingDesktopBar::ALIGN_LEFT: |
+ if (taskbar_bounds.x() >= work_area_.x()) |
+ return VISIBLE; |
+ else if (taskbar_bounds.right() <= |
+ work_area_.x() + kHiddenAutoHideTaskbarThickness) |
+ return HIDDEN; |
+ else |
+ return ANIMATING; |
+ |
+ case AutoHidingDesktopBar::ALIGN_RIGHT: |
+ if (taskbar_bounds.right() <= work_area_.right()) |
+ return VISIBLE; |
+ else if (taskbar_bounds.x() >= |
+ work_area_.right() - kHiddenAutoHideTaskbarThickness) |
+ return HIDDEN; |
+ else |
+ return ANIMATING; |
+ |
+ default: |
+ NOTREACHED(); |
+ return VISIBLE; |
+ } |
+} |
+ |
+void AutoHidingDesktopBarWin::OnPollingTimer() { |
+ CheckTaskbars(true); |
+} |
+ |
+bool AutoHidingDesktopBarWin::CheckTaskbars(bool notify_observer) { |
+ bool taskbar_exists = false; |
+ UINT edges[] = { ABE_BOTTOM, ABE_LEFT, ABE_RIGHT }; |
+ for (size_t i = 0; i < kMaxTaskbars; ++i) { |
+ taskbars_[i].window = |
+ views::GetTopmostAutoHideTaskbarForEdge(edges[i], monitor_); |
+ if (taskbars_[i].window) |
+ taskbar_exists = true; |
+ } |
+ if (!taskbar_exists) { |
+ for (size_t i = 0; i < kMaxTaskbars; ++i) { |
+ taskbars_[i].thickness = 0; |
+ taskbars_[i].visibility = AutoHidingDesktopBar::HIDDEN; |
+ } |
+ return false; |
+ } |
+ |
+ bool thickness_changed = false; |
+ for (size_t i = 0; i < kMaxTaskbars; ++i) { |
+ AutoHidingDesktopBar::Alignment alignment = static_cast<Alignment>(i); |
+ |
+ gfx::Rect bounds = GetBounds(alignment); |
+ |
+ // Check the thickness change. |
+ int thickness = GetThicknessFromBounds(alignment, bounds); |
+ if (thickness != taskbars_[i].thickness) { |
+ taskbars_[i].thickness = thickness; |
+ thickness_changed = true; |
+ } |
+ |
+ // Check and notify the visibility change. |
+ AutoHidingDesktopBar::Visibility visibility = |
+ GetVisibilityFromBounds(alignment, bounds); |
+ if (visibility != taskbars_[i].visibility) { |
+ taskbars_[i].visibility = visibility; |
+ if (notify_observer) { |
+ observer_->OnAutoHidingDesktopBarVisibilityChanged(alignment, |
+ visibility); |
+ } |
+ } |
+ } |
+ |
+ // Notify the thickness change if needed. |
+ if (thickness_changed && notify_observer) |
+ observer_->OnAutoHidingDesktopBarThicknessChanged(); |
+ |
+ return true; |
+} |
+ |
+// static |
+AutoHidingDesktopBar* AutoHidingDesktopBar::Create(Observer* observer) { |
+ return new AutoHidingDesktopBarWin(observer); |
+} |
Property changes on: chrome\browser\ui\panels\auto_hiding_desktop_bar_win.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |