Skip to content

Commit

Permalink
On Wayland, handle none decorations
Browse files Browse the repository at this point in the history
During the migration some logic wrt `none` decorations was lost along
the way, however we also now try to ask for client side decorations if
the user wants to disable server side decorations.

Fixes rust-windowing#2902.
  • Loading branch information
kchibisov authored Jun 25, 2023
1 parent bc216b8 commit 059abb0
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 7 deletions.
20 changes: 15 additions & 5 deletions src/platform_impl/linux/wayland/window/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,18 @@ impl Window {
.map(|size| size.to_logical::<u32>(1.))
.unwrap_or((800, 600).into());

let window = state.xdg_shell.create_window(
surface.clone(),
WindowDecorations::ServerDefault,
&queue_handle,
);
// We prefer server side decorations, however to not have decorations we ask for client
// side decorations instead.
let default_decorations = if attributes.decorations {
WindowDecorations::RequestServer
} else {
WindowDecorations::RequestClient
};

let window =
state
.xdg_shell
.create_window(surface.clone(), default_decorations, &queue_handle);

let mut window_state = WindowState::new(
event_loop_window_target.connection.clone(),
Expand All @@ -123,6 +130,9 @@ impl Window {
// Set transparency hint.
window_state.set_transparent(attributes.transparent);

// Set the decorations hint.
window_state.set_decorate(attributes.decorations);

// Set the app_id.
if let Some(name) = platform_attributes.name.map(|name| name.general) {
window.set_app_id(name);
Expand Down
30 changes: 28 additions & 2 deletions src/platform_impl/linux/wayland/window/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@ pub struct WindowState {
/// Whether the CSD fail to create, so we don't try to create them on each iteration.
csd_fails: bool,

/// Whether we should decorate the frame.
decorate: bool,

/// Min size.
min_inner_size: LogicalSize<u32>,
max_inner_size: Option<LogicalSize<u32>>,
Expand Down Expand Up @@ -180,8 +183,8 @@ impl WindowState {
) {
Ok(mut frame) => {
frame.set_title(&self.title);
// Ensure that the frame is not hidden.
frame.set_hidden(false);
// Hide the frame if we were asked to not decorate.
frame.set_hidden(!self.decorate);
self.frame = Some(frame);
}
Err(err) => {
Expand Down Expand Up @@ -391,6 +394,7 @@ impl WindowState {
connection,
theme,
csd_fails: false,
decorate: true,
cursor_grab_mode: GrabState::new(),
cursor_icon: CursorIcon::Default,
cursor_visible: true,
Expand Down Expand Up @@ -706,6 +710,28 @@ impl WindowState {
/// Whether show or hide client side decorations.
#[inline]
pub fn set_decorate(&mut self, decorate: bool) {
if decorate == self.decorate {
return;
}

self.decorate = decorate;

match self
.last_configure
.as_ref()
.map(|configure| configure.decoration_mode)
{
Some(DecorationMode::Server) if !self.decorate => {
// To disable decorations we should request client and hide the frame.
self.window
.request_decoration_mode(Some(DecorationMode::Client))
}
_ if self.decorate => self
.window
.request_decoration_mode(Some(DecorationMode::Server)),
_ => (),
}

if let Some(frame) = self.frame.as_mut() {
frame.set_hidden(!decorate);
// Force the resize.
Expand Down

0 comments on commit 059abb0

Please sign in to comment.