// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_BASE_COCOA_BUBBLE_CLOSER_H_ #define UI_BASE_COCOA_BUBBLE_CLOSER_H_ #include #include "base/callback.h" #include "base/component_export.h" #include "base/macros.h" #include "ui/base/cocoa/weak_ptr_nsobject.h" #include "ui/gfx/native_widget_types.h" namespace ui { // Monitors mouse events to allow a regular window to have menu-like popup // behavior when clicking outside the window. This is needed because macOS // suppresses window activation events when clicking rapidly. class COMPONENT_EXPORT(UI_BASE) BubbleCloser { public: // Installs an event monitor watching for mouse clicks outside of |window| or // any of its child windows. Invokes |on_click_outside| on each event. BubbleCloser(NSWindow* window, base::RepeatingClosure on_click_outside); ~BubbleCloser(); private: void OnClickOutside(); id event_tap_; // Weak. Owned by AppKit. base::RepeatingClosure on_click_outside_; WeakPtrNSObjectFactory factory_; DISALLOW_COPY_AND_ASSIGN(BubbleCloser); }; } // namespace ui #endif // UI_BASE_COCOA_BUBBLE_CLOSER_H_