Fix window drawing when switching X11 workspaces by presenting when expose events occur (#20535)

Closes #18184

Release Notes:

- Fix window drawing when switching X11 workspaces, particularly for tiling window managers such as i3wm and XMonad.
This commit is contained in:
Michael Sloan 2024-11-12 01:20:25 -07:00 committed by GitHub
parent ad3171d16d
commit aad3ed7f91
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 40 additions and 32 deletions

View file

@ -4,8 +4,8 @@ use crate::{
ExternalPaths, FileDropEvent, ForegroundExecutor, KeyDownEvent, Keystroke, Modifiers,
ModifiersChangedEvent, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, Pixels,
PlatformAtlas, PlatformDisplay, PlatformInput, PlatformWindow, Point, PromptLevel,
ScaledPixels, Size, Timer, WindowAppearance, WindowBackgroundAppearance, WindowBounds,
WindowKind, WindowParams,
RequestFrameOptions, ScaledPixels, Size, Timer, WindowAppearance, WindowBackgroundAppearance,
WindowBounds, WindowKind, WindowParams,
};
use block::ConcreteBlock;
use cocoa::{
@ -316,7 +316,7 @@ struct MacWindowState {
native_view: NonNull<Object>,
display_link: Option<DisplayLink>,
renderer: renderer::Renderer,
request_frame_callback: Option<Box<dyn FnMut()>>,
request_frame_callback: Option<Box<dyn FnMut(RequestFrameOptions)>>,
event_callback: Option<Box<dyn FnMut(PlatformInput) -> crate::DispatchEventResult>>,
activate_callback: Option<Box<dyn FnMut(bool)>>,
resize_callback: Option<Box<dyn FnMut(Size<Pixels>, f32)>>,
@ -1060,7 +1060,7 @@ impl PlatformWindow for MacWindow {
}
}
fn on_request_frame(&self, callback: Box<dyn FnMut()>) {
fn on_request_frame(&self, callback: Box<dyn FnMut(RequestFrameOptions)>) {
self.0.as_ref().lock().request_frame_callback = Some(callback);
}
@ -1617,7 +1617,7 @@ extern "C" fn display_layer(this: &Object, _: Sel, _: id) {
lock.renderer.set_presents_with_transaction(true);
lock.stop_display_link();
drop(lock);
callback();
callback(Default::default());
let mut lock = window_state.lock();
lock.request_frame_callback = Some(callback);
@ -1634,7 +1634,7 @@ unsafe extern "C" fn step(view: *mut c_void) {
if let Some(mut callback) = lock.request_frame_callback.take() {
drop(lock);
callback();
callback(Default::default());
window_state.lock().request_frame_callback = Some(callback);
}
}