Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1623)

Unified Diff: components/exo/shell_surface.cc

Issue 2883193002: WIP
Patch Set: git cl try Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/exo/shell_surface.h ('k') | components/exo/wayland/server.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/exo/shell_surface.cc
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc
index e4fff6f17a71d2ddb9ce98a97105c2dec3b6f52f..15a7d608f90cb683cce7a8466ee1fe1e507b122b 100644
--- a/components/exo/shell_surface.cc
+++ b/components/exo/shell_surface.cc
@@ -60,6 +60,10 @@ const struct Accelerator {
{ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN},
{ui::VKEY_F4, ui::EF_ALT_DOWN}};
+constexpr uint32_t kFirstIconChunkFlag = 0x1;
+constexpr uint32_t kLastIconChunkFlag = 0x2;
+constexpr size_t kMaxIconSize = 32 * 1024;
+
class CustomFrameView : public views::NonClientFrameView {
public:
explicit CustomFrameView(views::Widget* widget) : widget_(widget) {}
@@ -312,6 +316,7 @@ ShellSurface::ScopedAnimationsDisabled::~ScopedAnimationsDisabled() {
// ShellSurface, public:
DEFINE_LOCAL_UI_CLASS_PROPERTY_KEY(Surface*, kMainSurfaceKey, nullptr)
+DEFINE_LOCAL_UI_CLASS_PROPERTY_KEY(std::string*, kUnsafeIconPngDataKey, nullptr)
ShellSurface::ShellSurface(Surface* surface,
ShellSurface* parent,
@@ -521,6 +526,41 @@ void ShellSurface::SetTitle(const base::string16& title) {
widget_->UpdateWindowTitle();
}
+void ShellSurface::SetIconChunk(uint32_t flags,
+ const std::string& unsafe_icon_png) {
+ TRACE_EVENT0("exo", "ShellSurface::SetIconChunk");
+
+ if (flags & kFirstIconChunkFlag) {
+ unsafe_icon_png_builder_.clear();
+ } else if (unsafe_icon_png_builder_.empty()) {
+ LOG(ERROR) << "Received shelf icon chunk withot first chunk.";
+ return;
+ }
+
+ if (unsafe_icon_png.size() + unsafe_icon_png_builder_.size() > kMaxIconSize) {
+ unsafe_icon_png_builder_.clear();
+ LOG(WARNING) << "Surface icon is too big "
+ << (unsafe_icon_png.size() + unsafe_icon_png_builder_.size())
+ << ".";
+ return;
+ }
+
+ unsafe_icon_png_builder_ += unsafe_icon_png;
+ if (flags & kLastIconChunkFlag) {
+ unsafe_icon_png_ = unsafe_icon_png_builder_;
+ unsafe_icon_png_builder_.clear();
+ if (widget_ && widget_->GetNativeWindow())
+ SetUnsafeIconPngData(widget_->GetNativeWindow(), &unsafe_icon_png_);
+ }
+}
+
+void ShellSurface::ResetIcon() {
+ unsafe_icon_png_.clear();
+ unsafe_icon_png_builder_.clear();
+ if (widget_ && widget_->GetNativeWindow())
+ SetUnsafeIconPngData(widget_->GetNativeWindow(), nullptr);
+}
+
void ShellSurface::SetSystemModal(bool system_modal) {
// System modal container is used by clients to implement client side
// managed system modal dialogs using a single ShellSurface instance.
@@ -708,6 +748,23 @@ Surface* ShellSurface::GetMainSurface(const aura::Window* window) {
return window->GetProperty(kMainSurfaceKey);
}
+// static
+bool ShellSurface::IsUnsafeIconPngDataKey(const void* key) {
+ return key == kUnsafeIconPngDataKey;
+}
+
+// static
+const std::string* ShellSurface::GetUnsafeIconPngData(
+ const aura::Window* window) {
+ return window->GetProperty(kUnsafeIconPngDataKey);
+}
+
+// static
+void ShellSurface::SetUnsafeIconPngData(aura::Window* window,
+ std::string* unsage_icon_png_data) {
+ return window->SetProperty(kUnsafeIconPngDataKey, unsage_icon_png_data);
+}
+
std::unique_ptr<base::trace_event::TracedValue> ShellSurface::AsTracedValue()
const {
std::unique_ptr<base::trace_event::TracedValue> value(
@@ -1200,6 +1257,8 @@ void ShellSurface::CreateShellSurfaceWidget(ui::WindowShowState show_state) {
window->AddChild(surface_->window());
window->SetEventTargeter(base::WrapUnique(new CustomWindowTargeter(widget_)));
SetApplicationId(window, application_id_);
+ if (!unsafe_icon_png_.empty())
+ SetUnsafeIconPngData(window, &unsafe_icon_png_);
SetMainSurface(window, surface_);
// Start tracking changes to window bounds and window state.
« no previous file with comments | « components/exo/shell_surface.h ('k') | components/exo/wayland/server.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698