Cache new tab button image to improve performance

This commit is contained in:
Pete Schaffner
2024-02-09 00:06:40 +01:00
parent 7e945a52f1
commit 20ed099940

View File

@ -30,6 +30,7 @@ class TerminalWindow: NSWindow {
private var windowButtonsBackdrop: WindowButtonsBackdropView? = nil private var windowButtonsBackdrop: WindowButtonsBackdropView? = nil
private var windowDragHandle: WindowDragView? = nil private var windowDragHandle: WindowDragView? = nil
private var storedTitlebarBackgroundColor: CGColor? = nil private var storedTitlebarBackgroundColor: CGColor? = nil
private var newTabButtonImage: NSImage? = nil
// The tab bar controller ID from macOS // The tab bar controller ID from macOS
static private let TabBarController = NSUserInterfaceItemIdentifier("_tabBarController") static private let TabBarController = NSUserInterfaceItemIdentifier("_tabBarController")
@ -77,6 +78,10 @@ class TerminalWindow: NSWindow {
// titlebar tabs is used in conjunction with a transparent background. // titlebar tabs is used in conjunction with a transparent background.
self.restoreTitlebarBackground() self.restoreTitlebarBackground()
// Reset the new tab button image so that we are sure to generate a fresh
// one, tinted appropriately for the given theme.
self.newTabButtonImage = nil
// We have to wait before setting the titleVisibility or else it prevents // We have to wait before setting the titleVisibility or else it prevents
// the window from hiding the tab bar when we get down to a single tab. // the window from hiding the tab bar when we get down to a single tab.
DispatchQueue.main.async { DispatchQueue.main.async {
@ -206,26 +211,27 @@ class TerminalWindow: NSWindow {
windowButtonsBackdrop?.isHighlighted = firstTabIsSelected windowButtonsBackdrop?.isHighlighted = firstTabIsSelected
} }
guard let titlebarContainer = contentView?.superview?.subviews.first(where: {
$0.className == "NSTitlebarContainerView"
}) else { return }
// Color the new tab button's image to match the color of the tab title/keyboard shortcut labels, // Color the new tab button's image to match the color of the tab title/keyboard shortcut labels,
// just as it does in the stock tab bar. // just as it does in the stock tab bar.
// //
// One issue I haven't been able to fix is that their tint is made grey when the window isn't key, // One issue I haven't been able to fix is that their tint is made grey when the window isn't key,
// which doesn't look great and is made worse by the fact that the tab label colors don't change. // which doesn't look great and is made worse by the fact that the tab label colors don't change.
guard let titlebarContainer = contentView?.superview?.subviews.first(where: {
$0.className == "NSTitlebarContainerView"
}) else { return }
guard let newTabButton: NSButton = titlebarContainer.firstDescendant(withClassName: "NSTabBarNewTabButton") as? NSButton else { return } guard let newTabButton: NSButton = titlebarContainer.firstDescendant(withClassName: "NSTabBarNewTabButton") as? NSButton else { return }
guard let newTabButtonImageView: NSImageView = newTabButton.subviews.first(where: { guard let newTabButtonImageView: NSImageView = newTabButton.subviews.first(where: {
$0 as? NSImageView != nil $0 as? NSImageView != nil
}) as? NSImageView else { return } }) as? NSImageView else { return }
guard let newTabButtonImage = newTabButtonImageView.image,
if newTabButtonImage == nil {
guard let image = newTabButtonImageView.image,
let storedTitlebarBackgroundColor, let storedTitlebarBackgroundColor,
let titlebarBackgroundColor = NSColor(cgColor: storedTitlebarBackgroundColor) else { return } let titlebarBackgroundColor = NSColor(cgColor: storedTitlebarBackgroundColor) else { return }
let isLightTheme = titlebarBackgroundColor.isLightColor let isLightTheme = titlebarBackgroundColor.isLightColor
let newImage = NSImage(size: newTabButtonImage.size, flipped: false) { rect in let newImage = NSImage(size: image.size, flipped: false) { rect in
NSGraphicsContext.saveGraphicsState() NSGraphicsContext.saveGraphicsState()
titlebarBackgroundColor.darken(by: isLightTheme ? 0.1 : 0.5).setFill() titlebarBackgroundColor.darken(by: isLightTheme ? 0.1 : 0.5).setFill()
@ -236,12 +242,15 @@ class TerminalWindow: NSWindow {
NSGraphicsContext.restoreGraphicsState() NSGraphicsContext.restoreGraphicsState()
newTabButtonImage.draw(in: rect, from: .zero, operation: .destinationAtop, fraction: 1.0) image.draw(in: rect, from: .zero, operation: .destinationAtop, fraction: 1.0)
return true return true
} }
newTabButtonImageView.image = newImage newTabButtonImage = newImage
}
newTabButtonImageView.image = newTabButtonImage
} }
private func addWindowButtonsBackdrop(titlebarView: NSView, toolbarView: NSView) { private func addWindowButtonsBackdrop(titlebarView: NSView, toolbarView: NSView) {