aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty/src')
-rw-r--r--alacritty/src/display.rs6
-rw-r--r--alacritty/src/window.rs19
2 files changed, 25 insertions, 0 deletions
diff --git a/alacritty/src/display.rs b/alacritty/src/display.rs
index 1fe1d2de..fb82b9f8 100644
--- a/alacritty/src/display.rs
+++ b/alacritty/src/display.rs
@@ -610,6 +610,12 @@ 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/window.rs b/alacritty/src/window.rs
index f4a38183..1b874d15 100644
--- a/alacritty/src/window.rs
+++ b/alacritty/src/window.rs
@@ -31,6 +31,8 @@ use {
use std::fmt::{self, Display, Formatter};
+#[cfg(target_os = "macos")]
+use cocoa::base::id;
use glutin::dpi::{PhysicalPosition, PhysicalSize};
use glutin::event_loop::EventLoop;
#[cfg(target_os = "macos")]
@@ -41,6 +43,10 @@ use glutin::window::{
CursorIcon, Fullscreen, UserAttentionType, Window as GlutinWindow, WindowBuilder, WindowId,
};
use glutin::{self, ContextBuilder, PossiblyCurrent, WindowedContext};
+#[cfg(target_os = "macos")]
+use objc::{msg_send, sel, sel_impl};
+#[cfg(target_os = "macos")]
+use raw_window_handle::{HasRawWindowHandle, RawWindowHandle};
#[cfg(windows)]
use winapi::shared::minwindef::WORD;
@@ -435,6 +441,19 @@ impl Window {
self.windowed_context.resize(size);
}
+ /// Force macOS to clear shadow of transparent windows.
+ #[cfg(target_os = "macos")]
+ pub fn invalidate_shadow(&self) {
+ let raw_window = match self.window().raw_window_handle() {
+ RawWindowHandle::MacOS(handle) => handle.ns_window as id,
+ _ => return,
+ };
+
+ unsafe {
+ let _: () = msg_send![raw_window, invalidateShadow];
+ }
+ }
+
fn window(&self) -> &GlutinWindow {
self.windowed_context.window()
}