1
0
Fork 0

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.
pull/9780/head
Michael Lutz 2021-12-31 00:29:51 +01:00
parent 4844268d1c
commit 80fc5fb46c
2 changed files with 41 additions and 36 deletions

View File

@ -14,6 +14,10 @@
#include "toolbar_gui.h" #include "toolbar_gui.h"
#include "table/sprites.h" #include "table/sprites.h"
#ifdef MAC_OS_X_VERSION_10_12_2
# define HAVE_TOUCHBAR_SUPPORT
#endif
class VideoDriver_Cocoa; class VideoDriver_Cocoa;
/* Right Mouse Button Emulation enum */ /* Right Mouse Button Emulation enum */
@ -30,7 +34,7 @@ extern NSString *OTTDMainLaunchGameEngine;
+ (NSCursor *) clearCocoaCursor; + (NSCursor *) clearCocoaCursor;
@end @end
#ifdef HAVE_OSX_1015_SDK #ifdef HAVE_TOUCHBAR_SUPPORT
/* 9 items can be displayed on the touch bar when using default buttons. */ /* 9 items can be displayed on the touch bar when using default buttons. */
static NSArray *touchBarButtonIdentifiers = @[ static NSArray *touchBarButtonIdentifiers = @[
@"openttd.pause", @"openttd.pause",
@ -83,12 +87,11 @@ static NSDictionary *touchBarFallbackText = @{
#endif #endif
/** Subclass of NSWindow to cater our special needs */ /** Subclass of NSWindow to cater our special needs */
#ifdef HAVE_OSX_1015_SDK
@interface OTTD_CocoaWindow : NSWindow <NSTouchBarDelegate>
@property (strong) NSSet *touchbarItems;
- (NSImage*)generateImage:(int)spriteId;
#else
@interface OTTD_CocoaWindow : NSWindow @interface OTTD_CocoaWindow : NSWindow
#ifdef HAVE_TOUCHBAR_SUPPORT
<NSTouchBarDelegate>
- (NSImage *)generateImage:(int)spriteId;
#endif #endif
- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag driver:(VideoDriver_Cocoa *)drv; - (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag driver:(VideoDriver_Cocoa *)drv;

View File

@ -405,18 +405,25 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
return self; 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 - (void)touchBarButtonAction:(id)sender
{ {
if (@available(macOS 10.15, *)) { NSButton *btn = (NSButton *)sender;
NSButtonTouchBarItem *btn = (NSButtonTouchBarItem *)sender;
NSNumber *hotkeyIndex = [ touchBarButtonActions objectForKey:btn.identifier ]; NSNumber *hotkeyIndex = [ touchBarButtonActions objectForKey:btn.identifier ];
HandleToolbarHotkey(hotkeyIndex.intValue); if (hotkeyIndex != nil) HandleToolbarHotkey(hotkeyIndex.intValue);
}
} }
#pragma mark NSTouchBarProvider
- (nullable NSTouchBar *)makeTouchBar - (nullable NSTouchBar *)makeTouchBar
{ {
NSTouchBar *bar = [ [ NSTouchBar alloc ] init ]; NSTouchBar *bar = [ [ NSTouchBar alloc ] init ];
@ -464,38 +471,33 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
return outImage; return outImage;
} }
#pragma mark NSTouchBarDelegate
- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier - (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]; NSNumber *num = touchBarButtonSprites[identifier];
NSImage *generatedImage = [ self generateImage:num.unsignedIntValue ]; NSImage *image = [ self generateImage:num.unsignedIntValue ];
if (generatedImage != nullptr) {
button.image = generatedImage; NSButton *button;
} else { if (image != nil) {
button.title = NSLocalizedString(touchBarFallbackText[identifier], @""); /* 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 { } else {
return nullptr; button = [ NSButton buttonWithTitle:touchBarFallbackText[identifier] target:self action:@selector(touchBarButtonAction:) ];
} }
button.identifier = identifier;
button.imageScaling = NSImageScaleProportionallyDown;
NSCustomTouchBarItem *tb_item = [ [ NSCustomTouchBarItem alloc] initWithIdentifier:identifier ];
tb_item.view = button;
return tb_item;
} }
#endif #endif
/**
* Define the rectangle we draw our window in
*/
- (void)setFrame:(NSRect)frameRect display:(BOOL)flag
{
[ super setFrame:frameRect display:flag ];
driver->AllocateBackingStore();
}
@end @end
@implementation OTTD_CocoaView { @implementation OTTD_CocoaView {