Chromium Code Reviews| Index: mash/wm/user_window_controller_impl.cc |
| diff --git a/mash/wm/user_window_controller_impl.cc b/mash/wm/user_window_controller_impl.cc |
| index be2f24e2d43984c9e9be06bcfcc1eca8f585f558..3e81da94970db3888795b422e25ce49f5eeb0f71 100644 |
| --- a/mash/wm/user_window_controller_impl.cc |
| +++ b/mash/wm/user_window_controller_impl.cc |
| @@ -11,6 +11,7 @@ |
| #include "mash/wm/public/interfaces/container.mojom.h" |
| #include "mash/wm/root_window_controller.h" |
| #include "mojo/common/common_type_converters.h" |
| +#include "ui/resources/grit/ui_resources.h" |
| namespace mash { |
| namespace wm { |
| @@ -26,6 +27,17 @@ mojo::String GetWindowTitle(mus::Window* window) { |
| return mojo::String(std::string()); |
| } |
| +// Get the serialized app icon bitmap from a mus::Window. |
| +mojo::Array<uint8_t> GetWindowAppIcon(mus::Window* window) { |
| + if (window->HasSharedProperty( |
| + mus::mojom::WindowManager::kWindowAppIcon_Property)) { |
| + return mojo::Array<uint8_t>::From( |
| + window->GetSharedProperty<const std::vector<uint8_t>>( |
| + mus::mojom::WindowManager::kWindowAppIcon_Property)); |
| + } |
| + return mojo::Array<uint8_t>(); |
| +} |
| + |
| // Returns |window|, or an ancestor thereof, parented to |container|, or null. |
| mus::Window* GetTopLevelWindow(mus::Window* window, mus::Window* container) { |
| while (window && window->parent() != container) |
| @@ -38,6 +50,7 @@ mojom::UserWindowPtr GetUserWindow(mus::Window* window) { |
| mojom::UserWindowPtr user_window(mojom::UserWindow::New()); |
| user_window->window_id = window->id(); |
| user_window->window_title = GetWindowTitle(window); |
| + user_window->window_app_icon = GetWindowAppIcon(window); |
| mus::Window* focused = window->connection()->GetFocusedWindow(); |
| focused = GetTopLevelWindow(focused, window->parent()); |
| user_window->window_has_focus = focused == window; |
| @@ -46,13 +59,14 @@ mojom::UserWindowPtr GetUserWindow(mus::Window* window) { |
| } // namespace |
| -// Observes title changes on user windows. UserWindowControllerImpl uses this |
| -// separate observer to avoid observing duplicate tree change notifications. |
| -class WindowTitleObserver : public mus::WindowObserver { |
| +// Observes property changes on user windows. UserWindowControllerImpl uses |
| +// this separate observer to avoid observing duplicate tree change |
| +// notifications. |
| +class WindowPropertyObserver : public mus::WindowObserver { |
| public: |
| - explicit WindowTitleObserver(UserWindowControllerImpl* controller) |
| + explicit WindowPropertyObserver(UserWindowControllerImpl* controller) |
| : controller_(controller) {} |
| - ~WindowTitleObserver() override {} |
| + ~WindowPropertyObserver() override {} |
| private: |
| // mus::WindowObserver: |
| @@ -61,15 +75,20 @@ class WindowTitleObserver : public mus::WindowObserver { |
| const std::string& name, |
| const std::vector<uint8_t>* old_data, |
| const std::vector<uint8_t>* new_data) override { |
| - if (controller_->user_window_observer() && |
| - name == mus::mojom::WindowManager::kWindowTitle_Property) { |
| + if (!controller_->user_window_observer()) |
| + return; |
| + if (name == mus::mojom::WindowManager::kWindowTitle_Property) { |
| controller_->user_window_observer()->OnUserWindowTitleChanged( |
| window->id(), GetWindowTitle(window)); |
| + } else if (name == mus::mojom::WindowManager::kWindowAppIcon_Property) { |
| + controller_->user_window_observer()->OnUserWindowAppIconChanged( |
| + window->id(), new_data ? mojo::Array<uint8_t>::From(*new_data) |
|
msw
2016/03/24 17:40:54
Too bad we need to do another copy here...
James Cook
2016/03/25 15:39:28
Acknowledged.
|
| + : mojo::Array<uint8_t>()); |
| } |
| } |
| UserWindowControllerImpl* controller_; |
| - DISALLOW_COPY_AND_ASSIGN(WindowTitleObserver); |
| + DISALLOW_COPY_AND_ASSIGN(WindowPropertyObserver); |
| }; |
| UserWindowControllerImpl::UserWindowControllerImpl() |
| @@ -87,7 +106,7 @@ UserWindowControllerImpl::~UserWindowControllerImpl() { |
| user_container->RemoveObserver(this); |
| for (auto iter : user_container->children()) |
| - iter->RemoveObserver(window_title_observer_.get()); |
| + iter->RemoveObserver(window_property_observer_.get()); |
| } |
| void UserWindowControllerImpl::Initialize( |
| @@ -97,9 +116,9 @@ void UserWindowControllerImpl::Initialize( |
| root_controller_ = root_controller; |
| GetUserWindowContainer()->AddObserver(this); |
| GetUserWindowContainer()->connection()->AddObserver(this); |
| - window_title_observer_.reset(new WindowTitleObserver(this)); |
| + window_property_observer_.reset(new WindowPropertyObserver(this)); |
| for (auto iter : GetUserWindowContainer()->children()) |
| - iter->AddObserver(window_title_observer_.get()); |
| + iter->AddObserver(window_property_observer_.get()); |
| } |
| mus::Window* UserWindowControllerImpl::GetUserWindowContainer() const { |
| @@ -110,11 +129,11 @@ mus::Window* UserWindowControllerImpl::GetUserWindowContainer() const { |
| void UserWindowControllerImpl::OnTreeChanging(const TreeChangeParams& params) { |
| DCHECK(root_controller_); |
| if (params.new_parent == GetUserWindowContainer()) { |
| - params.target->AddObserver(window_title_observer_.get()); |
| + params.target->AddObserver(window_property_observer_.get()); |
| if (user_window_observer_) |
| user_window_observer_->OnUserWindowAdded(GetUserWindow(params.target)); |
| } else if (params.old_parent == GetUserWindowContainer()) { |
| - params.target->RemoveObserver(window_title_observer_.get()); |
| + params.target->RemoveObserver(window_property_observer_.get()); |
| if (user_window_observer_) |
| user_window_observer_->OnUserWindowRemoved(params.target->id()); |
| } |