mirror of
https://github.com/rust-windowing/winit.git
synced 2026-08-29 04:40:04 -04:00
macOS: fix borderless game resetting after switching spaces (#4482)
This commit is contained in:
committed by
GitHub
parent
cf9daedb18
commit
983e50971d
@@ -330,6 +330,20 @@ define_class!(
|
|||||||
trace_scope!("windowDidChangeOcclusionState:");
|
trace_scope!("windowDidChangeOcclusionState:");
|
||||||
let visible = self.window().occlusionState().contains(NSWindowOcclusionState::Visible);
|
let visible = self.window().occlusionState().contains(NSWindowOcclusionState::Visible);
|
||||||
self.queue_event(WindowEvent::Occluded(!visible));
|
self.queue_event(WindowEvent::Occluded(!visible));
|
||||||
|
|
||||||
|
// We do this here rather than in `window:willUseFullScreenPresentationOptions`
|
||||||
|
// because doing it there leaves the menu bar interactable despite being hidden.
|
||||||
|
// Moving it here produces the most consistent results.
|
||||||
|
if self.is_borderless_game()
|
||||||
|
&& matches!(*self.ivars().fullscreen.borrow(), Some(Fullscreen::Borderless(_)))
|
||||||
|
{
|
||||||
|
let mtm = MainThreadMarker::from(self);
|
||||||
|
let app = NSApplication::sharedApplication(mtm);
|
||||||
|
app.setPresentationOptions(
|
||||||
|
NSApplicationPresentationOptions::HideDock
|
||||||
|
| NSApplicationPresentationOptions::HideMenuBar,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[unsafe(method(windowDidChangeScreen:))]
|
#[unsafe(method(windowDidChangeScreen:))]
|
||||||
@@ -1534,7 +1548,7 @@ impl WindowDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
match (old_fullscreen, fullscreen) {
|
match (old_fullscreen, fullscreen) {
|
||||||
(None, Some(fullscreen)) => {
|
(None, Some(_)) => {
|
||||||
// `toggleFullScreen` doesn't work if the `StyleMask` is none, so we
|
// `toggleFullScreen` doesn't work if the `StyleMask` is none, so we
|
||||||
// set a normal style temporarily. The previous state will be
|
// set a normal style temporarily. The previous state will be
|
||||||
// restored in `WindowDelegate::window_did_exit_fullscreen`.
|
// restored in `WindowDelegate::window_did_exit_fullscreen`.
|
||||||
@@ -1545,16 +1559,6 @@ impl WindowDelegate {
|
|||||||
self.ivars().saved_style.set(Some(curr_mask));
|
self.ivars().saved_style.set(Some(curr_mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
// In borderless games, we want to disable the dock and menu bar
|
|
||||||
// by setting the presentation options. We do this here rather than in
|
|
||||||
// `window:willUseFullScreenPresentationOptions` because for some reason
|
|
||||||
// the menu bar remains interactable despite being hidden.
|
|
||||||
if self.is_borderless_game() && matches!(fullscreen, Fullscreen::Borderless(_)) {
|
|
||||||
let presentation_options = NSApplicationPresentationOptions::HideDock
|
|
||||||
| NSApplicationPresentationOptions::HideMenuBar;
|
|
||||||
app.setPresentationOptions(presentation_options);
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle_fullscreen(self.window());
|
toggle_fullscreen(self.window());
|
||||||
},
|
},
|
||||||
(Some(Fullscreen::Borderless(_)), None) => {
|
(Some(Fullscreen::Borderless(_)), None) => {
|
||||||
|
|||||||
@@ -251,6 +251,12 @@ impl Application {
|
|||||||
Action::ToggleSimpleFullscreen => {
|
Action::ToggleSimpleFullscreen => {
|
||||||
window.window.set_simple_fullscreen(!window.window.simple_fullscreen());
|
window.window.set_simple_fullscreen(!window.window.simple_fullscreen());
|
||||||
},
|
},
|
||||||
|
#[cfg(macos_platform)]
|
||||||
|
Action::ToggleBorderlessGame => {
|
||||||
|
let current = window.window.is_borderless_game();
|
||||||
|
window.window.set_borderless_game(!current);
|
||||||
|
info!("Borderless game: {}", !current);
|
||||||
|
},
|
||||||
Action::ToggleMaximize => window.toggle_maximize(),
|
Action::ToggleMaximize => window.toggle_maximize(),
|
||||||
Action::Minimize => window.minimize(),
|
Action::Minimize => window.minimize(),
|
||||||
Action::NextCursor => window.next_cursor(),
|
Action::NextCursor => window.next_cursor(),
|
||||||
@@ -1027,6 +1033,8 @@ enum Action {
|
|||||||
ToggleFullscreen,
|
ToggleFullscreen,
|
||||||
#[cfg(macos_platform)]
|
#[cfg(macos_platform)]
|
||||||
ToggleSimpleFullscreen,
|
ToggleSimpleFullscreen,
|
||||||
|
#[cfg(macos_platform)]
|
||||||
|
ToggleBorderlessGame,
|
||||||
ToggleMaximize,
|
ToggleMaximize,
|
||||||
Minimize,
|
Minimize,
|
||||||
NextCursor,
|
NextCursor,
|
||||||
@@ -1064,6 +1072,8 @@ impl Action {
|
|||||||
Action::ToggleFullscreen => "Toggle fullscreen",
|
Action::ToggleFullscreen => "Toggle fullscreen",
|
||||||
#[cfg(macos_platform)]
|
#[cfg(macos_platform)]
|
||||||
Action::ToggleSimpleFullscreen => "Toggle simple fullscreen",
|
Action::ToggleSimpleFullscreen => "Toggle simple fullscreen",
|
||||||
|
#[cfg(macos_platform)]
|
||||||
|
Action::ToggleBorderlessGame => "Toggle borderless game mode",
|
||||||
Action::ToggleMaximize => "Maximize",
|
Action::ToggleMaximize => "Maximize",
|
||||||
Action::Minimize => "Minimize",
|
Action::Minimize => "Minimize",
|
||||||
Action::ToggleResizeIncrements => "Use resize increments when resizing window",
|
Action::ToggleResizeIncrements => "Use resize increments when resizing window",
|
||||||
@@ -1315,6 +1325,8 @@ const KEY_BINDINGS: &[Binding<&'static str>] = &[
|
|||||||
Binding::new("T", ModifiersState::META, Action::CreateNewTab),
|
Binding::new("T", ModifiersState::META, Action::CreateNewTab),
|
||||||
#[cfg(macos_platform)]
|
#[cfg(macos_platform)]
|
||||||
Binding::new("O", ModifiersState::CONTROL, Action::CycleOptionAsAlt),
|
Binding::new("O", ModifiersState::CONTROL, Action::CycleOptionAsAlt),
|
||||||
|
#[cfg(macos_platform)]
|
||||||
|
Binding::new("B", ModifiersState::CONTROL, Action::ToggleBorderlessGame),
|
||||||
Binding::new("S", ModifiersState::ALT, Action::EmitSurfaceSize),
|
Binding::new("S", ModifiersState::ALT, Action::EmitSurfaceSize),
|
||||||
Binding::new("S", ModifiersState::CONTROL, Action::Message),
|
Binding::new("S", ModifiersState::CONTROL, Action::Message),
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -54,3 +54,4 @@ changelog entry.
|
|||||||
- On X11, fix `set_hittest` not working on some window managers.
|
- On X11, fix `set_hittest` not working on some window managers.
|
||||||
- On Redox, handle `EINTR` when reading from `event_socket` instead of panicking.
|
- On Redox, handle `EINTR` when reading from `event_socket` instead of panicking.
|
||||||
- On Wayland, switch from using the `ahash` hashing algorithm to `foldhash`.
|
- On Wayland, switch from using the `ahash` hashing algorithm to `foldhash`.
|
||||||
|
- On macOS, fix borderless game presentation options not sticking after switching spaces.
|
||||||
|
|||||||
Reference in New Issue
Block a user