Index: mash/shelf/shelf_model.cc |
diff --git a/ash/shelf/shelf_model.cc b/mash/shelf/shelf_model.cc |
similarity index 74% |
copy from ash/shelf/shelf_model.cc |
copy to mash/shelf/shelf_model.cc |
index e04af42d1f712a8b4b761f6b6e4749a3fe48d640..e81c8a4d26dbaa733a60b5cdd9daf7dc1f73651f 100644 |
--- a/ash/shelf/shelf_model.cc |
+++ b/mash/shelf/shelf_model.cc |
@@ -2,14 +2,16 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "ash/shelf/shelf_model.h" |
+#include "mash/shelf/shelf_model.h" |
#include <algorithm> |
-#include "ash/ash_switches.h" |
-#include "ash/shelf/shelf_model_observer.h" |
+#include "mash/shelf/shelf_model_observer.h" |
+#include "mojo/common/common_type_converters.h" |
+#include "mojo/shell/public/cpp/application_impl.h" |
-namespace ash { |
+namespace mash { |
+namespace shelf { |
namespace { |
@@ -24,6 +26,7 @@ int ShelfItemTypeToWeight(ShelfItemType type) { |
return 1; |
case TYPE_WINDOWED_APP: |
case TYPE_PLATFORM_APP: |
+ case TYPE_MOJO_APP: |
return 2; |
case TYPE_DIALOG: |
return 3; |
@@ -44,14 +47,18 @@ bool CompareByWeight(const ShelfItem& a, const ShelfItem& b) { |
} // namespace |
-ShelfModel::ShelfModel() : next_id_(1), status_(STATUS_NORMAL) { |
+ShelfModel::ShelfModel(mojo::ApplicationImpl* app) |
+ : next_id_(1), status_(STATUS_NORMAL), binding_(this) { |
+ app->ConnectToService("mojo:desktop_wm", &user_window_controller_); |
+ user_window_controller_->AddUserWindowObserver( |
+ binding_.CreateInterfacePtrAndBind()); |
} |
ShelfModel::~ShelfModel() { |
} |
int ShelfModel::Add(const ShelfItem& item) { |
- return AddAt(items_.size(), item); |
+ return AddAt(static_cast<int>(items_.size()), item); |
} |
int ShelfModel::AddAt(int index, const ShelfItem& item) { |
@@ -118,7 +125,7 @@ int ShelfModel::ItemIndexByID(ShelfID id) const { |
int ShelfModel::GetItemIndexForType(ShelfItemType type) { |
for (size_t i = 0; i < items_.size(); ++i) { |
if (items_[i].type == type) |
- return i; |
+ return static_cast<int>(i); |
} |
return -1; |
} |
@@ -182,4 +189,41 @@ int ShelfModel::ValidateInsertionIndex(ShelfItemType type, int index) const { |
return index; |
} |
-} // namespace ash |
+void ShelfModel::OnUserWindowObserverAdded( |
+ mojo::Array<mash::wm::mojom::UserWindowPtr> user_windows) { |
+ for (size_t i = 0; i < user_windows.size(); ++i) |
+ OnUserWindowAdded(std::move(user_windows[i])); |
+} |
+ |
+void ShelfModel::OnUserWindowAdded(mash::wm::mojom::UserWindowPtr user_window) { |
+ ShelfItem item; |
+ item.type = TYPE_MOJO_APP; |
+ item.status = STATUS_RUNNING; |
+ item.window_id = user_window->window_id; |
+ item.title = user_window->window_title.To<base::string16>(); |
+ Add(item); |
+} |
+ |
+void ShelfModel::OnUserWindowRemoved(uint32_t window_id) { |
+ RemoveItemAt(ItemIndexByWindowID(window_id)); |
+} |
+ |
+void ShelfModel::OnUserWindowTitleChanged(uint32_t window_id, |
+ const mojo::String& window_title) { |
+ const int index = ItemIndexByWindowID(window_id); |
+ ShelfItem old_item(items_[index]); |
+ items_[index].title = window_title.To<base::string16>(); |
+ FOR_EACH_OBSERVER(ShelfModelObserver, observers_, |
+ ShelfItemChanged(index, old_item)); |
+} |
+ |
+int ShelfModel::ItemIndexByWindowID(uint32_t window_id) const { |
+ for (size_t i = 0; i < items_.size(); ++i) { |
+ if (items_[i].window_id == window_id) |
+ return static_cast<int>(i); |
+ } |
+ return -1; |
+} |
+ |
+} // namespace shelf |
+} // namespace mash |