Commit 6d7ebab8 authored by estade's avatar estade Committed by Commit bot

[CrOS] Initial rough cut of alt-tab window cycling UI.

A bit ugly, but mostly functional. I think most changes going forward
should be aesthetic, so this seems like a decent place for an initial
commit.

Enabled with --ash-enable-window-cycle-ui flag.

BUG=626111

Review-Url: https://codereview.chromium.org/2129773002
Cr-Commit-Position: refs/heads/master@{#406120}
parent cbb31e64
...@@ -340,6 +340,8 @@ ...@@ -340,6 +340,8 @@
'common/wm/drag_details.h', 'common/wm/drag_details.h',
'common/wm/focus_rules.cc', 'common/wm/focus_rules.cc',
'common/wm/focus_rules.h', 'common/wm/focus_rules.h',
'common/wm/forwarding_layer_delegate.cc',
'common/wm/forwarding_layer_delegate.h',
'common/wm/fullscreen_window_finder.cc', 'common/wm/fullscreen_window_finder.cc',
'common/wm/fullscreen_window_finder.h', 'common/wm/fullscreen_window_finder.h',
'common/wm/maximize_mode/maximize_mode_controller.cc', 'common/wm/maximize_mode/maximize_mode_controller.cc',
......
...@@ -75,6 +75,9 @@ const char kAshEnableSoftwareMirroring[] = "ash-enable-software-mirroring"; ...@@ -75,6 +75,9 @@ const char kAshEnableSoftwareMirroring[] = "ash-enable-software-mirroring";
// flag is removed. // flag is removed.
const char kAshEnableTouchViewTesting[] = "ash-enable-touch-view-testing"; const char kAshEnableTouchViewTesting[] = "ash-enable-touch-view-testing";
// Enables the window cycling UI (more visual feedback for alt-tab).
const char kAshEnableWindowCycleUi[] = "ash-enable-window-cycle-ui";
// Hides notifications that are irrelevant to Chrome OS device factory testing, // Hides notifications that are irrelevant to Chrome OS device factory testing,
// such as battery level updates. // such as battery level updates.
const char kAshHideNotificationsForFactory[] = const char kAshHideNotificationsForFactory[] =
......
...@@ -37,6 +37,7 @@ ASH_EXPORT extern const char kAshDisableStableOverviewOrder[]; ...@@ -37,6 +37,7 @@ ASH_EXPORT extern const char kAshDisableStableOverviewOrder[];
ASH_EXPORT extern const char kAshEnableStableOverviewOrder[]; ASH_EXPORT extern const char kAshEnableStableOverviewOrder[];
ASH_EXPORT extern const char kAshEnableSoftwareMirroring[]; ASH_EXPORT extern const char kAshEnableSoftwareMirroring[];
ASH_EXPORT extern const char kAshEnableTouchViewTesting[]; ASH_EXPORT extern const char kAshEnableTouchViewTesting[];
ASH_EXPORT extern const char kAshEnableWindowCycleUi[];
ASH_EXPORT extern const char kAshHideNotificationsForFactory[]; ASH_EXPORT extern const char kAshHideNotificationsForFactory[];
ASH_EXPORT extern const char kAshHostWindowBounds[]; ASH_EXPORT extern const char kAshHostWindowBounds[];
ASH_EXPORT extern const char kAshMaterialDesign[]; ASH_EXPORT extern const char kAshMaterialDesign[];
......
// Copyright 2016 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 "ash/common/wm/forwarding_layer_delegate.h"
#include "ash/common/wm_window.h"
#include "base/callback.h"
#include "ui/compositor/layer.h"
namespace ash {
namespace wm {
ForwardingLayerDelegate::ForwardingLayerDelegate(WmWindow* original_window,
ui::LayerDelegate* delegate)
: original_window_(original_window), original_delegate_(delegate) {}
ForwardingLayerDelegate::~ForwardingLayerDelegate() {}
void ForwardingLayerDelegate::OnPaintLayer(const ui::PaintContext& context) {
if (!original_delegate_)
return;
// |original_delegate_| may have already been deleted or
// disconnected by this time. Check if |original_delegate_| is still
// used by the original_window tree, or skip otherwise.
if (IsDelegateValid(original_window_->GetLayer()))
original_delegate_->OnPaintLayer(context);
else
original_delegate_ = nullptr;
}
void ForwardingLayerDelegate::OnDelegatedFrameDamage(
const gfx::Rect& damage_rect_in_dip) {}
void ForwardingLayerDelegate::OnDeviceScaleFactorChanged(
float device_scale_factor) {
// Don't tell the original delegate about device scale factor change
// on cloned layer because the original layer is still on the same display.
}
base::Closure ForwardingLayerDelegate::PrepareForLayerBoundsChange() {
return base::Closure();
}
bool ForwardingLayerDelegate::IsDelegateValid(ui::Layer* layer) const {
if (layer->delegate() == original_delegate_)
return true;
for (auto* child : layer->children()) {
if (IsDelegateValid(child))
return true;
}
return false;
}
} // namespace wm
} // namespace ash
// Copyright 2016 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.
#ifndef ASH_COMMON_WM_FORWARDING_LAYER_DELEGATE_H_
#define ASH_COMMON_WM_FORWARDING_LAYER_DELEGATE_H_
#include "base/macros.h"
#include "ui/compositor/layer_delegate.h"
namespace ui {
class Layer;
}
namespace ash {
class WmWindow;
namespace wm {
// A layer delegate to paint the content of a recreated layer by delegating
// the paint request to the original delegate. It checks if the original
// delegate is still valid by traversing the original layers.
class ForwardingLayerDelegate : public ui::LayerDelegate {
public:
ForwardingLayerDelegate(WmWindow* original_window,
ui::LayerDelegate* delegate);
~ForwardingLayerDelegate() override;
private:
bool IsDelegateValid(ui::Layer* layer) const;
// ui:LayerDelegate:
void OnPaintLayer(const ui::PaintContext& context) override;
void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override;
void OnDeviceScaleFactorChanged(float device_scale_factor) override;
base::Closure PrepareForLayerBoundsChange() override;
WmWindow* original_window_;
ui::LayerDelegate* original_delegate_;
DISALLOW_COPY_AND_ASSIGN(ForwardingLayerDelegate);
};
} // namespace wm
} // namespace ash
#endif // ASH_COMMON_WM_FORWARDING_LAYER_DELEGATE_H_
...@@ -6,7 +6,9 @@ ...@@ -6,7 +6,9 @@
#include <algorithm> #include <algorithm>
#include "ash/aura/wm_window_aura.h"
#include "ash/common/shell_window_ids.h" #include "ash/common/shell_window_ids.h"
#include "ash/common/wm/forwarding_layer_delegate.h"
#include "ash/display/window_tree_host_manager.h" #include "ash/display/window_tree_host_manager.h"
#include "ash/screen_util.h" #include "ash/screen_util.h"
#include "ash/shell.h" #include "ash/shell.h"
...@@ -28,61 +30,9 @@ ...@@ -28,61 +30,9 @@
#include "ui/wm/core/window_util.h" #include "ui/wm/core/window_util.h"
namespace ash { namespace ash {
namespace {
// A layer delegate to paint the content of the recreaetd layers // This keeps track of the drag window's state. It creates/destroys/updates
// by delegating the paint request to the original delegate. // bounds and opacity based on the current bounds.
// It checks if the orignal delegate is still valid by traversing
// the original layers.
class DragWindowLayerDelegate : public ui::LayerDelegate {
public:
DragWindowLayerDelegate(aura::Window* original_window,
ui::LayerDelegate* delegate)
: original_window_(original_window), original_delegate_(delegate) {}
~DragWindowLayerDelegate() override {}
private:
// ui:LayerDelegate:
void OnPaintLayer(const ui::PaintContext& context) override {
if (!original_delegate_)
return;
// |original_delegate_| may have already been deleted or
// disconnected by this time. Check if |original_delegate_| is still
// used by the original_window tree, or skip otherwise.
if (IsDelegateValid(original_window_->layer()))
original_delegate_->OnPaintLayer(context);
else
original_delegate_ = nullptr;
}
void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override {}
void OnDeviceScaleFactorChanged(float device_scale_factor) override {
// Don't tell the original delegate about device scale factor change
// on cloned layer because the original layer is still on the same display.
}
base::Closure PrepareForLayerBoundsChange() override {
return base::Closure();
}
bool IsDelegateValid(ui::Layer* layer) {
if (layer->delegate() == original_delegate_)
return true;
for (auto* child : layer->children()) {
if (IsDelegateValid(child))
return true;
}
return false;
}
aura::Window* original_window_;
ui::LayerDelegate* original_delegate_;
DISALLOW_COPY_AND_ASSIGN(DragWindowLayerDelegate);
};
} // namespace
// This keeps tack of the drag window's state. It creates/destory/updates bounds
// and opacity based on the current bounds.
class DragWindowController::DragWindowDetails class DragWindowController::DragWindowDetails
: public aura::WindowDelegate, : public aura::WindowDelegate,
public ::wm::LayerDelegateFactory { public ::wm::LayerDelegateFactory {
...@@ -186,8 +136,8 @@ class DragWindowController::DragWindowDetails ...@@ -186,8 +136,8 @@ class DragWindowController::DragWindowDetails
ui::LayerDelegate* CreateDelegate(ui::LayerDelegate* delegate) override { ui::LayerDelegate* CreateDelegate(ui::LayerDelegate* delegate) override {
if (!delegate) if (!delegate)
return nullptr; return nullptr;
DragWindowLayerDelegate* new_delegate = wm::ForwardingLayerDelegate* new_delegate = new wm::ForwardingLayerDelegate(
new DragWindowLayerDelegate(original_window_, delegate); WmWindowAura::Get(original_window_), delegate);
delegates_.push_back(base::WrapUnique(new_delegate)); delegates_.push_back(base::WrapUnique(new_delegate));
return new_delegate; return new_delegate;
} }
...@@ -227,7 +177,7 @@ class DragWindowController::DragWindowDetails ...@@ -227,7 +177,7 @@ class DragWindowController::DragWindowDetails
aura::Window* original_window_ = nullptr; aura::Window* original_window_ = nullptr;
std::vector<std::unique_ptr<DragWindowLayerDelegate>> delegates_; std::vector<std::unique_ptr<wm::ForwardingLayerDelegate>> delegates_;
// The copy of window_->layer() and its descendants. // The copy of window_->layer() and its descendants.
std::unique_ptr<ui::LayerTreeOwner> layer_owner_; std::unique_ptr<ui::LayerTreeOwner> layer_owner_;
......
This diff is collapsed.
...@@ -13,9 +13,15 @@ ...@@ -13,9 +13,15 @@
#include "ash/wm/window_cycle_controller.h" #include "ash/wm/window_cycle_controller.h"
#include "base/macros.h" #include "base/macros.h"
namespace views {
class Label;
class Widget;
}
namespace ash { namespace ash {
class ScopedShowWindow; class ScopedShowWindow;
class WindowCycleView;
// Tracks a set of Windows that can be stepped through. This class is used by // Tracks a set of Windows that can be stepped through. This class is used by
// the WindowCycleController. // the WindowCycleController.
...@@ -37,12 +43,15 @@ class ASH_EXPORT WindowCycleList : public WmWindowObserver { ...@@ -37,12 +43,15 @@ class ASH_EXPORT WindowCycleList : public WmWindowObserver {
friend class WindowCycleControllerTest; friend class WindowCycleControllerTest;
const WindowList& windows() const { return windows_; } const WindowList& windows() const { return windows_; }
// aura::WindowObserver overrides: // WmWindowObserver overrides:
// There is a chance a window is destroyed, for example by JS code. We need to // There is a chance a window is destroyed, for example by JS code. We need to
// take care of that even if it is not intended for the user to close a window // take care of that even if it is not intended for the user to close a window
// while window cycling. // while window cycling.
void OnWindowDestroying(WmWindow* window) override; void OnWindowDestroying(WmWindow* window) override;
// Returns true if the window list overlay should be shown.
bool ShouldShowUi();
// List of weak pointers to windows to use while cycling with the keyboard. // List of weak pointers to windows to use while cycling with the keyboard.
// List is built when the user initiates the gesture (i.e. hits alt-tab the // List is built when the user initiates the gesture (i.e. hits alt-tab the
// first time) and is emptied when the gesture is complete (i.e. releases the // first time) and is emptied when the gesture is complete (i.e. releases the
...@@ -56,6 +65,13 @@ class ASH_EXPORT WindowCycleList : public WmWindowObserver { ...@@ -56,6 +65,13 @@ class ASH_EXPORT WindowCycleList : public WmWindowObserver {
// Wrapper for the window brought to the front. // Wrapper for the window brought to the front.
std::unique_ptr<ScopedShowWindow> showing_window_; std::unique_ptr<ScopedShowWindow> showing_window_;
// The top level View for the window cycle UI. May be null if the UI is not
// showing.
WindowCycleView* cycle_view_;
// The widget that hosts the window cycle UI.
std::unique_ptr<views::Widget> cycle_ui_widget_;
DISALLOW_COPY_AND_ASSIGN(WindowCycleList); DISALLOW_COPY_AND_ASSIGN(WindowCycleList);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment