#ifndef UI_VIEWS_WIDGET_NATIVE_WIDGET_MAC_H_
#define UI_VIEWS_WIDGET_NATIVE_WIDGET_MAC_H_
#include <memory>
#include <string>
#include "base/callback_list.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/mojom/ui_base_types.mojom-shared.h"
#include "ui/base/mojom/window_show_state.mojom-forward.h"
#include "ui/base/window_open_disposition.h"
#include "ui/color/color_provider_key.h"
#include "ui/gfx/native_ui_types.h"
#include "ui/views/widget/native_widget_private.h"
#include "ui/views/widget/widget_observer.h"
#if defined(__OBJC__)
@class NativeWidgetMacNSWindow;
#else
class NativeWidgetMacNSWindow;
#endif
namespace remote_cocoa {
namespace mojom {
class CreateWindowParams;
class NativeWidgetNSWindow;
class ValidateUserInterfaceItemResult;
}
class ApplicationHost;
class NativeWidgetNSWindowBridge;
}
namespace views {
namespace test {
class MockNativeWidgetMac;
class NativeWidgetMacTest;
}
class NativeWidgetMacNSWindowHost;
class Widget;
class VIEWS_EXPORT NativeWidgetMac : public internal::NativeWidgetPrivate,
public FocusChangeListener,
public ui::ImeKeyEventDispatcher,
public WidgetObserver {
public:
explicit NativeWidgetMac(internal::NativeWidgetDelegate* delegate);
NativeWidgetMac(const NativeWidgetMac&) = delete;
NativeWidgetMac& operator=(const NativeWidgetMac&) = delete;
~NativeWidgetMac() override;
void WindowDestroying();
void WindowDestroyed();
void OnWindowKeyStatusChanged(bool is_key, bool is_content_first_responder);
void OnWindowWillStartLiveResize();
void OnWindowDidEndLiveResize();
virtual int32_t SheetOffsetY();
virtual void GetWindowFrameTitlebarHeight(bool* override_titlebar_height,
float* titlebar_height);
virtual void OnWindowFullscreenTransitionStart() {}
virtual void OnWindowFullscreenTransitionComplete() {}
virtual void OnFocusWindowToolbar() {}
virtual void ValidateUserInterfaceItem(
int32_t command,
remote_cocoa::mojom::ValidateUserInterfaceItemResult* result) {}
virtual bool WillExecuteCommand(int32_t command,
WindowOpenDisposition window_open_disposition,
bool is_before_first_responder);
virtual bool ExecuteCommand(int32_t command,
WindowOpenDisposition window_open_disposition,
bool is_before_first_responder);
ui::Compositor* GetCompositor() {
return const_cast<ui::Compositor*>(
const_cast<const NativeWidgetMac*>(this)->GetCompositor());
}
gfx::NativeViewAccessible GetNativeViewAccessibleForNSView() const;
gfx::NativeViewAccessible GetNativeViewAccessibleForNSWindow() const;
void InitNativeWidget(Widget::InitParams params) override;
void OnWidgetInitDone() override;
void ReparentNativeViewImpl(gfx::NativeView new_parent) override;
std::unique_ptr<FrameView> CreateFrameView() override;
bool ShouldUseNativeFrame() const override;
bool ShouldWindowContentsBeTransparent() const override;
void FrameTypeChanged() override;
Widget* GetWidget() override;
const Widget* GetWidget() const override;
gfx::NativeView GetNativeView() const override;
gfx::NativeWindow GetNativeWindow() const override;
Widget* GetTopLevelWidget() override;
const ui::Compositor* GetCompositor() const override;
const ui::Layer* GetLayer() const override;
void ReorderNativeViews() override;
void ViewRemoved(View* view) override;
void SetNativeWindowProperty(const char* name, void* value) override;
void* GetNativeWindowProperty(const char* name) const override;
TooltipManager* GetTooltipManager() const override;
void SetCapture() override;
void ReleaseCapture() override;
bool HasCapture() const override;
ui::InputMethod* GetInputMethod() override;
void CenterWindow(const gfx::Size& size) override;
void GetWindowPlacement(
gfx::Rect* bounds,
ui::mojom::WindowShowState* show_state) const override;
bool SetWindowTitle(const std::u16string& title) override;
void SetWindowIcons(const gfx::ImageSkia& window_icon,
const gfx::ImageSkia& app_icon) override;
void InitModalType(ui::mojom::ModalType modal_type) override;
using WidgetObserver::OnWidgetThemeChanged;
void SetBackgroundColor(SkColor background_color) override;
gfx::Rect GetWindowBoundsInScreen() const override;
gfx::Rect GetClientAreaBoundsInScreen() const override;
gfx::Rect GetRestoredBounds() const override;
std::string GetWorkspace() const override;
void SetBounds(const gfx::Rect& bounds) override;
void SetBoundsConstrained(const gfx::Rect& bounds) override;
void SetSize(const gfx::Size& size) override;
void StackAbove(gfx::NativeView native_view) override;
void StackAtTop() override;
bool IsStackedAbove(gfx::NativeView native_view) override;
void SetShape(std::unique_ptr<Widget::ShapeRects> shape) override;
void Close() override;
void CloseNow() override;
void Show(ui::mojom::WindowShowState show_state,
const gfx::Rect& restore_bounds) override;
void Hide() override;
bool IsVisible() const override;
bool IsVisibleOnScreen() const override;
void Activate() override;
void Deactivate() override;
bool IsActive() const override;
void SetZOrderLevel(ui::ZOrderLevel order) override;
ui::ZOrderLevel GetZOrderLevel() const override;
void SetActivationIndependence(bool independence) override;
void SetVisibleOnAllWorkspaces(bool always_visible) override;
bool IsVisibleOnAllWorkspaces() const override;
void Maximize() override;
void Minimize() override;
bool IsMaximized() const override;
bool IsMinimized() const override;
void Restore() override;
void SetFullscreen(bool fullscreen, int64_t target_display_id) override;
bool IsFullscreen() const override;
void SetCanAppearInExistingFullscreenSpaces(
bool can_appear_in_existing_fullscreen_spaces) override;
void SetOpacity(float opacity) override;
void SetAspectRatio(const gfx::SizeF& aspect_ratio,
const gfx::Size& excluded_margin) override;
void FlashFrame(bool flash_frame) override;
void RunShellDrag(std::unique_ptr<ui::OSExchangeData> data,
const gfx::Point& location,
int operation,
ui::mojom::DragEventSource source) override;
void CancelShellDrag(View* view) override;
void SchedulePaintInRect(const gfx::Rect& rect) override;
void ScheduleLayout() override;
void SetCursor(const ui::Cursor& cursor) override;
void ShowEmojiPanel() override;
bool IsMouseEventsEnabled() const override;
bool IsMouseButtonDown() const override;
void ClearNativeFocus() override;
gfx::Rect GetWorkAreaBoundsInScreen() const override;
Widget::MoveLoopResult RunMoveLoop(
const gfx::Vector2d& drag_offset,
Widget::MoveLoopSource source,
Widget::MoveLoopEscapeBehavior escape_behavior) override;
void EndMoveLoop() override;
void SetVisibilityChangedAnimationsEnabled(bool value) override;
void SetVisibilityAnimationDuration(const base::TimeDelta& duration) override;
void SetVisibilityAnimationTransition(
Widget::VisibilityTransition transition) override;
ui::GestureRecognizer* GetGestureRecognizer() override;
ui::GestureConsumer* GetGestureConsumer() override;
void OnSizeConstraintsChanged() override;
void OnNativeViewHierarchyWillChange() override;
void OnNativeViewHierarchyChanged() override;
bool SetAllowScreenshots(bool allow) override;
bool AreScreenshotsAllowed() override;
bool IsDesktopNativeWidget() const override;
std::string GetName() const override;
base::WeakPtr<internal::NativeWidgetPrivate> GetWeakPtr() override;
static base::CallbackListSubscription RegisterInitNativeWidgetCallback(
const base::RepeatingCallback<void(NativeWidgetMac*)>& callback);
protected:
gfx::Rect ConvertBoundsToScreenIfNeeded(const gfx::Rect& bounds) const;
virtual void PopulateCreateWindowParams(
const Widget::InitParams& widget_params,
remote_cocoa::mojom::CreateWindowParams* params);
virtual NativeWidgetMacNSWindow* CreateNSWindow(
const remote_cocoa::mojom::CreateWindowParams* params);
virtual remote_cocoa::ApplicationHost* GetRemoteCocoaApplicationHost();
virtual void OnWindowInitialized() {}
virtual void OnWindowDestroying(gfx::NativeWindow window) {}
internal::NativeWidgetDelegate* delegate_for_testing() {
return delegate_.get();
}
remote_cocoa::mojom::NativeWidgetNSWindow* GetNSWindowMojo() const;
remote_cocoa::NativeWidgetNSWindowBridge* GetInProcessNSWindowBridge() const;
NativeWidgetMacNSWindowHost* GetNSWindowHost() const {
return ns_window_host_.get();
}
void SetFocusManager(FocusManager* new_focus_manager);
void OnWillChangeFocus(View* focused_before, View* focused_now) override;
void OnDidChangeFocus(View* focused_before, View* focused_now) override;
void OnFocusManagerDestroying(FocusManager* focus_manager) override;
ui::EventDispatchDetails DispatchKeyEventPostIME(ui::KeyEvent* key) override;
void OnWidgetDestroyed(Widget* widget) override;
private:
friend class test::MockNativeWidgetMac;
friend class views::test::NativeWidgetMacTest;
class ZoomFocusMonitor;
const base::WeakPtr<internal::NativeWidgetDelegate> delegate_;
std::unique_ptr<internal::NativeWidgetDelegate> owned_delegate_;
std::unique_ptr<NativeWidgetMacNSWindowHost> ns_window_host_;
Widget::InitParams::Ownership ownership_ =
Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET;
std::string name_;
ui::ZOrderLevel z_order_level_ = ui::ZOrderLevel::kNormal;
Widget::InitParams::Type type_;
raw_ptr<FocusManager> focus_manager_ = nullptr;
std::unique_ptr<ui::InputMethod> input_method_;
std::unique_ptr<ZoomFocusMonitor> zoom_focus_monitor_;
std::unique_ptr<Widget::PaintAsActiveLock> parent_key_lock_;
base::ScopedObservation<Widget, WidgetObserver> widget_observation_{this};
base::WeakPtrFactory<NativeWidgetMac> weak_factory{this};
};
}
#endif