Index: ash/wm/overview/window_grid.cc |
diff --git a/ash/wm/overview/window_grid.cc b/ash/wm/overview/window_grid.cc |
index defc09bea24ec489ecefdae1003f5f2156406760..97d3923a3136b60d69188693cba2843902d053f9 100644 |
--- a/ash/wm/overview/window_grid.cc |
+++ b/ash/wm/overview/window_grid.cc |
@@ -15,13 +15,17 @@ |
#include "ash/shell_window_ids.h" |
#include "ash/wm/overview/scoped_transform_overview_window.h" |
#include "ash/wm/overview/window_selector.h" |
+#include "ash/wm/overview/window_selector_controller.h" |
#include "ash/wm/overview/window_selector_item.h" |
#include "ash/wm/window_state.h" |
#include "base/command_line.h" |
#include "base/i18n/string_search.h" |
#include "base/memory/scoped_vector.h" |
#include "third_party/skia/include/core/SkColor.h" |
+#include "ui/aura/scoped_window_targeter.h" |
#include "ui/aura/window.h" |
+#include "ui/aura/window_delegate.h" |
+#include "ui/aura/window_targeter.h" |
#include "ui/compositor/layer_animation_observer.h" |
#include "ui/compositor/scoped_layer_animation_settings.h" |
#include "ui/gfx/animation/tween.h" |
@@ -30,6 +34,7 @@ |
#include "ui/views/view.h" |
#include "ui/views/widget/widget.h" |
#include "ui/wm/core/window_animations.h" |
+#include "ui/wm/core/window_util.h" |
namespace ash { |
namespace { |
@@ -134,17 +139,45 @@ gfx::Vector2d GetSlideVectorForFadeIn(WindowSelector::Direction direction, |
return vector; |
} |
+// Always returns the same target. |
+class StaticWindowTargeter : public aura::WindowTargeter { |
+ public: |
+ explicit StaticWindowTargeter(aura::Window* target) : target_(target) {} |
+ ~StaticWindowTargeter() override {} |
+ |
+ private: |
+ // aura::WindowTargeter: |
+ ui::EventTarget* FindTargetForEvent(ui::EventTarget* root, |
+ ui::Event* event) override { |
+ return target_; |
+ } |
+ |
+ ui::EventTarget* FindTargetForLocatedEvent(ui::EventTarget* root, |
+ ui::LocatedEvent* event) override { |
+ return target_; |
+ } |
+ |
+ aura::Window* target_; |
+ DISALLOW_COPY_AND_ASSIGN(StaticWindowTargeter); |
+}; |
+ |
} // namespace |
WindowGrid::WindowGrid(aura::Window* root_window, |
const std::vector<aura::Window*>& windows, |
WindowSelector* window_selector) |
: root_window_(root_window), |
- window_selector_(window_selector) { |
+ window_selector_(window_selector), |
+ static_targeter_container_( |
+ Shell::GetContainer(root_window_, kShellWindowId_PanelContainer)) { |
WindowSelectorItem* panels_item = nullptr; |
- std::set<aura::Window*> panels_item_windows; |
- aura::Window* panels_parent = nullptr; |
+ scoped_panel_targeter_.reset( |
+ new aura::ScopedWindowTargeter( |
+ static_targeter_container_, |
+ scoped_ptr<ui::EventTargeter>( |
+ new StaticWindowTargeter(static_targeter_container_)))); |
+ static_targeter_container_->set_target_handler(this); |
bruthig
2015/01/09 17:04:33
So will all events be consumed by this then? ie E
Nina
2015/01/21 16:24:16
They'll be intercepted, and only handled if they e
|
for (aura::Window::Windows::const_iterator iter = windows.begin(); |
iter != windows.end(); ++iter) { |
@@ -161,32 +194,19 @@ WindowGrid::WindowGrid(aura::Window* root_window, |
panels_item = new WindowSelectorItem(root_window_); |
window_list_.push_back(panels_item); |
} |
- DCHECK(panels_parent == nullptr || panels_parent == (*iter)->parent()); |
- panels_parent = (*iter)->parent(); |
- panels_item_windows.insert(*iter); |
+ panels_item->AddWindow(*iter); |
} else { |
WindowSelectorItem* selector_item = new WindowSelectorItem(root_window_); |
window_list_.push_back(selector_item); |
selector_item->AddWindow(*iter); |
} |
} |
- |
- if (panels_item) { |
- // Sort and add panel windows in reverse z order to the WindowSelectorItem |
- // so that the transparent overlays are in the proper order. |
- |
- CHECK_GT(panels_item_windows.size(), 0u); |
- |
- const Windows& children = panels_parent->children(); |
- for (Windows::const_reverse_iterator iter = children.rbegin(); |
- iter != children.rend(); ++iter) { |
- if (panels_item_windows.find(*iter) != panels_item_windows.end()) |
- panels_item->AddWindow(*iter); |
- } |
- } |
} |
WindowGrid::~WindowGrid() { |
+ static_targeter_container_->set_target_handler( |
+ static_targeter_container_->delegate()); |
+ |
for (std::set<aura::Window*>::iterator iter = observed_windows_.begin(); |
iter != observed_windows_.end(); iter++) { |
(*iter)->RemoveObserver(this); |
@@ -406,6 +426,36 @@ void WindowGrid::OnWindowBoundsChanged(aura::Window* window, |
(*iter)->RecomputeWindowTransforms(); |
} |
+// ui::EventHandler: |
+void WindowGrid::OnMouseEvent(ui::MouseEvent* mouse) { |
+ if (mouse->type() != ui::ET_MOUSE_PRESSED) |
+ return; |
+ HandleTap(mouse); |
+} |
+ |
+void WindowGrid::OnGestureEvent(ui::GestureEvent* gesture) { |
+ if (gesture->type() != ui::ET_GESTURE_TAP) |
+ return; |
+ HandleTap(gesture); |
+} |
+ |
+void WindowGrid::HandleTap(ui::LocatedEvent* event) const { |
+ aura::Window* selected_window = GetWindowAt(event, |
+ Shell::GetContainer(root_window_, kShellWindowId_PanelContainer)); |
+ |
+ if (!selected_window) { |
+ selected_window = GetWindowAt(event, |
+ Shell::GetContainer(root_window_, kShellWindowId_DefaultContainer)); |
+ if (!selected_window) { |
+ ash::Shell::GetInstance()-> |
+ window_selector_controller()->ToggleOverview(); |
+ return; |
+ } |
+ } |
+ event->SetHandled(); |
+ wm::GetWindowState(selected_window)->Activate(); |
bruthig
2015/01/09 17:04:33
How difficult would it be to move the window activ
Nina
2015/01/21 16:24:16
We would have to search for the WindowSelectorItem
|
+} |
+ |
void WindowGrid::InitSelectionWidget(WindowSelector::Direction direction) { |
selection_widget_.reset(new views::Widget); |
views::Widget::InitParams params; |
@@ -482,6 +532,7 @@ void WindowGrid::MoveSelectionWidget(WindowSelector::Direction direction, |
// Send an a11y alert so that if ChromeVox is enabled, the item label is |
// read. |
SelectedWindow()->SendFocusAlert(); |
+ |
// The selection widget is moved to the newly selected item in the same |
// grid. |
MoveSelectionWidgetToTarget(animate); |
@@ -504,4 +555,34 @@ void WindowGrid::MoveSelectionWidgetToTarget(bool animate) { |
selection_widget_->SetOpacity(kWindowOverviewSelectorOpacity); |
} |
+aura::Window* WindowGrid::GetWindowAt(ui::LocatedEvent* event, |
+ aura::Window* container) const { |
+ // Find the old targeter to find the target of the event. |
+ ui::EventTargeter* targeter; |
+ if (container == static_targeter_container_) |
+ targeter = scoped_panel_targeter_->old_targeter(); |
+ else |
+ targeter = container->GetEventTargeter(); |
+ |
+ ui::EventTarget* window = container; |
+ while (!targeter && window->GetParentTarget()) { |
+ window = window->GetParentTarget(); |
+ targeter = window->GetEventTargeter(); |
+ } |
+ if (!targeter) |
+ return nullptr; |
+ |
+ aura::Window* target = static_cast<aura::Window*>( |
+ targeter->FindTargetForLocatedEvent(container, event)); |
+ if (target == container) |
+ return nullptr; |
+ |
+ while (target && target->parent() != container) |
+ target = target->parent(); |
+ aura::Window* transient_parent = |
+ target ? ::wm::GetTransientParent(target) : nullptr; |
+ |
+ return transient_parent ? transient_parent : target; |
+} |
+ |
} // namespace ash |