vcl/inc/osx/salnsmenu.h | 8 ++------ vcl/osx/salmenu.cxx | 9 +++------ vcl/osx/salnsmenu.mm | 26 +++++++++++--------------- 3 files changed, 16 insertions(+), 27 deletions(-)
New commits: commit 64ca3756416f0355b2008f39120e68ac42269784 Author: Patrick Luby <guibmac...@gmail.com> AuthorDate: Mon Feb 19 15:11:56 2024 -0500 Commit: Patrick Luby <guibomac...@gmail.com> CommitDate: Mon Feb 19 22:07:49 2024 +0100 tdf#126638 dispatch key shortcut events to modal windows While commit 4f907fbe52749265ba4eb7c40ed187b453bb1de9 fixed tdf#126638, it caused the "disallowed action" beep. Some modal windows, such as the native Open and Save dialogs, return NO from -[NSWindow performKeyEquivalent:]. Fortunately, the main menu's -[NSMenu performKeyEquivalent:] is then called so we can catch and redirect any modal window's key shortcut events without triggering the modal window's "disallowed action" beep. Change-Id: Ib1fff68ab159361ceb847881e3a4da4736a33f51 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163605 Tested-by: Jenkins Reviewed-by: Patrick Luby <guibomac...@gmail.com> diff --git a/vcl/inc/osx/salnsmenu.h b/vcl/inc/osx/salnsmenu.h index 64b65e2c95bd..9e0f9acf68ed 100644 --- a/vcl/inc/osx/salnsmenu.h +++ b/vcl/inc/osx/salnsmenu.h @@ -50,14 +50,10 @@ class AquaSalMenuItem; - (BOOL)validateMenuItem:(NSMenuItem*)pMenuItem; @end -@interface SalNSMainMenuDelegate : NSObject +@interface SalNSMainMenu : NSMenu { } -- (id)init; -- (BOOL)menuHasKeyEquivalent:(NSMenu*)pMenu - forEvent:(NSEvent*)pEvent - target:(id*)pTarget - action:(SEL*)pAction; +- (BOOL)performKeyEquivalent:(NSEvent*)pEvent; @end #endif // INCLUDED_VCL_INC_OSX_SALNSMENU_H diff --git a/vcl/osx/salmenu.cxx b/vcl/osx/salmenu.cxx index 7685a1b9e1bc..6ea16a6588ae 100644 --- a/vcl/osx/salmenu.cxx +++ b/vcl/osx/salmenu.cxx @@ -113,7 +113,6 @@ const AquaSalMenu* AquaSalMenu::pCurrentMenuBar = nullptr; // FIXME: currently this is leaked static MainMenuSelector* pMainMenuSelector = nil; -static SalNSMainMenuDelegate* pMainMenuDelegate = nil; static void initAppMenu() { @@ -126,7 +125,9 @@ static void initAppMenu() NSMenu* pAppMenu = nil; NSMenuItem* pNewItem = nil; - NSMenu* pMainMenu = [[[NSMenu alloc] initWithTitle: @"Main Menu"] autorelease]; + // Related: tdf#126638 use NSMenu subclass to catch and redirect key + // shortcuts when a modal window is displayed + SalNSMainMenu* pMainMenu = [[[SalNSMainMenu alloc] initWithTitle: @"Main Menu"] autorelease]; pNewItem = [pMainMenu addItemWithTitle: @"Application" action: nil keyEquivalent: @""]; @@ -135,10 +136,6 @@ static void initAppMenu() [NSApp setMainMenu: pMainMenu]; pMainMenuSelector = [[MainMenuSelector alloc] init]; - pMainMenuDelegate = [[SalNSMainMenuDelegate alloc] init]; - - // tdf#126638 set a special delegate for the main menu - [pMainMenu setDelegate: reinterpret_cast< id<NSMenuDelegate> >(pMainMenuDelegate)]; // about NSString* pString = CreateNSString(VclResId(SV_STDTEXT_ABOUT)); diff --git a/vcl/osx/salnsmenu.mm b/vcl/osx/salnsmenu.mm index 0659e412db1a..31627a35ea87 100644 --- a/vcl/osx/salnsmenu.mm +++ b/vcl/osx/salnsmenu.mm @@ -317,27 +317,23 @@ SAL_WNODEPRECATED_DECLARATIONS_POP } @end -@implementation SalNSMainMenuDelegate +@implementation SalNSMainMenu --(id)init +- (BOOL)performKeyEquivalent:(NSEvent*)pEvent { - return [super init]; -} - --(BOOL)menuHasKeyEquivalent: (NSMenu*)pMenu forEvent: (NSEvent*)pEvent target: (id*)pTarget action: (SEL*)pAction -{ - assert( pMenu == [NSApp mainMenu] ); + BOOL bRet = [super performKeyEquivalent: pEvent]; // tdf#126638 dispatch key shortcut events to modal windows // Some modal windows, such as the native Open and Save dialogs, - // ignore any key shortcut events so use the same existing special - // dispatching code that -[VCL_NSApplication sendEvent:] uses to - // dispatch key shortcuts to non-modal, non-LibreOffice windows. - if( [NSApp modalWindow] ) - [SalNSMenu dispatchSpecialKeyEquivalents: pEvent]; + // return NO from -[NSWindow performKeyEquivalent:]. Fortunately, + // the main menu's -[NSMenu performKeyEquivalent:] is then called + // so we can catch and redirect any modal window's key shortcut + // events without triggering the modal window's "disallowed + // action" beep. + if( !bRet && [NSApp modalWindow] ) + bRet = [SalNSMenu dispatchSpecialKeyEquivalents: pEvent]; - // Always return NO since the target and action are not set - return NO; + return bRet; } @end