Allow AccessKit to react to WindowEvents before they reach the engine (#10356)
# Objective - Adopt #10239 to get it in time for the release - Fix accessibility on macOS and linux ## Solution - call `on_event` from AcccessKit adapter on winit events --------- Co-authored-by: Nolan Darilek <nolan@thewordnerd.info> Co-authored-by: Alice Cecile <alice.i.cecil@gmail.com> Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
This commit is contained in:
parent
708569c91e
commit
a1681f43d9
@ -372,6 +372,7 @@ pub fn winit_runner(mut app: App) {
|
||||
WindowAndInputEventWriters,
|
||||
NonSend<WinitWindows>,
|
||||
Query<(&mut Window, &mut CachedWindow)>,
|
||||
NonSend<AccessKitAdapters>,
|
||||
)> = SystemState::new(&mut app.world);
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
@ -476,7 +477,7 @@ pub fn winit_runner(mut app: App) {
|
||||
event::Event::WindowEvent {
|
||||
event, window_id, ..
|
||||
} => {
|
||||
let (mut event_writers, winit_windows, mut windows) =
|
||||
let (mut event_writers, winit_windows, mut windows, access_kit_adapters) =
|
||||
event_writer_system_state.get_mut(&mut app.world);
|
||||
|
||||
let Some(window_entity) = winit_windows.get_window_entity(window_id) else {
|
||||
@ -495,6 +496,18 @@ pub fn winit_runner(mut app: App) {
|
||||
return;
|
||||
};
|
||||
|
||||
// Allow AccessKit to respond to `WindowEvent`s before they reach
|
||||
// the engine.
|
||||
if let Some(adapter) = access_kit_adapters.get(&window_entity) {
|
||||
if let Some(window) = winit_windows.get_window(window_entity) {
|
||||
// Somewhat surprisingly, this call has meaningful side effects
|
||||
// See https://github.com/AccessKit/accesskit/issues/300
|
||||
// AccessKit might later need to filter events based on this, but we currently do not.
|
||||
// See https://github.com/bevyengine/bevy/pull/10239#issuecomment-1775572176
|
||||
let _ = adapter.on_event(window, &event);
|
||||
}
|
||||
}
|
||||
|
||||
runner_state.window_event_received = true;
|
||||
|
||||
match event {
|
||||
@ -713,20 +726,20 @@ pub fn winit_runner(mut app: App) {
|
||||
event: DeviceEvent::MouseMotion { delta: (x, y) },
|
||||
..
|
||||
} => {
|
||||
let (mut event_writers, _, _) = event_writer_system_state.get_mut(&mut app.world);
|
||||
let (mut event_writers, ..) = event_writer_system_state.get_mut(&mut app.world);
|
||||
event_writers.mouse_motion.send(MouseMotion {
|
||||
delta: Vec2::new(x as f32, y as f32),
|
||||
});
|
||||
}
|
||||
event::Event::Suspended => {
|
||||
let (mut event_writers, _, _) = event_writer_system_state.get_mut(&mut app.world);
|
||||
let (mut event_writers, ..) = event_writer_system_state.get_mut(&mut app.world);
|
||||
event_writers.lifetime.send(ApplicationLifetime::Suspended);
|
||||
// Mark the state as `WillSuspend`. This will let the schedule run one last time
|
||||
// before actually suspending to let the application react
|
||||
runner_state.active = ActiveState::WillSuspend;
|
||||
}
|
||||
event::Event::Resumed => {
|
||||
let (mut event_writers, _, _) = event_writer_system_state.get_mut(&mut app.world);
|
||||
let (mut event_writers, ..) = event_writer_system_state.get_mut(&mut app.world);
|
||||
match runner_state.active {
|
||||
ActiveState::NotYetStarted => {
|
||||
event_writers.lifetime.send(ApplicationLifetime::Started);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user