Skip to content

Commit cd67bac

Browse files
yonson2alice-i-cecilegreeble-devmockersf
authored
Expose deferred screen edges setting for ios devices (#18729)
# Objective - This just exposes the preferred [screen edges deferring system gestures](https://developer.apple.com/documentation/uikit/uiviewcontroller/preferredscreenedgesdeferringsystemgestures) setting from [winit](https://docs.rs/winit/latest/winit/platform/ios/trait.WindowExtIOS.html#tymethod.set_preferred_screen_edges_deferring_system_gestures), making it accessible in bevy apps. This setting is useful for ios apps that make use of the screen edges, letting the app have control of the first edge gesture before relegating to the os. ## Testing - Tested on simulator and on an iPhone Xs --- --------- Co-authored-by: Alice Cecile <[email protected]> Co-authored-by: Greeble <[email protected]> Co-authored-by: François Mockers <[email protected]>
1 parent 21b62d6 commit cd67bac

File tree

5 files changed

+73
-1
lines changed

5 files changed

+73
-1
lines changed

crates/bevy_window/src/window.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,17 @@ pub struct Window {
443443
///
444444
/// [`WindowAttributesExtIOS::with_prefers_status_bar_hidden`]: https://docs.rs/winit/latest/x86_64-apple-darwin/winit/platform/ios/trait.WindowAttributesExtIOS.html#tymethod.with_prefers_status_bar_hidden
445445
pub prefers_status_bar_hidden: bool,
446+
/// Sets screen edges for which you want your gestures to take precedence
447+
/// over the system gestures.
448+
///
449+
/// Corresponds to [`WindowAttributesExtIOS::with_preferred_screen_edges_deferring_system_gestures`].
450+
///
451+
/// # Platform-specific
452+
///
453+
/// - Only used on iOS.
454+
///
455+
/// [`WindowAttributesExtIOS::with_preferred_screen_edges_deferring_system_gestures`]: https://docs.rs/winit/latest/x86_64-apple-darwin/winit/platform/ios/trait.WindowAttributesExtIOS.html#tymethod.with_preferred_screen_edges_deferring_system_gestures
456+
pub preferred_screen_edges_deferring_system_gestures: ScreenEdge,
446457
}
447458

448459
impl Default for Window {
@@ -487,6 +498,7 @@ impl Default for Window {
487498
titlebar_show_buttons: true,
488499
prefers_home_indicator_hidden: false,
489500
prefers_status_bar_hidden: false,
501+
preferred_screen_edges_deferring_system_gestures: Default::default(),
490502
}
491503
}
492504
}
@@ -1444,6 +1456,31 @@ impl Default for EnabledButtons {
14441456
#[derive(Component, Default)]
14451457
pub struct ClosingWindow;
14461458

1459+
/// The edges of a screen. Corresponds to [`winit::platform::ios::ScreenEdge`].
1460+
///
1461+
/// # Platform-specific
1462+
///
1463+
/// - Only used on iOS.
1464+
///
1465+
/// [`winit::platform::ios::ScreenEdge`]: https://docs.rs/winit/latest/x86_64-apple-darwin/winit/platform/ios/struct.ScreenEdge.html
1466+
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Reflect)]
1467+
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
1468+
pub enum ScreenEdge {
1469+
#[default]
1470+
/// No edge.
1471+
None,
1472+
/// The top edge of the screen.
1473+
Top,
1474+
/// The left edge of the screen.
1475+
Left,
1476+
/// The bottom edge of the screen.
1477+
Bottom,
1478+
/// The right edge of the screen.
1479+
Right,
1480+
/// All edges of the screen.
1481+
All,
1482+
}
1483+
14471484
#[cfg(test)]
14481485
mod tests {
14491486
use super::*;

crates/bevy_winit/src/converters.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ use bevy_window::SystemCursorIcon;
1010
use bevy_window::{EnabledButtons, WindowLevel, WindowTheme};
1111
use winit::keyboard::{Key, NamedKey, NativeKey};
1212

13+
#[cfg(target_os = "ios")]
14+
use bevy_window::ScreenEdge;
15+
1316
pub fn convert_keyboard_input(
1417
keyboard_input: &winit::event::KeyEvent,
1518
window: Entity,
@@ -718,3 +721,16 @@ pub fn convert_resize_direction(resize_direction: CompassOctant) -> winit::windo
718721
CompassOctant::SouthEast => winit::window::ResizeDirection::SouthEast,
719722
}
720723
}
724+
725+
#[cfg(target_os = "ios")]
726+
/// Converts a [`bevy_window::ScreenEdge`] to a [`winit::platform::ios::ScreenEdge`].
727+
pub(crate) fn convert_screen_edge(edge: ScreenEdge) -> winit::platform::ios::ScreenEdge {
728+
match edge {
729+
ScreenEdge::None => winit::platform::ios::ScreenEdge::NONE,
730+
ScreenEdge::Top => winit::platform::ios::ScreenEdge::TOP,
731+
ScreenEdge::Bottom => winit::platform::ios::ScreenEdge::BOTTOM,
732+
ScreenEdge::Left => winit::platform::ios::ScreenEdge::LEFT,
733+
ScreenEdge::Right => winit::platform::ios::ScreenEdge::RIGHT,
734+
ScreenEdge::All => winit::platform::ios::ScreenEdge::ALL,
735+
}
736+
}

crates/bevy_winit/src/system.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,16 @@ pub(crate) fn changed_windows(
568568
if window.prefers_status_bar_hidden != cache.window.prefers_status_bar_hidden {
569569
winit_window.set_prefers_status_bar_hidden(window.prefers_status_bar_hidden);
570570
}
571+
if window.preferred_screen_edges_deferring_system_gestures
572+
!= cache
573+
.window
574+
.preferred_screen_edges_deferring_system_gestures
575+
{
576+
use crate::converters::convert_screen_edge;
577+
let preferred_edge =
578+
convert_screen_edge(window.preferred_screen_edges_deferring_system_gestures);
579+
winit_window.set_preferred_screen_edges_deferring_system_gestures(preferred_edge);
580+
}
571581
}
572582
cache.window = window.clone();
573583
}

crates/bevy_winit/src/winit_windows.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,14 @@ impl WinitWindows {
145145

146146
#[cfg(target_os = "ios")]
147147
{
148+
use crate::converters::convert_screen_edge;
148149
use winit::platform::ios::WindowAttributesExtIOS;
150+
151+
let preferred_edge =
152+
convert_screen_edge(window.preferred_screen_edges_deferring_system_gestures);
153+
154+
winit_window_attributes = winit_window_attributes
155+
.with_preferred_screen_edges_deferring_system_gestures(preferred_edge);
149156
winit_window_attributes = winit_window_attributes
150157
.with_prefers_home_indicator_hidden(window.prefers_home_indicator_hidden);
151158
winit_window_attributes = winit_window_attributes

examples/mobile/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use bevy::{
55
input::{gestures::RotationGesture, touch::TouchPhase},
66
log::{Level, LogPlugin},
77
prelude::*,
8-
window::{AppLifecycle, WindowMode},
8+
window::{AppLifecycle, ScreenEdge, WindowMode},
99
winit::WinitSettings,
1010
};
1111

@@ -34,6 +34,8 @@ pub fn main() {
3434
prefers_home_indicator_hidden: true,
3535
// Only has an effect on iOS
3636
prefers_status_bar_hidden: true,
37+
// Only has an effect on iOS
38+
preferred_screen_edges_deferring_system_gestures: ScreenEdge::Bottom,
3739
..default()
3840
}),
3941
..default()

0 commit comments

Comments
 (0)