mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2025-01-11 21:31:29 +11:00
On Wayland, Hide CSD for fullscreen windows (#1473)
This commit is contained in:
parent
d1073dcecb
commit
76d0dd7ec3
|
@ -7,6 +7,7 @@
|
||||||
- On Wayland, Add HiDPI cursor support
|
- On Wayland, Add HiDPI cursor support
|
||||||
- On Web, add the ability to query "Light" or "Dark" system theme send `ThemeChanged` on change.
|
- On Web, add the ability to query "Light" or "Dark" system theme send `ThemeChanged` on change.
|
||||||
- Fix `Event::to_static` returning `None` for user events.
|
- Fix `Event::to_static` returning `None` for user events.
|
||||||
|
- On Wayland, Hide CSD for fullscreen windows.
|
||||||
|
|
||||||
# 0.21.0 (2020-02-04)
|
# 0.21.0 (2020-02-04)
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,10 @@ use crate::{
|
||||||
window::{CursorIcon, WindowId as RootWindowId},
|
window::{CursorIcon, WindowId as RootWindowId},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{window::WindowStore, DeviceId, WindowId};
|
use super::{
|
||||||
|
window::{DecorationsAction, WindowStore},
|
||||||
|
DeviceId, WindowId,
|
||||||
|
};
|
||||||
|
|
||||||
use smithay_client_toolkit::{
|
use smithay_client_toolkit::{
|
||||||
output::OutputMgr,
|
output::OutputMgr,
|
||||||
|
@ -713,6 +716,13 @@ impl<T> EventLoop<T> {
|
||||||
crate::window::WindowId(crate::platform_impl::WindowId::Wayland(window.wid));
|
crate::window::WindowId(crate::platform_impl::WindowId::Wayland(window.wid));
|
||||||
if let Some(frame) = window.frame {
|
if let Some(frame) = window.frame {
|
||||||
if let Some((w, h)) = window.newsize {
|
if let Some((w, h)) = window.newsize {
|
||||||
|
// Update decorations state
|
||||||
|
match window.decorations_action {
|
||||||
|
Some(DecorationsAction::Hide) => frame.set_decorate(false),
|
||||||
|
Some(DecorationsAction::Show) => frame.set_decorate(true),
|
||||||
|
None => (),
|
||||||
|
}
|
||||||
|
|
||||||
// mutter (GNOME Wayland) relies on `set_geometry` to reposition window in case
|
// mutter (GNOME Wayland) relies on `set_geometry` to reposition window in case
|
||||||
// it overlaps mutter's `bounding box`, so we can't avoid this resize call,
|
// it overlaps mutter's `bounding box`, so we can't avoid this resize call,
|
||||||
// which calls `set_geometry` under the hood, for now.
|
// which calls `set_geometry` under the hood, for now.
|
||||||
|
|
|
@ -41,6 +41,13 @@ pub struct Window {
|
||||||
need_refresh: Arc<Mutex<bool>>,
|
need_refresh: Arc<Mutex<bool>>,
|
||||||
fullscreen: Arc<Mutex<bool>>,
|
fullscreen: Arc<Mutex<bool>>,
|
||||||
cursor_grab_changed: Arc<Mutex<Option<bool>>>, // Update grab state
|
cursor_grab_changed: Arc<Mutex<Option<bool>>>, // Update grab state
|
||||||
|
decorated: Arc<Mutex<bool>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
pub enum DecorationsAction {
|
||||||
|
Hide,
|
||||||
|
Show,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Window {
|
impl Window {
|
||||||
|
@ -69,6 +76,9 @@ impl Window {
|
||||||
|
|
||||||
let window_store = evlp.store.clone();
|
let window_store = evlp.store.clone();
|
||||||
|
|
||||||
|
let decorated = Arc::new(Mutex::new(attributes.decorations));
|
||||||
|
let pending_decorations_action = Arc::new(Mutex::new(None));
|
||||||
|
|
||||||
let my_surface = surface.clone();
|
let my_surface = surface.clone();
|
||||||
let mut frame = SWindow::<ConceptFrame>::init_from_env(
|
let mut frame = SWindow::<ConceptFrame>::init_from_env(
|
||||||
&evlp.env,
|
&evlp.env,
|
||||||
|
@ -83,7 +93,23 @@ impl Window {
|
||||||
if window.surface.as_ref().equals(&my_surface.as_ref()) {
|
if window.surface.as_ref().equals(&my_surface.as_ref()) {
|
||||||
window.newsize = new_size;
|
window.newsize = new_size;
|
||||||
*(window.need_refresh.lock().unwrap()) = true;
|
*(window.need_refresh.lock().unwrap()) = true;
|
||||||
*(window.fullscreen.lock().unwrap()) = is_fullscreen;
|
{
|
||||||
|
// Get whether we're in fullscreen
|
||||||
|
let mut fullscreen = window.fullscreen.lock().unwrap();
|
||||||
|
// Fullscreen state was changed, so update decorations
|
||||||
|
if *fullscreen != is_fullscreen {
|
||||||
|
let decorated = { *window.decorated.lock().unwrap() };
|
||||||
|
if decorated {
|
||||||
|
*window.pending_decorations_action.lock().unwrap() =
|
||||||
|
if is_fullscreen {
|
||||||
|
Some(DecorationsAction::Hide)
|
||||||
|
} else {
|
||||||
|
Some(DecorationsAction::Show)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*fullscreen = is_fullscreen;
|
||||||
|
}
|
||||||
*(window.need_frame_refresh.lock().unwrap()) = true;
|
*(window.need_frame_refresh.lock().unwrap()) = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -174,6 +200,8 @@ impl Window {
|
||||||
frame: Arc::downgrade(&frame),
|
frame: Arc::downgrade(&frame),
|
||||||
current_dpi: 1,
|
current_dpi: 1,
|
||||||
new_dpi: None,
|
new_dpi: None,
|
||||||
|
decorated: decorated.clone(),
|
||||||
|
pending_decorations_action: pending_decorations_action.clone(),
|
||||||
});
|
});
|
||||||
evlp.evq.borrow_mut().sync_roundtrip().unwrap();
|
evlp.evq.borrow_mut().sync_roundtrip().unwrap();
|
||||||
|
|
||||||
|
@ -189,6 +217,7 @@ impl Window {
|
||||||
cursor_manager,
|
cursor_manager,
|
||||||
fullscreen,
|
fullscreen,
|
||||||
cursor_grab_changed,
|
cursor_grab_changed,
|
||||||
|
decorated,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,6 +306,7 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_decorations(&self, decorate: bool) {
|
pub fn set_decorations(&self, decorate: bool) {
|
||||||
|
*(self.decorated.lock().unwrap()) = decorate;
|
||||||
self.frame.lock().unwrap().set_decorate(decorate);
|
self.frame.lock().unwrap().set_decorate(decorate);
|
||||||
*(self.need_frame_refresh.lock().unwrap()) = true;
|
*(self.need_frame_refresh.lock().unwrap()) = true;
|
||||||
}
|
}
|
||||||
|
@ -409,6 +439,8 @@ struct InternalWindow {
|
||||||
frame: Weak<Mutex<SWindow<ConceptFrame>>>,
|
frame: Weak<Mutex<SWindow<ConceptFrame>>>,
|
||||||
current_dpi: i32,
|
current_dpi: i32,
|
||||||
new_dpi: Option<i32>,
|
new_dpi: Option<i32>,
|
||||||
|
decorated: Arc<Mutex<bool>>,
|
||||||
|
pending_decorations_action: Arc<Mutex<Option<DecorationsAction>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct WindowStore {
|
pub struct WindowStore {
|
||||||
|
@ -425,6 +457,7 @@ pub struct WindowStoreForEach<'a> {
|
||||||
pub surface: &'a wl_surface::WlSurface,
|
pub surface: &'a wl_surface::WlSurface,
|
||||||
pub wid: WindowId,
|
pub wid: WindowId,
|
||||||
pub frame: Option<&'a mut SWindow<ConceptFrame>>,
|
pub frame: Option<&'a mut SWindow<ConceptFrame>>,
|
||||||
|
pub decorations_action: Option<DecorationsAction>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WindowStore {
|
impl WindowStore {
|
||||||
|
@ -482,6 +515,7 @@ impl WindowStore {
|
||||||
let opt_arc = window.frame.upgrade();
|
let opt_arc = window.frame.upgrade();
|
||||||
let mut opt_mutex_lock = opt_arc.as_ref().map(|m| m.lock().unwrap());
|
let mut opt_mutex_lock = opt_arc.as_ref().map(|m| m.lock().unwrap());
|
||||||
let mut size = { *window.size.lock().unwrap() };
|
let mut size = { *window.size.lock().unwrap() };
|
||||||
|
let decorations_action = { window.pending_decorations_action.lock().unwrap().take() };
|
||||||
f(WindowStoreForEach {
|
f(WindowStoreForEach {
|
||||||
newsize: window.newsize.take(),
|
newsize: window.newsize.take(),
|
||||||
size: &mut size,
|
size: &mut size,
|
||||||
|
@ -492,6 +526,7 @@ impl WindowStore {
|
||||||
surface: &window.surface,
|
surface: &window.surface,
|
||||||
wid: make_wid(&window.surface),
|
wid: make_wid(&window.surface),
|
||||||
frame: opt_mutex_lock.as_mut().map(|m| &mut **m),
|
frame: opt_mutex_lock.as_mut().map(|m| &mut **m),
|
||||||
|
decorations_action,
|
||||||
});
|
});
|
||||||
*window.size.lock().unwrap() = size;
|
*window.size.lock().unwrap() = size;
|
||||||
if let Some(dpi) = window.new_dpi.take() {
|
if let Some(dpi) = window.new_dpi.take() {
|
||||||
|
|
Loading…
Reference in a new issue