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

Unified Diff: ash/mus/wm/non_client_frame_controller.cc

Issue 1641003002: [exp] ash: Ash in Mus. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tot-merge Created 4 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
« no previous file with comments | « ash/mus/wm/non_client_frame_controller.h ('k') | ash/mus/wm/window_manager_application.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/mus/wm/non_client_frame_controller.cc
diff --git a/ash/mus/wm/non_client_frame_controller.cc b/ash/mus/wm/non_client_frame_controller.cc
new file mode 100644
index 0000000000000000000000000000000000000000..ed0eb8afa582ea18662c5ca8263d38752edca9a6
--- /dev/null
+++ b/ash/mus/wm/non_client_frame_controller.cc
@@ -0,0 +1,185 @@
+// 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 "ash/mus/wm/non_client_frame_controller.h"
+
+#include <stdint.h>
+
+#include "base/macros.h"
+#include "components/mus/public/cpp/property_type_converters.h"
+#include "components/mus/public/cpp/window.h"
+#include "components/mus/public/cpp/window_property.h"
+#include "components/mus/public/interfaces/window_manager.mojom.h"
+#include "components/mus/public/interfaces/window_tree_host.mojom.h"
+#include "mojo/converters/geometry/geometry_type_converters.h"
+#include "ui/aura/layout_manager.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/compositor/layer.h"
+#include "ui/views/mus/native_widget_mus.h"
+#include "ui/views/mus/platform_window_mus.h"
+#include "ui/views/widget/native_widget_aura.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_observer.h"
+
+namespace ash {
+namespace muswm {
+namespace {
+
+void SatisfyCallback(cc::SurfaceSequence sequence) {
+ // TODO(fsamuel): Implement this.
+}
+
+// See surface_layer.h for a description of this callback.
+void RequireCallback(cc::SurfaceId surface_id, cc::SurfaceSequence sequence) {
+ // TODO(fsamuel): Implement this.
+}
+
+const int kCaptionHeight = 33;
+
+class NSync : public views::WidgetObserver, public ui::PlatformWindowDelegate {
+ public:
+ NSync(views::Widget* widget, mojo::Shell* shell, mus::Window* window)
+ : widget_(widget),
+ platform_window_(new views::PlatformWindowMus(this, shell, window)),
+ mus_window_(window) {
+ widget_->AddObserver(this);
+ CreateLayer();
+ }
+
+ ~NSync() override {
+ if (widget_)
+ widget_->RemoveObserver(this);
+ }
+
+ private:
+ void CreateLayer() {
+ DCHECK(widget_);
+ layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR));
+ UpdateLayerSize();
+ layer_->SetVisible(true);
+ widget_->GetNativeWindow()->layer()->Add(layer_.get());
+ }
+
+ void UpdateLayerSize() {
+ gfx::Rect bounds(platform_window_->GetBounds());
+ layer_->SetBounds(gfx::Rect(gfx::Point(0, kCaptionHeight), bounds.size()));
+ layer_->SetShowSurface(static_cast<cc::SurfaceId>(mus_window_->id()),
+ base::Bind(&SatisfyCallback),
+ base::Bind(&RequireCallback), bounds.size(),
+ 1.f, // XXX(sad):
+ bounds.size());
+ }
+
+ // views::WidgetObserver:
+ void OnWidgetDestroying(views::Widget* widget) override {
+ widget_->RemoveObserver(this);
+ widget_ = nullptr;
+ mus_window_->RequestClose();
+ }
+
+ void OnWidgetBoundsChanged(views::Widget* widget,
+ const gfx::Rect& bounds) override {
+ gfx::Rect newbounds = bounds;
+ newbounds.set_height(bounds.height() - kCaptionHeight);
+ platform_window_->SetBounds(newbounds);
+ UpdateLayerSize();
+ }
+
+ // ui::PlatformWindowDelegate:
+ void OnBoundsChanged(const gfx::Rect& new_bounds) override {}
+ void OnDamageRect(const gfx::Rect& damaged_region) override {}
+ void DispatchEvent(ui::Event* event) override {}
+ void OnCloseRequest() override {}
+ void OnClosed() override { delete this; }
+ void OnWindowStateChanged(ui::PlatformWindowState new_state) override {}
+ void OnLostCapture() override {}
+ void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget,
+ float device_pixel_ratio) override {}
+ void OnAcceleratedWidgetDestroyed() override {}
+ void OnActivationChanged(bool active) override {}
+
+ views::Widget* widget_;
+ scoped_ptr<views::PlatformWindowMus> platform_window_;
+ scoped_ptr<ui::Layer> layer_;
+ mus::Window* mus_window_;
+
+ DISALLOW_COPY_AND_ASSIGN(NSync);
+};
+
+} // namespace
+
+NonClientFrameController::NonClientFrameController(
+ mojo::Shell* shell,
+ mus::Window* window,
+ mus::mojom::WindowTreeHost* window_tree_host,
+ aura::Window* aura_root)
+ : widget_(new views::Widget),
+ window_(window),
+ mus_window_tree_host_(window_tree_host) {
+ window_->AddObserver(this);
+
+ views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
+ params.activatable = views::Widget::InitParams::ACTIVATABLE_YES;
+ params.delegate = this;
+ params.native_widget = new views::NativeWidgetAura(widget_);
+ params.context = aura_root;
+ params.bounds = window_->bounds();
+ widget_->Init(params);
+ widget_->Show();
+ widget_->GetNativeWindow()->SetName(__PRETTY_FUNCTION__);
+
+ new NSync(widget_, shell, window_);
+}
+
+NonClientFrameController::~NonClientFrameController() {
+ if (window_)
+ window_->RemoveObserver(this);
+}
+
+base::string16 NonClientFrameController::GetWindowTitle() const {
+ if (!window_ ||
+ !window_->HasSharedProperty(
+ mus::mojom::WindowManager::kWindowTitle_Property)) {
+ return base::string16();
+ }
+
+ return window_->GetSharedProperty<base::string16>(
+ mus::mojom::WindowManager::kWindowTitle_Property);
+}
+
+views::View* NonClientFrameController::GetContentsView() {
+ return this;
+}
+
+bool NonClientFrameController::CanResize() const {
+ return true;
+}
+
+bool NonClientFrameController::CanMaximize() const {
+ return true;
+}
+
+bool NonClientFrameController::CanMinimize() const {
+ return true;
+}
+
+void NonClientFrameController::OnWindowSharedPropertyChanged(
+ mus::Window* window,
+ const std::string& name,
+ const std::vector<uint8_t>* old_data,
+ const std::vector<uint8_t>* new_data) {
+ if (name == mus::mojom::WindowManager::kResizeBehavior_Property)
+ widget_->OnSizeConstraintsChanged();
+ else if (name == mus::mojom::WindowManager::kWindowTitle_Property)
+ widget_->UpdateWindowTitle();
+}
+
+void NonClientFrameController::OnWindowDestroyed(mus::Window* window) {
+ window_->RemoveObserver(this);
+ window_ = nullptr;
+}
+
+} // namespace muswm
+} // namespace ash
« no previous file with comments | « ash/mus/wm/non_client_frame_controller.h ('k') | ash/mus/wm/window_manager_application.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698