Index: mash/screenlock/screenlock.cc |
diff --git a/mash/screenlock/screenlock.cc b/mash/screenlock/screenlock.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c865c32987702ceeb0521ab04567c7564d338069 |
--- /dev/null |
+++ b/mash/screenlock/screenlock.cc |
@@ -0,0 +1,119 @@ |
+// 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 "mash/screenlock/screenlock.h" |
+ |
+#include "base/macros.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "components/mus/public/cpp/property_type_converters.h" |
+#include "mash/shell/public/interfaces/shell.mojom.h" |
+#include "mash/wm/public/interfaces/container.mojom.h" |
+#include "mojo/public/cpp/bindings/binding.h" |
+#include "mojo/shell/public/cpp/application_impl.h" |
+#include "ui/views/background.h" |
+#include "ui/views/controls/button/label_button.h" |
+#include "ui/views/mus/aura_init.h" |
+#include "ui/views/mus/native_widget_mus.h" |
+#include "ui/views/mus/window_manager_connection.h" |
+#include "ui/views/widget/widget_delegate.h" |
+ |
+namespace mash { |
+namespace screenlock { |
+namespace { |
+ |
+class ScreenlockView : public views::WidgetDelegateView, |
+ public views::ButtonListener { |
+ public: |
+ explicit ScreenlockView(mojo::ApplicationImpl* app) |
+ : app_(app), |
+ unlock_button_( |
+ new views::LabelButton(this, base::ASCIIToUTF16("Unlock"))) { |
+ set_background(views::Background::CreateSolidBackground(SK_ColorYELLOW)); |
+ unlock_button_->SetStyle(views::Button::STYLE_BUTTON); |
+ AddChildView(unlock_button_); |
+ } |
+ ~ScreenlockView() override {} |
+ |
+ private: |
+ // Overridden from views::WidgetDelegate: |
+ views::View* GetContentsView() override { return this; } |
+ base::string16 GetWindowTitle() const override { |
+ // TODO(beng): use resources. |
+ return base::ASCIIToUTF16("Screenlock"); |
+ } |
+ |
+ // Overridden from views::View: |
+ void Layout() override { |
+ gfx::Rect bounds = GetLocalBounds(); |
+ bounds.Inset(10, 10); |
+ |
+ gfx::Size ps = unlock_button_->GetPreferredSize(); |
+ bounds.set_height(bounds.height() - ps.height() - 10); |
+ |
+ unlock_button_->SetBounds(bounds.width() - ps.width(), |
+ bounds.bottom() + 10, |
+ ps.width(), ps.height()); |
+ } |
+ |
+ // Overridden from views::ButtonListener: |
+ void ButtonPressed(views::Button* sender, const ui::Event& event) override { |
+ DCHECK_EQ(sender, unlock_button_); |
+ mash::shell::mojom::ShellPtr shell; |
+ app_->ConnectToService("mojo:mash_shell", &shell); |
+ shell->UnlockScreen(); |
+ } |
+ |
+ mojo::ApplicationImpl* app_; |
+ views::LabelButton* unlock_button_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScreenlockView); |
+}; |
+ |
+} // namespace |
+ |
+Screenlock::Screenlock() : app_(nullptr) {} |
+Screenlock::~Screenlock() {} |
+ |
+void Screenlock::Initialize(mojo::ApplicationImpl* app) { |
+ app_ = app; |
+ tracing_.Initialize(app); |
+ |
+ aura_init_.reset(new views::AuraInit(app, "views_mus_resources.pak")); |
+ views::WindowManagerConnection::Create(app); |
+ |
+ views::Widget* widget = new views::Widget; |
+ views::Widget::InitParams params( |
+ views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
+ params.delegate = new ScreenlockView(app); |
+ |
+ std::map<std::string, std::vector<uint8_t>> properties; |
+ properties[mash::wm::mojom::kWindowContainer_Property] = |
+ mojo::TypeConverter<const std::vector<uint8_t>, int32_t>::Convert( |
+ static_cast<int32_t>(mash::wm::mojom::Container::LOGIN_WINDOWS)); |
+ mus::Window* window = |
+ views::WindowManagerConnection::Get()->NewWindow(properties); |
+ params.native_widget = new views::NativeWidgetMus( |
+ widget, app->shell(), window, mus::mojom::SurfaceType::DEFAULT); |
+ widget->Init(params); |
+ widget->Show(); |
+} |
+ |
+bool Screenlock::ConfigureIncomingConnection( |
+ mojo::ApplicationConnection* connection) { |
+ connection->AddService<mash::screenlock::mojom::Screenlock>(this); |
+ return true; |
+} |
+ |
+void Screenlock::Quit() { |
+ app_->Quit(); |
+} |
+ |
+void Screenlock::Create( |
+ mojo::ApplicationConnection* connection, |
+ mojo::InterfaceRequest<mash::screenlock::mojom::Screenlock> r) { |
+ bindings_.AddBinding(this, std::move(r)); |
+} |
+ |
+} // namespace screenlock |
+} // namespace main |