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

Unified Diff: ash/wm/overview/window_grid.cc

Issue 810033010: Remove TransparentActivateWindowButton from Overview Mode (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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: 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

Powered by Google App Engine
This is Rietveld 408576698