From f705d0080d5a05e5f23bfeab35271722723c6433 Mon Sep 17 00:00:00 2001 From: Timon Date: Mon, 22 Dec 2025 04:14:47 +0000 Subject: [PATCH] Desktop: Switch to immediate frame present mode on Mac (#3495) * mac immediate render mode * fix key modifier flags on mac --- desktop/src/cef/input.rs | 32 +++++++++++++++++++++++++++++++- desktop/src/render/state.rs | 5 ++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/desktop/src/cef/input.rs b/desktop/src/cef/input.rs index a764db91..bf15ec46 100644 --- a/desktop/src/cef/input.rs +++ b/desktop/src/cef/input.rs @@ -1,6 +1,7 @@ -use cef::sys::{cef_key_event_type_t, cef_mouse_button_type_t}; +use cef::sys::{cef_event_flags_t, cef_key_event_type_t, cef_mouse_button_type_t}; use cef::{Browser, ImplBrowser, ImplBrowserHost, KeyEvent, MouseEvent}; use winit::event::{ButtonSource, ElementState, MouseButton, MouseScrollDelta, WindowEvent}; +use winit::keyboard::Key; mod keymap; use keymap::{ToCharRepresentation, ToNativeKeycode, ToVKBits}; @@ -81,6 +82,35 @@ pub(crate) fn handle_window_event(browser: &Browser, input_state: &mut InputStat key_event.modifiers = input_state.cef_modifiers(&event.location, event.repeat).into(); + match (&event.logical_key, event.state) { + (Key::Named(winit::keyboard::NamedKey::Control), ElementState::Pressed) => { + key_event.modifiers |= cef_event_flags_t::EVENTFLAG_CONTROL_DOWN.0; + } + (Key::Named(winit::keyboard::NamedKey::Control), ElementState::Released) => { + key_event.modifiers &= !(cef_event_flags_t::EVENTFLAG_CONTROL_DOWN.0); + } + (Key::Named(winit::keyboard::NamedKey::Shift), ElementState::Pressed) => { + key_event.modifiers |= cef_event_flags_t::EVENTFLAG_SHIFT_DOWN.0; + } + (Key::Named(winit::keyboard::NamedKey::Shift), ElementState::Released) => { + key_event.modifiers &= !(cef_event_flags_t::EVENTFLAG_SHIFT_DOWN.0); + } + (Key::Named(winit::keyboard::NamedKey::Alt), ElementState::Pressed) => { + key_event.modifiers |= cef_event_flags_t::EVENTFLAG_ALT_DOWN.0; + } + (Key::Named(winit::keyboard::NamedKey::Alt), ElementState::Released) => { + key_event.modifiers &= !(cef_event_flags_t::EVENTFLAG_ALT_DOWN.0); + } + (Key::Named(winit::keyboard::NamedKey::Meta), ElementState::Pressed) => { + key_event.modifiers |= cef_event_flags_t::EVENTFLAG_COMMAND_DOWN.0; + } + (Key::Named(winit::keyboard::NamedKey::Meta), ElementState::Released) => { + key_event.modifiers &= !(cef_event_flags_t::EVENTFLAG_COMMAND_DOWN.0); + } + + _ => {} + } + key_event.windows_key_code = match &event.logical_key { winit::keyboard::Key::Named(named) => named.to_vk_bits(), winit::keyboard::Key::Character(char) => char.chars().next().unwrap_or_default().to_vk_bits(), diff --git a/desktop/src/render/state.rs b/desktop/src/render/state.rs index b03e4659..46a919b8 100644 --- a/desktop/src/render/state.rs +++ b/desktop/src/render/state.rs @@ -37,10 +37,13 @@ impl RenderState { format: surface_format, width: size.width, height: size.height, + #[cfg(not(target_os = "macos"))] present_mode: surface_caps.present_modes[0], + #[cfg(target_os = "macos")] + present_mode: wgpu::PresentMode::Immediate, alpha_mode: surface_caps.alpha_modes[0], view_formats: vec![], - desired_maximum_frame_latency: 2, + desired_maximum_frame_latency: 1, }; surface.configure(&context.device, &config);