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

Unified Diff: ui/aura/window.cc

Issue 7976020: Wires up mouse capture code for aura. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Tweaks Created 9 years, 3 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: ui/aura/window.cc
diff --git a/ui/aura/window.cc b/ui/aura/window.cc
index 6ccf808d8a7c93106a8c7afc6c8213a6a65ac8a0..9704d281f7f81a9fb7f24eb79b9356e93afd80b3 100644
--- a/ui/aura/window.cc
+++ b/ui/aura/window.cc
@@ -19,8 +19,11 @@
namespace aura {
+using internal::RootWindow;
+
Window::Window(WindowDelegate* delegate)
- : delegate_(delegate),
+ : is_root_(false),
+ delegate_(delegate),
visibility_(VISIBILITY_HIDDEN),
parent_(NULL),
id_(-1),
@@ -39,6 +42,11 @@ Window::~Window() {
if (focus_manager && focus_manager->focused_window() == this)
focus_manager->SetFocusedWindow(NULL);
+ // Let the root know so that it can remove any references to us.
+ RootWindow* root = GetRoot();
Ben Goodger (Google) 2011/09/21 04:15:21 Can you maybe move the FocusManager code above int
+ if (root)
+ root->WindowDestroying(this);
+
// Then destroy the children.
while (!children_.empty()) {
Window* child = children_[0];
@@ -70,6 +78,8 @@ void Window::SetVisibility(Visibility visibility) {
layer_->set_visible(visibility_ != VISIBILITY_HIDDEN);
if (layer_->visible())
SchedulePaint();
+ if (visibility_ != VISIBILITY_SHOWN)
+ ReleaseCapture();
}
void Window::SetLayoutManager(LayoutManager* layout_manager) {
@@ -135,6 +145,7 @@ void Window::MoveChildToFront(Window* child) {
void Window::AddChild(Window* child) {
DCHECK(std::find(children_.begin(), children_.end(), child) ==
children_.end());
+ DCHECK(!child->is_root_);
child->parent_ = this;
layer_->Add(child->layer_.get());
children_.push_back(child);
@@ -199,10 +210,50 @@ internal::FocusManager* Window::GetFocusManager() {
return parent_ ? parent_->GetFocusManager() : NULL;
}
+void Window::SetCapture() {
+ if (visibility_ != VISIBILITY_SHOWN)
+ return;
+
+ RootWindow* root = GetRoot();
+ if (!root)
+ return;
+
+ root->SetCapture(this);
+}
+
+void Window::ReleaseCapture() {
+ RootWindow* root = GetRoot();
+ if (!root)
+ return;
+
+ root->ReleaseCapture(this);
+}
+
+bool Window::HasCapture() {
+ RootWindow* root = GetRoot();
+ return root && root->capture_window() == this;
+}
+
+Window::Window(WindowDelegate* delegate, bool is_root)
+ : is_root_(is_root),
+ delegate_(delegate),
+ visibility_(VISIBILITY_HIDDEN),
+ parent_(NULL),
+ id_(-1),
+ user_data_(NULL) {
+}
+
void Window::SchedulePaint() {
SchedulePaintInRect(gfx::Rect(0, 0, bounds_.width(), bounds_.height()));
}
+RootWindow* Window::GetRoot() {
Ben Goodger (Google) 2011/09/21 04:15:21 rather than adding this state, how about a virtual
+ Window* parent = this;
+ while (parent && !parent->is_root_)
+ parent = parent->parent_;
+ return static_cast<RootWindow*>(parent);
+}
+
void Window::OnPaintLayer(gfx::Canvas* canvas) {
delegate_->OnPaint(canvas);
}
« ui/aura/root_window.cc ('K') | « ui/aura/window.h ('k') | ui/aura/window_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698