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 @@
'common/wm/drag_details.h',
'common/wm/focus_rules.cc',
'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.h',
'common/wm/maximize_mode/maximize_mode_controller.cc',
......
......@@ -75,6 +75,9 @@ const char kAshEnableSoftwareMirroring[] = "ash-enable-software-mirroring";
// flag is removed.
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,
// such as battery level updates.
const char kAshHideNotificationsForFactory[] =
......
......@@ -37,6 +37,7 @@ ASH_EXPORT extern const char kAshDisableStableOverviewOrder[];
ASH_EXPORT extern const char kAshEnableStableOverviewOrder[];
ASH_EXPORT extern const char kAshEnableSoftwareMirroring[];
ASH_EXPORT extern const char kAshEnableTouchViewTesting[];
ASH_EXPORT extern const char kAshEnableWindowCycleUi[];
ASH_EXPORT extern const char kAshHideNotificationsForFactory[];
ASH_EXPORT extern const char kAshHostWindowBounds[];
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 @@
#include <algorithm>
#include "ash/aura/wm_window_aura.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/screen_util.h"
#include "ash/shell.h"
......@@ -28,61 +30,9 @@
#include "ui/wm/core/window_util.h"
namespace ash {
namespace {
// A layer delegate to paint the content of the recreaetd layers
// by delegating the paint request to the original delegate.
// 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.
// This keeps track of the drag window's state. It creates/destroys/updates
// bounds and opacity based on the current bounds.
class DragWindowController::DragWindowDetails
: public aura::WindowDelegate,
public ::wm::LayerDelegateFactory {
......@@ -186,8 +136,8 @@ class DragWindowController::DragWindowDetails
ui::LayerDelegate* CreateDelegate(ui::LayerDelegate* delegate) override {
if (!delegate)
return nullptr;
DragWindowLayerDelegate* new_delegate =
new DragWindowLayerDelegate(original_window_, delegate);
wm::ForwardingLayerDelegate* new_delegate = new wm::ForwardingLayerDelegate(
WmWindowAura::Get(original_window_), delegate);
delegates_.push_back(base::WrapUnique(new_delegate));
return new_delegate;
}
......@@ -227,7 +177,7 @@ class DragWindowController::DragWindowDetails
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.
std::unique_ptr<ui::LayerTreeOwner> layer_owner_;
......
This diff is collapsed.
......@@ -13,9 +13,15 @@
#include "ash/wm/window_cycle_controller.h"
#include "base/macros.h"
namespace views {
class Label;
class Widget;
}
namespace ash {
class ScopedShowWindow;
class WindowCycleView;
// Tracks a set of Windows that can be stepped through. This class is used by
// the WindowCycleController.
......@@ -37,12 +43,15 @@ class ASH_EXPORT WindowCycleList : public WmWindowObserver {
friend class WindowCycleControllerTest;
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
// take care of that even if it is not intended for the user to close a window
// while window cycling.
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 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
......@@ -56,6 +65,13 @@ class ASH_EXPORT WindowCycleList : public WmWindowObserver {
// Wrapper for the window brought to the front.
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);
};
......
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