Index: components/exo/shell_surface.cc |
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0e7e90a3634c6a821fa48b17073bd47c5e731e8b |
--- /dev/null |
+++ b/components/exo/shell_surface.cc |
@@ -0,0 +1,164 @@ |
+// Copyright 2015 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 "components/exo/shell_surface.h" |
+ |
+#include "ash/shell.h" |
+#include "ash/shell_window_ids.h" |
+#include "base/logging.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "base/trace_event/trace_event.h" |
+#include "base/trace_event/trace_event_argument.h" |
+#include "components/exo/surface.h" |
+#include "ui/aura/window.h" |
+#include "ui/base/hit_test.h" |
+#include "ui/views/widget/widget.h" |
+ |
+namespace exo { |
+namespace { |
+ |
+class CustomFrameView : public views::NonClientFrameView { |
+ public: |
+ explicit CustomFrameView(views::Widget* widget) : widget_(widget) {} |
+ ~CustomFrameView() override {} |
+ |
+ // Overridden from views::NonClientFrameView: |
+ gfx::Rect GetBoundsForClientView() const override { return bounds(); } |
+ gfx::Rect GetWindowBoundsForClientBounds( |
+ const gfx::Rect& client_bounds) const override { |
+ return client_bounds; |
+ } |
+ int NonClientHitTest(const gfx::Point& point) override { |
+ return widget_->client_view()->NonClientHitTest(point); |
+ } |
+ void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask) override {} |
+ void ResetWindowControls() override {} |
+ void UpdateWindowIcon() override {} |
+ void UpdateWindowTitle() override {} |
+ void SizeConstraintsChanged() override {} |
+ |
+ private: |
+ views::Widget* const widget_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CustomFrameView); |
+}; |
+ |
+} // namespace |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// ShellSurface, public: |
+ |
+ShellSurface::ShellSurface(Surface* surface) |
+ : surface_(surface), show_state_(ui::SHOW_STATE_END) { |
+ surface_->SetSurfaceDelegate(this); |
+} |
+ |
+ShellSurface::~ShellSurface() { |
+ if (surface_) |
+ surface_->SetSurfaceDelegate(nullptr); |
+ if (widget_) |
+ widget_->CloseNow(); |
+} |
+ |
+void ShellSurface::Show() { |
+ TRACE_EVENT0("exo", "ShellSurface::Show"); |
+ |
+ if (!widget_ && show_state_ == ui::SHOW_STATE_END) |
+ show_state_ = ui::SHOW_STATE_DEFAULT; |
+} |
+ |
+void ShellSurface::SetToplevel() { |
+ TRACE_EVENT0("exo", "ShellSurface::SetToplevel"); |
+ |
+ if (!widget_) |
+ show_state_ = ui::SHOW_STATE_NORMAL; |
+} |
+ |
+void ShellSurface::SetFullscreen(bool fullscreen) { |
+ TRACE_EVENT1("exo", "ShellSurface::SetFullscreen", "fullscreen", fullscreen); |
+ |
+ if (widget_) { |
+ widget_->SetFullscreen(fullscreen); |
+ return; |
+ } |
+ |
+ show_state_ = fullscreen ? ui::SHOW_STATE_FULLSCREEN : ui::SHOW_STATE_DEFAULT; |
+} |
+ |
+void ShellSurface::SetTitle(const base::string16& title) { |
+ TRACE_EVENT1("exo", "ShellSurface::SetTitle", "title", |
+ base::UTF16ToUTF8(title)); |
+ |
+ title_ = title; |
+ if (widget_) |
+ widget_->UpdateWindowTitle(); |
+} |
+ |
+scoped_refptr<base::trace_event::TracedValue> ShellSurface::AsTracedValue() |
+ const { |
+ scoped_refptr<base::trace_event::TracedValue> value = |
+ new base::trace_event::TracedValue; |
+ value->SetString("title", base::UTF16ToUTF8(title_)); |
+ return value; |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// SurfaceDelegate overrides: |
+ |
+void ShellSurface::OnSurfaceDestroying() { |
+ surface_ = nullptr; |
+} |
+ |
+void ShellSurface::OnSurfaceCommit() { |
+ if (widget_ || show_state_ == ui::SHOW_STATE_END) |
+ return; |
+ |
+ views::Widget::InitParams params; |
+ params.type = views::Widget::InitParams::TYPE_WINDOW; |
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
+ params.delegate = this; |
+ params.shadow_type = show_state_ == ui::SHOW_STATE_NORMAL |
+ ? views::Widget::InitParams::SHADOW_TYPE_DROP |
+ : views::Widget::InitParams::SHADOW_TYPE_NONE; |
+ params.opacity = show_state_ == ui::SHOW_STATE_NORMAL |
+ ? views::Widget::InitParams::OPAQUE_WINDOW |
+ : views::Widget::InitParams::TRANSLUCENT_WINDOW; |
+ params.show_state = show_state_; |
+ params.parent = ash::Shell::GetContainer( |
+ ash::Shell::GetPrimaryRootWindow(), ash::kShellWindowId_DefaultContainer); |
+ widget_.reset(new views::Widget); |
+ widget_->Init(params); |
+ widget_->GetNativeWindow()->set_owned_by_parent(false); |
+ widget_->GetNativeView()->SetName("ShellSurface"); |
+ widget_->Show(); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// views::WidgetDelegate overrides: |
+ |
+base::string16 ShellSurface::GetWindowTitle() const { |
+ return title_; |
+} |
+ |
+views::Widget* ShellSurface::GetWidget() { |
+ return widget_.get(); |
+} |
+ |
+const views::Widget* ShellSurface::GetWidget() const { |
+ return widget_.get(); |
+} |
+ |
+views::View* ShellSurface::GetContentsView() { |
+ return surface_; |
+} |
+ |
+views::NonClientFrameView* ShellSurface::CreateNonClientFrameView( |
+ views::Widget* widget) { |
+ // Default show state is borderless and requires a custom frame view as the |
+ // default one does not support this. |
+ return show_state_ != ui::SHOW_STATE_NORMAL ? new CustomFrameView(widget) |
+ : nullptr; |
+} |
+ |
+} // namespace exo |