From f03fedfaecd7cfacfd80b30e8058cf1d81a360de Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 17 Mar 2023 08:41:56 +0000 Subject: Revert "QCocoaMenuBar: avoid duplication of 'special' entries in the 'Edit' menu" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 6c2387571a6ccace9edb600ce6798f75affd961d. Caused a regression when the edit menu did not have any entries from the system. Fixing that regression (out of bound index, crash), revealed that the original patch is simply not working anymore - items are still duplicated anyway. Fixes: QTBUG-111798 Pick-to: 6.5 Change-Id: Id4a88f30e2cf300bc63181c4bc7aa113a8b13ac6 Reviewed-by: Tor Arne Vestbø --- src/plugins/platforms/cocoa/qcocoamenubar.mm | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) (limited to 'src/plugins/platforms/cocoa/qcocoamenubar.mm') diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm index f46e5b3ed6..9fa0d7b27a 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.mm +++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm @@ -166,6 +166,18 @@ void QCocoaMenuBar::syncMenu_helper(QPlatformMenu *menu, bool menubarUpdate) for (QCocoaMenuItem *item : cocoaMenu->items()) cocoaMenu->syncMenuItem_helper(item, menubarUpdate); + const QString captionNoAmpersand = QString::fromNSString(cocoaMenu->nsMenu().title) + .remove(u'&'); + if (captionNoAmpersand == QCoreApplication::translate("QCocoaMenu", "Edit")) { + // prevent recursion from QCocoaMenu::insertMenuItem - when the menu is visible + // it calls syncMenu again. QCocoaMenu::setVisible just sets the bool, which then + // gets evaluated in the code after this block. + const bool wasVisible = cocoaMenu->isVisible(); + cocoaMenu->setVisible(false); + insertDefaultEditItems(cocoaMenu); + cocoaMenu->setVisible(wasVisible); + } + BOOL shouldHide = YES; if (cocoaMenu->isVisible()) { // If the NSMenu has no visible items, or only separators, we should hide it @@ -302,22 +314,6 @@ void QCocoaMenuBar::updateMenuBarImmediately() [NSApp setMainMenu:mb->nsMenu()]; insertWindowMenu(); [loader qtTranslateApplicationMenu]; - - for (auto menu : std::as_const(mb->m_menus)) { - if (!menu) - continue; - - const QString captionNoAmpersand = QString::fromNSString(menu->nsMenu().title).remove(u'&'); - if (captionNoAmpersand != QCoreApplication::translate("QCocoaMenu", "Edit")) - continue; - - NSMenuItem *item = mb->nativeItemForMenu(menu); - auto *nsMenu = item.submenu; - if ([nsMenu indexOfItemWithTarget:NSApp andAction:@selector(startDictation:)] == -1) { - // AppKit was not able to recognize the special role of this menu item. - mb->insertDefaultEditItems(menu); - } - } } void QCocoaMenuBar::insertWindowMenu() -- cgit v1.2.3