Index: mash/shelf/shelf_application.cc |
diff --git a/mash/shelf/shelf_application.cc b/mash/shelf/shelf_application.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4d563961d52cefbd2573a83370cba6e290668295 |
--- /dev/null |
+++ b/mash/shelf/shelf_application.cc |
@@ -0,0 +1,147 @@ |
+// 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 "mash/shelf/shelf_application.h" |
+ |
+#include <stdint.h> |
+ |
+#include "base/macros.h" |
+#include "base/strings/stringprintf.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "components/mus/public/cpp/property_type_converters.h" |
+#include "components/mus/public/cpp/window.h" |
+#include "mash/wm/public/interfaces/container.mojom.h" |
+#include "mojo/shell/public/cpp/application_connection.h" |
+#include "mojo/shell/public/cpp/application_impl.h" |
+#include "ui/gfx/canvas.h" |
+#include "ui/views/controls/button/label_button.h" |
+#include "ui/views/layout/box_layout.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 shelf { |
+ |
+enum ShelfButtonID { |
+ SHELF_BUTTON_VIEWS_EXAMPLES, |
+ SHELF_BUTTON_TASK_VIEWER, |
+}; |
+ |
+// A rudimentary mash shelf, used to build up the required wm interfaces. |
+class ShelfView : public views::WidgetDelegateView, |
sky
2016/01/13 21:17:17
This is fine for now, but no doubt this is going t
msw
2016/01/13 22:54:56
Yeah, this is just a POC to shape initial interfac
|
+ public views::ButtonListener, |
+ public mus::mojom::UserWindowObserver { |
+ public: |
+ explicit ShelfView(mojo::ApplicationImpl* app) : app_(app), binding_(this) { |
+ app->ConnectToService("mojo:desktop_wm", &user_window_controller_); |
+ |
+ mus::mojom::UserWindowObserverPtr observer; |
+ mojo::InterfaceRequest<mus::mojom::UserWindowObserver> request = |
+ mojo::GetProxy(&observer); |
+ user_window_controller_->AddUserWindowObserver(std::move(observer)); |
+ binding_.Bind(std::move(request)); |
+ |
+ SetLayoutManager( |
+ new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); |
+ |
+ views::LabelButton* views_examples = |
sky
2016/01/13 21:17:17
If you click one of these buttons do you end up wi
msw
2016/01/13 22:54:56
Yes, these are just simple examples to launch appl
|
+ new views::LabelButton(this, base::ASCIIToUTF16("Views Examples")); |
+ views_examples->set_tag(SHELF_BUTTON_VIEWS_EXAMPLES); |
+ AddChildView(views_examples); |
+ |
+ views::LabelButton* task_viewer = |
+ new views::LabelButton(this, base::ASCIIToUTF16("Task Viewer")); |
+ task_viewer->set_tag(SHELF_BUTTON_TASK_VIEWER); |
+ AddChildView(task_viewer); |
+ } |
+ ~ShelfView() override {} |
+ |
+ private: |
+ // Overridden from views::View: |
+ void OnPaint(gfx::Canvas* canvas) override { |
+ canvas->FillRect(GetLocalBounds(), SK_ColorYELLOW); |
+ views::View::OnPaint(canvas); |
+ } |
+ gfx::Size GetPreferredSize() const override { return gfx::Size(1, 48); } |
+ |
+ // Overridden from views::WidgetDelegate: |
+ views::View* GetContentsView() override { return this; } |
+ |
+ // Overridden from views::ButtonListener: |
+ void ButtonPressed(views::Button* sender, const ui::Event& event) override { |
+ if (sender->tag() == SHELF_BUTTON_VIEWS_EXAMPLES) |
+ app_->ConnectToApplication("mojo:views_examples"); |
+ else if (sender->tag() == SHELF_BUTTON_TASK_VIEWER) |
+ app_->ConnectToApplication("mojo:task_viewer"); |
+ else |
+ user_window_controller_->FocusUserWindow(sender->tag()); |
+ } |
+ |
+ // Overridden from mus::mojom::UserWindowObserver: |
+ void OnUserWindowAdded(uint32_t window_id) override { |
+ // TODO(msw): Get the actual window title and icon. |
+ views::LabelButton* open_window_button = new views::LabelButton( |
+ this, base::ASCIIToUTF16(base::StringPrintf("Window %d", window_id))); |
+ open_window_button->set_tag(window_id); |
+ open_window_buttons_.push_back(open_window_button); |
+ AddChildView(open_window_button); |
+ Layout(); |
+ SchedulePaint(); |
+ } |
+ void OnUserWindowRemoved(uint32_t window_id) override { |
+ for (size_t i = 0; i < open_window_buttons_.size(); ++i) { |
+ if (static_cast<uint32_t>(open_window_buttons_[i]->tag()) == window_id) { |
+ views::LabelButton* button = open_window_buttons_[i]; |
+ open_window_buttons_.erase(open_window_buttons_.begin() + i); |
+ RemoveChildView(button); |
+ delete button; |
+ return; |
+ } |
+ } |
+ } |
+ |
+ mojo::ApplicationImpl* app_; |
+ std::vector<views::LabelButton*> open_window_buttons_; |
+ mus::mojom::UserWindowControllerPtr user_window_controller_; |
+ mojo::Binding<mus::mojom::UserWindowObserver> binding_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ShelfView); |
+}; |
+ |
+ShelfApplication::ShelfApplication() {} |
+ |
+ShelfApplication::~ShelfApplication() {} |
+ |
+void ShelfApplication::Initialize(mojo::ApplicationImpl* 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 ShelfView(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( |
+ mash::wm::mojom::CONTAINER_USER_SHELF); |
+ mus::Window* window = |
+ views::WindowManagerConnection::Get()->NewWindow(properties); |
+ params.native_widget = new views::NativeWidgetMus( |
+ widget, app->shell(), window, mus::mojom::SURFACE_TYPE_DEFAULT); |
+ widget->Init(params); |
+ widget->Show(); |
+} |
+ |
+bool ShelfApplication::ConfigureIncomingConnection( |
+ mojo::ApplicationConnection* connection) { |
+ return true; |
+} |
+ |
+} // namespace shelf |
+} // namespace mash |