Changeset - r26145:f785a693652c
[Not reviewed]
master
0 5 0
Michael Lutz - 2 years ago 2021-12-31 00:04:35
michi@icosahedron.de
Fix #9743: [OSX] Only (re-)create touchbar sprites when requested by the main loop.
5 files changed with 63 insertions and 18 deletions:
0 comments (0 inline, 0 general)
src/video/cocoa/cocoa_ogl.mm
Show inline comments
 
@@ -234,11 +234,15 @@ void VideoDriver_CocoaOpenGL::Stop()
 

	
 
void VideoDriver_CocoaOpenGL::PopulateSystemSprites()
 
{
 
	VideoDriver_Cocoa::PopulateSystemSprites();
 

	
 
	OpenGLBackend::Get()->PopulateCursorCache();
 
}
 

	
 
void VideoDriver_CocoaOpenGL::ClearSystemSprites()
 
{
 
	VideoDriver_Cocoa::ClearSystemSprites();
 

	
 
	CGLSetCurrentContext(this->gl_context);
 
	OpenGLBackend::Get()->ClearCursorCache();
 
}
src/video/cocoa/cocoa_v.h
Show inline comments
 
@@ -22,7 +22,8 @@ extern bool _cocoa_video_started;
 

	
 
class VideoDriver_Cocoa : public VideoDriver {
 
private:
 
	Dimension orig_res;   ///< Saved window size for non-fullscreen mode.
 
	Dimension orig_res;       ///< Saved window size for non-fullscreen mode.
 
	bool refresh_sys_sprites; ///< System sprites need refreshing.
 

	
 
public:
 
	bool setup; ///< Window is currently being created.
 
@@ -45,6 +46,9 @@ public:
 
	bool ChangeResolution(int w, int h) override;
 
	bool ToggleFullscreen(bool fullscreen) override;
 

	
 
	void ClearSystemSprites() override;
 
	void PopulateSystemSprites() override;
 

	
 
	void EditBoxLostFocus() override;
 

	
 
	std::vector<int> GetListOfMonitorRefreshRates() override;
src/video/cocoa/cocoa_v.mm
Show inline comments
 
@@ -99,6 +99,8 @@ VideoDriver_Cocoa::VideoDriver_Cocoa()
 
	this->setup         = false;
 
	this->buffer_locked = false;
 

	
 
	this->refresh_sys_sprites = true;
 

	
 
	this->window    = nil;
 
	this->cocoaview = nil;
 
	this->delegate  = nil;
 
@@ -221,6 +223,19 @@ bool VideoDriver_Cocoa::ToggleFullscreen
 
	return false;
 
}
 

	
 
void VideoDriver_Cocoa::ClearSystemSprites()
 
{
 
	this->refresh_sys_sprites = true;
 
}
 

	
 
void VideoDriver_Cocoa::PopulateSystemSprites()
 
{
 
	if (this->refresh_sys_sprites && this->window != nil) {
 
		[ this->window refreshSystemSprites ];
 
		this->refresh_sys_sprites = false;
 
	}
 
}
 

	
 
/**
 
 * Callback invoked after the blitter was changed.
 
 * @return True if no error.
src/video/cocoa/cocoa_wnd.h
Show inline comments
 
@@ -95,6 +95,8 @@ static NSDictionary *touchBarFallbackTex
 
- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag driver:(VideoDriver_Cocoa *)drv;
 

	
 
- (void)setFrame:(NSRect)frameRect display:(BOOL)flag;
 

	
 
- (void)refreshSystemSprites;
 
@end
 

	
 
/** Subclass of NSView to support mouse awareness and text input. */
src/video/cocoa/cocoa_wnd.mm
Show inline comments
 
@@ -414,6 +414,7 @@ void CocoaDialog(const char *title, cons
 

	
 
@implementation OTTD_CocoaWindow {
 
	VideoDriver_Cocoa *driver;
 
	bool touchbar_created;
 
}
 

	
 
/**
 
@@ -423,6 +424,7 @@ void CocoaDialog(const char *title, cons
 
{
 
	if (self = [ super initWithContentRect:contentRect styleMask:styleMask backing:backingType defer:flag ]) {
 
		self->driver = drv;
 
		self->touchbar_created = false;
 

	
 
		[ self setContentMinSize:NSMakeSize(64.0f, 64.0f) ];
 

	
 
@@ -461,27 +463,14 @@ void CocoaDialog(const char *title, cons
 
	bar.delegate = self;
 
	bar.defaultItemIdentifiers = touchBarButtonIdentifiers;
 

	
 
	self->touchbar_created = true;
 

	
 
	return bar;
 
}
 

	
 
- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier
 
{
 
	NSNumber *num = touchBarButtonSprites[identifier];
 
	NSImage *image = NSImageFromSprite(num.unsignedIntValue, _settings_client.gui.zoom_min);
 

	
 
	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);
 
		}
 

	
 
		button = [ NSButton buttonWithImage:image target:self action:@selector(touchBarButtonAction:) ];
 
	} else {
 
		button = [ NSButton buttonWithTitle:touchBarFallbackText[identifier] target:self action:@selector(touchBarButtonAction:) ];
 
	}
 
	NSButton *button = [ NSButton buttonWithTitle:touchBarFallbackText[identifier] target:self action:@selector(touchBarButtonAction:) ];
 
	button.identifier = identifier;
 
	button.imageScaling = NSImageScaleProportionallyDown;
 

	
 
@@ -489,7 +478,38 @@ void CocoaDialog(const char *title, cons
 
	tb_item.view = button;
 
	return tb_item;
 
}
 
#endif
 

	
 
#endif /* HAVE_TOUCHBAR_SUPPORT */
 

	
 
- (void)refreshSystemSprites
 
{
 
#ifdef HAVE_TOUCHBAR_SUPPORT
 
	if (!self->touchbar_created || ![ self respondsToSelector:@selector(touchBar) ] || self.touchBar == nil) return;
 

	
 
	/* Re-create button images from OTTD sprites. */
 
	for (NSTouchBarItemIdentifier ident in self.touchBar.itemIdentifiers) {
 
		NSCustomTouchBarItem *tb_item = [ self.touchBar itemForIdentifier:ident ];
 
		NSButton *button = tb_item.view;
 

	
 
		NSNumber *num = touchBarButtonSprites[ident];
 
		NSImage *image = NSImageFromSprite(num.unsignedIntValue, _settings_client.gui.zoom_min);
 
		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);
 
			}
 

	
 
			button.image = image;
 
			button.imagePosition = NSImageOnly;
 
		} else {
 
			button.image = nil;
 
			button.imagePosition = NSNoImage;
 
		}
 
	}
 
#endif /* HAVE_TOUCHBAR_SUPPORT */
 
}
 

	
 
@end
 

	
0 comments (0 inline, 0 general)