Files
sousa-gecko/widget/cocoa/NativeMenuMac.h
T
Sam Johnson a7cded0e75 Bug 2037198 - Adjust size of selection checkmark image in macOS native anchored popup menus. r=emilio,mac-reviewers,bradwerth,layout-reviewers
The checkmark image size for native menus is derived from the font size of the `NSPopUpButtonCell`. To keep the size of the image more consistent with the text size of the menu items, this patch sets the font size of the cell using the `menupopup`'s font size. We use this because it defaults to the actual native size, and because it is the closest approximation to that of the individual items that we have access to. We can't simply use the font size of the anchor element because menus can be anchored to arbitrary rects rather than elements. Content select is one such example of this. For content select, the font-size from the `select` is applied to the `menupopup`, as otherwise the default would be used.

I don't particularly love this, because each menu item can have a different font size, but this seems to be the best compromise. AppKit does have API for changing an individual checkmark image (`onStateImage`), but unfortunately this does not affect its height, which makes that not a solution here.

Differential Revision: https://phabricator.services.mozilla.com/D299023
2026-05-08 17:35:22 +00:00

96 lines
3.1 KiB
C++

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef NativeMenuMac_h
#define NativeMenuMac_h
#include "mozilla/widget/NativeMenu.h"
#include "nsMenuItemIconX.h"
#include "nsMenuX.h"
class nsIContent;
class nsMenuGroupOwnerX;
namespace mozilla {
namespace dom {
class Element;
}
namespace widget {
class NativeMenuMac : public NativeMenu,
public nsMenuItemIconX::Listener,
public nsMenuX::Observer {
public:
explicit NativeMenuMac(dom::Element* aElement);
// NativeMenu
void ShowMenuAnchored(nsIFrame* aClickedFrame,
const nsMenuPopupFrame* aPopupFrame) override;
void ShowMenuAtPosition(nsIFrame* aClickedFrame, const CSSIntPoint& aPosition,
bool aIsContextMenu) override;
bool Close() override;
void ActivateItem(dom::Element* aItemElement, Modifiers aModifiers,
int16_t aButton, ErrorResult& aRv) override;
void OpenSubmenu(dom::Element* aMenuElement) override;
void CloseSubmenu(dom::Element* aMenuElement) override;
RefPtr<dom::Element> Element() override;
void AddObserver(NativeMenu::Observer* aObserver) override {
mObservers.AppendElement(aObserver);
}
void RemoveObserver(NativeMenu::Observer* aObserver) override {
mObservers.RemoveElement(aObserver);
}
// nsMenuItemIconX::Listener
void IconUpdated() override;
// nsMenuX::Observer
void OnMenuWillOpen(dom::Element* aPopupElement) override;
void OnMenuDidOpen(dom::Element* aPopupElement) override;
void OnMenuWillActivateItem(dom::Element* aPopupElement,
dom::Element* aMenuItemElement) override;
void OnMenuClosed(dom::Element* aPopupElement) override;
NSMenu* NativeNSMenu() { return mMenu ? mMenu->NativeNSMenu() : nil; }
void MenuWillOpen();
// Returns whether a menu item was found at the specified path.
bool ActivateNativeMenuItemAt(const nsAString& aIndexString);
void ForceUpdateNativeMenuAt(const nsAString& aIndexString);
void Dump();
// If this menu is the menu of a system status bar item (NSStatusItem),
// let the menu know about the status item so that it can propagate
// any icon changes to the status item.
void SetContainerStatusBarItem(NSStatusItem* aItem);
protected:
virtual ~NativeMenuMac();
// Find the deepest nsMenuX which contains aElement, only descending into open
// menus.
// Returns nullptr if the element was not found or if the menus on the path
// were not all open.
RefPtr<nsMenuX> GetOpenMenuContainingElement(dom::Element* aElement);
RefPtr<dom::Element> mElement;
RefPtr<nsMenuGroupOwnerX> mMenuGroupOwner;
RefPtr<nsMenuX> mMenu;
nsTArray<NativeMenu::Observer*> mObservers;
NSStatusItem* mContainerStatusBarItem;
// Non-zero after a call to ShowMenuAnchored or ShowMenuAtPosition. Stores the
// handle from the MOZMenuOpeningCoordinator.
NSInteger mOpeningHandle = 0;
};
} // namespace widget
} // namespace mozilla
#endif