blob: 1b5d97c3f6b49dbd4daa6dff81e44b1e3d56e283 [file] [log] [blame]
// 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 "ui/views/controls/menu/menu_runner_impl_mac.h"
#include "components/remote_cocoa/browser/window.h"
#include "ui/views/controls/menu/menu_runner_impl_adapter.h"
#include "ui/views/controls/menu/menu_runner_impl_cocoa.h"
#include "ui/views/controls/menu/menu_runner_impl_remote_cocoa.h"
#include "ui/views/widget/widget.h"
namespace views::internal {
// static
MenuRunnerImplInterface* MenuRunnerImplInterface::Create(
ui::MenuModel* menu_model,
int32_t run_types,
base::RepeatingClosure on_menu_closed_callback) {
if ((run_types & MenuRunner::CONTEXT_MENU) &&
!(run_types & (MenuRunner::IS_NESTED))) {
return new MenuRunnerImplMac(menu_model,
std::move(on_menu_closed_callback));
}
return new MenuRunnerImplAdapter(menu_model,
std::move(on_menu_closed_callback));
}
MenuRunnerImplMac::MenuRunnerImplMac(
ui::MenuModel* menu_model,
base::RepeatingClosure on_menu_closed_callback)
: menu_model_(menu_model),
on_menu_closed_callback_(std::move(on_menu_closed_callback)) {}
bool MenuRunnerImplMac::IsRunning() const {
return implementation_ ? implementation_->IsRunning() : false;
}
void MenuRunnerImplMac::Release() {
delete this;
}
void MenuRunnerImplMac::RunMenuAt(
Widget* parent,
MenuButtonController* button_controller,
const gfx::Rect& bounds,
MenuAnchorPosition anchor,
ui::mojom::MenuSourceType source_type,
int32_t run_types,
gfx::NativeView native_view_for_gestures,
std::optional<gfx::RoundedCornersF> corners,
std::optional<std::string> show_menu_host_duration_histogram) {
if (!implementation_) {
if (remote_cocoa::IsWindowRemote(parent->GetNativeWindow())) {
implementation_ =
new MenuRunnerImplRemoteCocoa(menu_model_, on_menu_closed_callback_);
} else {
implementation_ =
new MenuRunnerImplCocoa(menu_model_, on_menu_closed_callback_);
}
}
implementation_->RunMenuAt(parent, button_controller, bounds, anchor,
source_type, run_types, native_view_for_gestures,
corners, show_menu_host_duration_histogram);
}
void MenuRunnerImplMac::Cancel() {
if (implementation_) {
implementation_->Cancel();
}
}
base::TimeTicks MenuRunnerImplMac::GetClosingEventTime() const {
return implementation_ ? implementation_->GetClosingEventTime()
: base::TimeTicks();
}
MenuRunnerImplMac::~MenuRunnerImplMac() {
if (implementation_) {
implementation_.ExtractAsDangling()->Release();
}
}
} // namespace views::internal