summaryrefslogtreecommitdiffstats
path: root/vcl/osx/salnsmenu.mm
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/osx/salnsmenu.mm')
-rw-r--r--vcl/osx/salnsmenu.mm80
1 files changed, 80 insertions, 0 deletions
diff --git a/vcl/osx/salnsmenu.mm b/vcl/osx/salnsmenu.mm
index b2df2da7e5..31627a35ea 100644
--- a/vcl/osx/salnsmenu.mm
+++ b/vcl/osx/salnsmenu.mm
@@ -30,6 +30,53 @@
#include <osx/salnsmenu.h>
@implementation SalNSMenu
+
++(BOOL)dispatchSpecialKeyEquivalents: (NSEvent*)pEvent
+{
+ if( pEvent && [pEvent type] == NSEventTypeKeyDown )
+ {
+ unsigned int nModMask = ([pEvent modifierFlags] & (NSEventModifierFlagShift|NSEventModifierFlagControl|NSEventModifierFlagOption|NSEventModifierFlagCommand));
+ if( nModMask == NSEventModifierFlagCommand )
+ {
+ if( [[pEvent charactersIgnoringModifiers] isEqualToString: @"v"] )
+ {
+ if( [NSApp sendAction: @selector(paste:) to: nil from: nil] )
+ return YES;
+ }
+ else if( [[pEvent charactersIgnoringModifiers] isEqualToString: @"c"] )
+ {
+ if( [NSApp sendAction: @selector(copy:) to: nil from: nil] )
+ return YES;
+ }
+ else if( [[pEvent charactersIgnoringModifiers] isEqualToString: @"x"] )
+ {
+ if( [NSApp sendAction: @selector(cut:) to: nil from: nil] )
+ return YES;
+ }
+ else if( [[pEvent charactersIgnoringModifiers] isEqualToString: @"a"] )
+ {
+ if( [NSApp sendAction: @selector(selectAll:) to: nil from: nil] )
+ return YES;
+ }
+ else if( [[pEvent charactersIgnoringModifiers] isEqualToString: @"z"] )
+ {
+ if( [NSApp sendAction: @selector(undo:) to: nil from: nil] )
+ return YES;
+ }
+ }
+ else if( nModMask == (NSEventModifierFlagCommand|NSEventModifierFlagShift) )
+ {
+ if( [[pEvent charactersIgnoringModifiers] isEqualToString: @"Z"] )
+ {
+ if( [NSApp sendAction: @selector(redo:) to: nil from: nil] )
+ return YES;
+ }
+ }
+ }
+
+ return NO;
+}
+
-(id)initWithMenu: (AquaSalMenu*)pMenu
{
mpMenu = pMenu;
@@ -167,6 +214,19 @@
OSL_FAIL( "menubar item without frame !" );
}
}
+
+-(BOOL)validateMenuItem: (NSMenuItem *)pMenuItem
+{
+ // Related: tdf#126638 disable all menu items when displaying modal windows
+ // For some unknown reason, key shortcuts are dispatched to the LibreOffice
+ // menu items instead of the modal window so disable all LibreOffice menu
+ // items while a native modal dialog such as the native Open, Save, or
+ // Print dialog is displayed.
+ if (!pMenuItem || [NSApp modalWindow])
+ return NO;
+
+ return [pMenuItem isEnabled];
+}
@end
@implementation OOStatusItemView
@@ -257,5 +317,25 @@ SAL_WNODEPRECATED_DECLARATIONS_POP
}
@end
+@implementation SalNSMainMenu
+
+- (BOOL)performKeyEquivalent:(NSEvent*)pEvent
+{
+ 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,
+ // 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];
+
+ return bRet;
+}
+
+@end
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */