chromium/chrome/browser/ui/lacros/window_pin_util_lacros.cc

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/chromeos/window_pin_util.h"

#include "chrome/browser/ui/lacros/window_properties.h"
#include "chromeos/ui/base/window_pin_type.h"
#include "ui/aura/window.h"
#include "ui/platform_window/extensions/pinned_mode_extension.h"
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_lacros.h"

void PinWindow(aura::Window* window, bool trusted) {
  CHECK(window);

  auto* pinned_mode_extension =
      views::DesktopWindowTreeHostLacros::From(window->GetHost())
          ->GetPinnedModeExtension();

  // kWindowPinTypeKey should be updated when Ash side acknowledges the state
  // change, but this requires pinned state to be supported on configure event.
  // If it's not yet supported, set it synchronously here.
  if (!pinned_mode_extension->SupportsConfigurePinnedState()) {
    window->SetProperty(lacros::kWindowPinTypeKey,
                        trusted ? chromeos::WindowPinType::kTrustedPinned
                                : chromeos::WindowPinType::kPinned);
  }

  pinned_mode_extension->Pin(trusted);
}

void UnpinWindow(aura::Window* window) {
  CHECK(window);

  auto* pinned_mode_extension =
      views::DesktopWindowTreeHostLacros::From(window->GetHost())
          ->GetPinnedModeExtension();

  // kWindowPinTypeKey should be updated when Ash side acknowledges the state
  // change, but this requires pinned state to be supported on configure event.
  // If it's not yet supported, set it synchronously here.
  if (!pinned_mode_extension->SupportsConfigurePinnedState()) {
    window->SetProperty(lacros::kWindowPinTypeKey,
                        chromeos::WindowPinType::kNone);
  }

  pinned_mode_extension->Unpin();
}

chromeos::WindowPinType GetWindowPinType(const aura::Window* window) {
  CHECK(window);
  return window->GetProperty(lacros::kWindowPinTypeKey);
}

bool IsWindowPinned(const aura::Window* window) {
  CHECK(window);
  return GetWindowPinType(window) != chromeos::WindowPinType::kNone;
}