From 80fc5fb46c306b23ef9fb4ffc3cf201133092b9d Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Fri, 31 Dec 2021 00:29:51 +0100 Subject: Change: [OSX] Allow touchbar usage on all supported OS versions. Touchbar support was introduced in 10.12.2. There's no need to limit support to 10.15+, as the convenience class NSButtonTouchBarItem is easily replicated. --- src/video/cocoa/cocoa_wnd.h | 15 ++++++----- src/video/cocoa/cocoa_wnd.mm | 62 +++++++++++++++++++++++--------------------- 2 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/video/cocoa/cocoa_wnd.h b/src/video/cocoa/cocoa_wnd.h index 0b5c51b99..d0c946067 100644 --- a/src/video/cocoa/cocoa_wnd.h +++ b/src/video/cocoa/cocoa_wnd.h @@ -14,6 +14,10 @@ #include "toolbar_gui.h" #include "table/sprites.h" +#ifdef MAC_OS_X_VERSION_10_12_2 +# define HAVE_TOUCHBAR_SUPPORT +#endif + class VideoDriver_Cocoa; /* Right Mouse Button Emulation enum */ @@ -30,7 +34,7 @@ extern NSString *OTTDMainLaunchGameEngine; + (NSCursor *) clearCocoaCursor; @end -#ifdef HAVE_OSX_1015_SDK +#ifdef HAVE_TOUCHBAR_SUPPORT /* 9 items can be displayed on the touch bar when using default buttons. */ static NSArray *touchBarButtonIdentifiers = @[ @"openttd.pause", @@ -83,12 +87,11 @@ static NSDictionary *touchBarFallbackText = @{ #endif /** Subclass of NSWindow to cater our special needs */ -#ifdef HAVE_OSX_1015_SDK -@interface OTTD_CocoaWindow : NSWindow -@property (strong) NSSet *touchbarItems; -- (NSImage*)generateImage:(int)spriteId; -#else @interface OTTD_CocoaWindow : NSWindow +#ifdef HAVE_TOUCHBAR_SUPPORT + + +- (NSImage *)generateImage:(int)spriteId; #endif - (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag driver:(VideoDriver_Cocoa *)drv; diff --git a/src/video/cocoa/cocoa_wnd.mm b/src/video/cocoa/cocoa_wnd.mm index 9ded8c80d..b204fb440 100644 --- a/src/video/cocoa/cocoa_wnd.mm +++ b/src/video/cocoa/cocoa_wnd.mm @@ -405,18 +405,25 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel return self; } -#ifdef HAVE_OSX_1015_SDK +/** + * Define the rectangle we draw our window in + */ +- (void)setFrame:(NSRect)frameRect display:(BOOL)flag +{ + [ super setFrame:frameRect display:flag ]; + + driver->AllocateBackingStore(); +} + +#ifdef HAVE_TOUCHBAR_SUPPORT - (void)touchBarButtonAction:(id)sender { - if (@available(macOS 10.15, *)) { - NSButtonTouchBarItem *btn = (NSButtonTouchBarItem *)sender; - NSNumber *hotkeyIndex = [ touchBarButtonActions objectForKey:btn.identifier ]; - HandleToolbarHotkey(hotkeyIndex.intValue); - } + NSButton *btn = (NSButton *)sender; + NSNumber *hotkeyIndex = [ touchBarButtonActions objectForKey:btn.identifier ]; + if (hotkeyIndex != nil) HandleToolbarHotkey(hotkeyIndex.intValue); } -#pragma mark NSTouchBarProvider - (nullable NSTouchBar *)makeTouchBar { NSTouchBar *bar = [ [ NSTouchBar alloc ] init ]; @@ -464,37 +471,32 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel return outImage; } -#pragma mark NSTouchBarDelegate - (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier { - if (@available(macOS 10.15, *)) { - NSButtonTouchBarItem *button = [ [ NSButtonTouchBarItem alloc ] initWithIdentifier:identifier ]; - button.target = self; - button.action = @selector(touchBarButtonAction:); + NSNumber *num = touchBarButtonSprites[identifier]; + NSImage *image = [ self generateImage:num.unsignedIntValue ]; - NSNumber *num = touchBarButtonSprites[identifier]; - NSImage *generatedImage = [ self generateImage:num.unsignedIntValue ]; - if (generatedImage != nullptr) { - button.image = generatedImage; - } else { - button.title = NSLocalizedString(touchBarFallbackText[identifier], @""); + NSButton *button; + if (image != nil) { + /* Human Interface Guidelines: Maximum touch bar glyph size 22 pt. */ + CGFloat max_dim = std::max(image.size.width, image.size.height); + if (max_dim > 0.0) { + CGFloat scale = 22.0 / max_dim; + image.size = NSMakeSize(image.size.width * scale, image.size.height * scale); } - return button; + + button = [ NSButton buttonWithImage:image target:self action:@selector(touchBarButtonAction:) ]; } else { - return nullptr; + button = [ NSButton buttonWithTitle:touchBarFallbackText[identifier] target:self action:@selector(touchBarButtonAction:) ]; } -} -#endif - -/** - * Define the rectangle we draw our window in - */ -- (void)setFrame:(NSRect)frameRect display:(BOOL)flag -{ - [ super setFrame:frameRect display:flag ]; + button.identifier = identifier; + button.imageScaling = NSImageScaleProportionallyDown; - driver->AllocateBackingStore(); + NSCustomTouchBarItem *tb_item = [ [ NSCustomTouchBarItem alloc] initWithIdentifier:identifier ]; + tb_item.view = button; + return tb_item; } +#endif @end -- cgit v1.2.3-70-g09d2