summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvarkha@chromium.org <varkha@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-08 02:16:29 +0000
committervarkha@chromium.org <varkha@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-08 02:16:29 +0000
commit7d6c372945b66064e03c794cfa3d22599da25c7b (patch)
tree00d5c81397823d515b4204f3c7d91d526a741b15
parentacea86fc381183c470e472f0b2791f27aa79bb99 (diff)
downloadchromium_src-7d6c372945b66064e03c794cfa3d22599da25c7b.zip
chromium_src-7d6c372945b66064e03c794cfa3d22599da25c7b.tar.gz
chromium_src-7d6c372945b66064e03c794cfa3d22599da25c7b.tar.bz2
Docked area should have a drawn background visually separating it from the workspace
BUG=267582 Review URL: https://chromiumcodereview.appspot.com/22483003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@216354 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--ash/wm/dock/docked_window_layout_manager.cc52
-rw-r--r--ash/wm/dock/docked_window_layout_manager.h8
2 files changed, 58 insertions, 2 deletions
diff --git a/ash/wm/dock/docked_window_layout_manager.cc b/ash/wm/dock/docked_window_layout_manager.cc
index d9d1c07..d73a0cc 100644
--- a/ash/wm/dock/docked_window_layout_manager.cc
+++ b/ash/wm/dock/docked_window_layout_manager.cc
@@ -15,6 +15,7 @@
#include "ash/wm/window_properties.h"
#include "ash/wm/window_util.h"
#include "base/auto_reset.h"
+#include "third_party/skia/include/core/SkColor.h"
#include "ui/aura/client/activation_client.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/focus_manager.h"
@@ -33,6 +34,39 @@ const int kWindowIdealSpacing = 4;
namespace {
+const SkColor kDockBackgroundColor = SkColorSetARGB(0xff, 0x10, 0x10, 0x10);
+const float kDockBackgroundOpacity = 0.5f;
+
+class DockedBackgroundWidget : public views::Widget {
+ public:
+ explicit DockedBackgroundWidget(aura::Window* container) {
+ InitWidget(container);
+ }
+
+ private:
+ void InitWidget(aura::Window* parent) {
+ views::Widget::InitParams params;
+ params.type = views::Widget::InitParams::TYPE_POPUP;
+ params.opacity = views::Widget::InitParams::OPAQUE_WINDOW;
+ params.can_activate = false;
+ params.keep_on_top = false;
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.parent = parent;
+ params.accept_events = false;
+ set_focus_on_creation(false);
+ Init(params);
+ DCHECK_EQ(GetNativeView()->GetRootWindow(), parent->GetRootWindow());
+ views::View* content_view = new views::View;
+ content_view->set_background(
+ views::Background::CreateSolidBackground(kDockBackgroundColor));
+ SetContentsView(content_view);
+ GetNativeWindow()->layer()->SetOpacity(kDockBackgroundOpacity);
+ Hide();
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(DockedBackgroundWidget);
+};
+
DockedWindowLayoutManager* GetDockLayoutManager(aura::Window* window,
const gfx::Point& location) {
gfx::Rect near_location(location, gfx::Size());
@@ -69,7 +103,8 @@ DockedWindowLayoutManager::DockedWindowLayoutManager(
shelf_hidden_(false),
docked_width_(0),
alignment_(DOCKED_ALIGNMENT_NONE),
- last_active_window_(NULL) {
+ last_active_window_(NULL),
+ background_widget_(new DockedBackgroundWidget(dock_container_)) {
DCHECK(dock_container);
aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())->
AddObserver(this);
@@ -546,6 +581,17 @@ void DockedWindowLayoutManager::UpdateDockBounds() {
DockedWindowLayoutManagerObserver,
observer_list_,
OnDockBoundsChanging(bounds));
+
+ // Show or hide background for docked area.
+ gfx::Rect background_bounds(docked_bounds_);
+ const gfx::Rect work_area =
+ Shell::GetScreen()->GetDisplayNearestWindow(dock_container_).work_area();
+ background_bounds.set_height(work_area.height());
+ background_widget_->SetBounds(background_bounds);
+ if (docked_width_ > 0)
+ background_widget_->Show();
+ else
+ background_widget_->Hide();
}
void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) {
@@ -571,13 +617,15 @@ void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) {
for (aura::Window::Windows::const_iterator it =
dock_container_->children().begin();
it != dock_container_->children().end(); ++it) {
+ if (!IsUsedByLayout(*it))
+ continue;
gfx::Rect bounds = (*it)->bounds();
window_ordering.insert(std::make_pair(bounds.y() + bounds.height() / 2,
*it));
}
int active_center_y = active_window->bounds().CenterPoint().y();
- aura::Window* previous_window = NULL;
+ aura::Window* previous_window = background_widget_->GetNativeWindow();
for (std::map<int, aura::Window*>::const_iterator it =
window_ordering.begin();
it != window_ordering.end() && it->first < active_center_y; ++it) {
diff --git a/ash/wm/dock/docked_window_layout_manager.h b/ash/wm/dock/docked_window_layout_manager.h
index 28c81fcc..aa02b34 100644
--- a/ash/wm/dock/docked_window_layout_manager.h
+++ b/ash/wm/dock/docked_window_layout_manager.h
@@ -13,6 +13,7 @@
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
+#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "ui/aura/client/activation_change_observer.h"
#include "ui/aura/layout_manager.h"
@@ -28,6 +29,10 @@ namespace gfx {
class Point;
}
+namespace views {
+class Widget;
+}
+
namespace ash {
class Launcher;
@@ -182,6 +187,9 @@ class ASH_EXPORT DockedWindowLayoutManager
// are currently focused.
aura::Window* last_active_window_;
+ // Widget used to paint a background for the docked area.
+ scoped_ptr<views::Widget> background_widget_;
+
// Observers of dock bounds changes.
ObserverList<DockedWindowLayoutManagerObserver> observer_list_;