1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
// 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
|