From f19cbca9b4c98a33b786bd971e3abae66bd16e26 Mon Sep 17 00:00:00 2001 From: Christian Duerr Date: Tue, 22 Dec 2020 04:25:43 +0000 Subject: Disable shadows for transparent windows on macOS Commit 5725f58 introduced a performance regression on macOS due to excessive calls to the `invalidateShadow` function, however calling this function only on redraw after a resize was performed does not fix the underlying problem. As a solution, window shadows are now disabled completely for all transparent windows. This makes sure there is no performance impact, while still solving the problem with text artifacts on resize. Fixes #4604. --- alacritty/src/display.rs | 10 ++++------ alacritty/src/event.rs | 4 ++++ alacritty/src/window.rs | 11 +++++++---- 3 files changed, 15 insertions(+), 10 deletions(-) (limited to 'alacritty') diff --git a/alacritty/src/display.rs b/alacritty/src/display.rs index fb82b9f8..7fbf0d54 100644 --- a/alacritty/src/display.rs +++ b/alacritty/src/display.rs @@ -254,6 +254,10 @@ impl Display { #[cfg(target_os = "macos")] crossfont::set_font_smoothing(config.ui_config.font.use_thin_strokes); + // Disable shadows for transparent windows on macOS. + #[cfg(target_os = "macos")] + window.set_has_shadow(config.ui_config.background_opacity() >= 1.0); + #[cfg(all(feature = "x11", not(any(target_os = "macos", windows))))] let is_x11 = event_loop.is_x11(); #[cfg(not(any(feature = "x11", target_os = "macos", windows)))] @@ -610,12 +614,6 @@ impl Display { #[cfg(all(feature = "wayland", not(any(target_os = "macos", windows))))] self.request_frame(&self.window); - // Clear window shadows to prevent shadow artifacts on macOS. - #[cfg(target_os = "macos")] - if config.ui_config.background_opacity() < 1.0 { - self.window.invalidate_shadow(); - } - self.window.swap_buffers(); #[cfg(all(feature = "x11", not(any(target_os = "macos", windows))))] diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs index 87b1d5c8..bbb0da0f 100644 --- a/alacritty/src/event.rs +++ b/alacritty/src/event.rs @@ -1279,6 +1279,10 @@ impl Processor { #[cfg(target_os = "macos")] crossfont::set_font_smoothing(config.ui_config.font.use_thin_strokes); + // Disable shadows for transparent windows on macOS. + #[cfg(target_os = "macos")] + processor.ctx.window.set_has_shadow(config.ui_config.background_opacity() >= 1.0); + *processor.ctx.config = config; // Update cursor blinking. diff --git a/alacritty/src/window.rs b/alacritty/src/window.rs index 1b874d15..418994ed 100644 --- a/alacritty/src/window.rs +++ b/alacritty/src/window.rs @@ -32,7 +32,7 @@ use { use std::fmt::{self, Display, Formatter}; #[cfg(target_os = "macos")] -use cocoa::base::id; +use cocoa::base::{id, NO, YES}; use glutin::dpi::{PhysicalPosition, PhysicalSize}; use glutin::event_loop::EventLoop; #[cfg(target_os = "macos")] @@ -441,16 +441,19 @@ impl Window { self.windowed_context.resize(size); } - /// Force macOS to clear shadow of transparent windows. + /// Disable macOS window shadows. + /// + /// This prevents rendering artifacts from showing up when the window is transparent. #[cfg(target_os = "macos")] - pub fn invalidate_shadow(&self) { + pub fn set_has_shadow(&self, has_shadows: bool) { let raw_window = match self.window().raw_window_handle() { RawWindowHandle::MacOS(handle) => handle.ns_window as id, _ => return, }; + let value = if has_shadows { YES } else { NO }; unsafe { - let _: () = msg_send![raw_window, invalidateShadow]; + let _: () = msg_send![raw_window, setHasShadow: value]; } } -- cgit