Index: ash/mus/shelf_delegate_mus.cc |
diff --git a/ash/mus/shelf_delegate_mus.cc b/ash/mus/shelf_delegate_mus.cc |
index ce3698a4dfe298ef7214dd3e87cb3ea4b94d9961..7947a133a48a14a8f9e155d1ebad2557a8e134d9 100644 |
--- a/ash/mus/shelf_delegate_mus.cc |
+++ b/ash/mus/shelf_delegate_mus.cc |
@@ -19,6 +19,7 @@ |
#include "mojo/shell/public/cpp/connector.h" |
#include "ui/aura/mus/mus_util.h" |
#include "ui/base/resource/resource_bundle.h" |
+#include "ui/gfx/image/image_skia.h" |
#include "ui/resources/grit/ui_resources.h" |
#include "ui/views/mus/window_manager_connection.h" |
@@ -81,6 +82,25 @@ class ShelfItemDelegateMus : public ShelfItemDelegate { |
DISALLOW_COPY_AND_ASSIGN(ShelfItemDelegateMus); |
}; |
+// Returns an icon image from a serialized SkBitmap, or the default shelf icon |
+// image if the bitmap is empty. Assumes the bitmap is a 1x icon. |
+// TODO(jamescook): Support other scale factors. |
+gfx::ImageSkia GetShelfIconFromBitmap( |
+ const mojo::Array<uint8_t>& serialized_bitmap) { |
+ // Convert the data to an ImageSkia. |
+ SkBitmap bitmap = mojo::ConvertTo<SkBitmap, const std::vector<uint8_t>>( |
+ serialized_bitmap.storage()); |
+ gfx::ImageSkia icon_image; |
+ if (!bitmap.isNull()) { |
+ icon_image = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); |
+ } else { |
+ // Use default icon. |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ icon_image = *rb.GetImageSkiaNamed(IDR_DEFAULT_FAVICON); |
+ } |
+ return icon_image; |
+} |
+ |
} // namespace |
ShelfDelegateMus::ShelfDelegateMus(ShelfModel* model) |
@@ -153,9 +173,7 @@ void ShelfDelegateMus::OnUserWindowAdded( |
ShelfItem item; |
item.type = TYPE_PLATFORM_APP; |
item.status = user_window->window_has_focus ? STATUS_ACTIVE : STATUS_RUNNING; |
- // TODO(msw): Support actual window icons. |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- item.image = *rb.GetImageSkiaNamed(IDR_DEFAULT_FAVICON); |
+ item.image = GetShelfIconFromBitmap(user_window->window_app_icon); |
ShelfID shelf_id = model_->next_id(); |
window_id_to_shelf_id_.insert( |
@@ -198,6 +216,23 @@ void ShelfDelegateMus::OnUserWindowTitleChanged( |
model_->Set(index, *iter); |
} |
+void ShelfDelegateMus::OnUserWindowAppIconChanged( |
+ uint32_t window_id, |
+ mojo::Array<uint8_t> app_icon) { |
+ // Find the shelf ID for this window. |
+ DCHECK(window_id_to_shelf_id_.count(window_id)); |
+ ShelfID shelf_id = window_id_to_shelf_id_[window_id]; |
+ DCHECK_GT(shelf_id, 0); |
+ |
+ // Update the icon in the ShelfItem. |
+ int index = model_->ItemIndexByID(shelf_id); |
+ if (index == -1) |
msw
2016/03/24 17:40:54
optional nit: DCHECK and use use ItemByID instead
James Cook
2016/03/25 15:39:28
Done.
|
+ return; |
+ ShelfItem item = model_->items()[index]; |
+ item.image = GetShelfIconFromBitmap(app_icon); |
+ model_->Set(index, item); |
+} |
+ |
void ShelfDelegateMus::OnUserWindowFocusChanged(uint32_t window_id, |
bool has_focus) { |
DCHECK(window_id_to_shelf_id_.count(window_id)); |