Chromium Code Reviews| Index: components/exo/shell_surface.cc |
| diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc |
| index 9f3aaadd0097b18454bf31baeb7052db47771fae..06c277d2b644693846f47f9f7e80cee1a638d89e 100644 |
| --- a/components/exo/shell_surface.cc |
| +++ b/components/exo/shell_surface.cc |
| @@ -8,6 +8,7 @@ |
| #include "ash/common/shell_window_ids.h" |
| #include "ash/common/wm/window_resizer.h" |
| #include "ash/common/wm/window_state.h" |
| +#include "ash/common/wm/window_state_delegate.h" |
| #include "ash/shell.h" |
| #include "ash/wm/window_state_aura.h" |
| #include "ash/wm/window_util.h" |
| @@ -27,6 +28,7 @@ |
| #include "ui/base/accelerators/accelerator.h" |
| #include "ui/gfx/path.h" |
| #include "ui/views/widget/widget.h" |
| +#include "ui/views/widget/widget_observer.h" |
| #include "ui/wm/core/shadow.h" |
| #include "ui/wm/core/shadow_controller.h" |
| #include "ui/wm/core/shadow_types.h" |
| @@ -98,6 +100,39 @@ class CustomWindowTargeter : public aura::WindowTargeter { |
| DISALLOW_COPY_AND_ASSIGN(CustomWindowTargeter); |
| }; |
| +// Handles a user's fullscreen request (Shift+F4/F4). |
| +class CustomWindowStateDelegate : public ash::wm::WindowStateDelegate, |
| + public views::WidgetObserver { |
| + public: |
| + explicit CustomWindowStateDelegate(views::Widget* widget) : widget_(widget) { |
| + widget_->AddObserver(this); |
| + } |
| + ~CustomWindowStateDelegate() override { |
| + if (widget_) |
| + widget_->RemoveObserver(this); |
| + } |
| + |
| + // Overridden from ash::wm::WindowStateDelegate: |
|
oshima
2016/07/22 19:50:56
nit: // ash::wm::WindowStateDelegate:
reveman
2016/07/22 19:59:16
as discussed, I'll change the style for all exo/ c
|
| + bool ToggleFullscreen(ash::wm::WindowState* window_state) override { |
| + if (widget_) { |
| + bool enter_fullscreen = !window_state->IsFullscreen(); |
| + widget_->SetFullscreen(enter_fullscreen); |
| + } |
| + return true; |
| + } |
| + |
| + // Overridden from views::WidgetObserver: |
|
oshima
2016/07/22 19:50:56
ditto
reveman
2016/07/22 19:59:16
ditto
|
| + void OnWidgetDestroying(views::Widget* widget) override { |
| + widget_->RemoveObserver(this); |
| + widget_ = nullptr; |
| + } |
| + |
| + private: |
| + views::Widget* widget_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(CustomWindowStateDelegate); |
| +}; |
| + |
| class ShellSurfaceWidget : public views::Widget { |
| public: |
| explicit ShellSurfaceWidget(ShellSurface* shell_surface) |
| @@ -908,6 +943,10 @@ void ShellSurface::CreateShellSurfaceWidget(ui::WindowShowState show_state) { |
| ui::AcceleratorManager::kNormalPriority, this); |
| } |
| + // Set delegate for handling of fullscreening. |
| + window_state->SetDelegate(std::unique_ptr<ash::wm::WindowStateDelegate>( |
| + new CustomWindowStateDelegate(widget_))); |
| + |
| // Show widget next time Commit() is called. |
| pending_show_widget_ = true; |
| } |