From f0a1bbcf7c4c06208e80c84607b399d9e94c93ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aliaksandr=20Tru=C5=A1?= Date: Sun, 4 Aug 2024 13:26:58 +0200 Subject: [PATCH 1/4] feat: implement toggle_fullscreen for Wayland --- window/src/os/wayland/window.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index 254f42dea78..663dfe94e86 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -452,6 +452,17 @@ impl WindowOps for WaylandWindow { Ok(()) }); } + + fn toggle_fullscreen(&self) { + WaylandConnection::with_window_inner(self.0, move |inner| { + if inner.window_state.contains(WindowState::FULL_SCREEN) { + inner.window.as_ref().unwrap().unset_fullscreen(); + } else { + inner.window.as_ref().unwrap().set_fullscreen(None); + } + Ok(()) + }); + } } #[derive(Default, Clone, Debug)] pub(crate) struct PendingEvent { From aacf65fcb6fbea3e8f0a37d5afe8e2e7cfa6fc39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aliaksandr=20Tru=C5=A1?= Date: Mon, 5 Aug 2024 21:42:30 +0200 Subject: [PATCH 2/4] feat: implement hide for Wayland --- window/src/os/wayland/window.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index 663dfe94e86..5fdb9b330e8 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -359,7 +359,10 @@ impl WindowOps for WaylandWindow { } fn hide(&self) { - todo!() + WaylandConnection::with_window_inner(self.0, move |inner| { + inner.window.as_ref().unwrap().set_minimized(); + Ok(()) + }); } fn close(&self) { From 7e3493b696e86ce689b287090f639fefc8b71c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aliaksandr=20Tru=C5=A1?= Date: Sun, 11 Aug 2024 12:26:04 +0200 Subject: [PATCH 3/4] fix(wayland): wrong MAXIMIZED and FULL_SCREEN window size --- window/src/os/wayland/window.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index 5fdb9b330e8..f03745d550c 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -1267,6 +1267,13 @@ impl WaylandState { state |= WindowState::MAXIMIZED; } + // For MAXIMIZED and FULL_SCREEN window configure contains Windowed size. + // Replacing it with Wayland suggested bounds. + if state.contains(WindowState::MAXIMIZED) || state.contains(WindowState::FULL_SCREEN) { + if let Some((w, h)) = configure.suggested_bounds { + pending_event.configure.replace((w, h)); + } + } log::debug!( "Config: self.window_state={:?}, states: {:?} {:?}", pending_event.window_state, From c9eb1b4adcec00b840e10427ee764f52a67aa2ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aliaksandr=20Tru=C5=A1?= Date: Fri, 16 Aug 2024 23:04:10 +0200 Subject: [PATCH 4/4] fix(wayland): update size behavior for tiled window --- window/src/os/wayland/window.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/window/src/os/wayland/window.rs b/window/src/os/wayland/window.rs index f03745d550c..0aa05604a46 100644 --- a/window/src/os/wayland/window.rs +++ b/window/src/os/wayland/window.rs @@ -1226,6 +1226,7 @@ impl WaylandState { .window_by_id(window_id) .expect("Inner Window should exist"); + let is_frame_hidden = window_inner.borrow().window_frame.is_hidden(); let p = window_inner.borrow().pending_event.clone(); let mut pending_event = p.lock().unwrap(); @@ -1258,21 +1259,21 @@ impl WaylandState { if configure.state.contains(SCTKWindowState::FULLSCREEN) { state |= WindowState::FULL_SCREEN; } - let fs_bits = SCTKWindowState::MAXIMIZED - | SCTKWindowState::TILED_LEFT - | SCTKWindowState::TILED_RIGHT - | SCTKWindowState::TILED_TOP - | SCTKWindowState::TILED_BOTTOM; - if !((configure.state & fs_bits).is_empty()) { + if configure.state.contains(SCTKWindowState::MAXIMIZED) { state |= WindowState::MAXIMIZED; } // For MAXIMIZED and FULL_SCREEN window configure contains Windowed size. // Replacing it with Wayland suggested bounds. - if state.contains(WindowState::MAXIMIZED) || state.contains(WindowState::FULL_SCREEN) { + if state.intersects(WindowState::MAXIMIZED | WindowState::FULL_SCREEN) { if let Some((w, h)) = configure.suggested_bounds { pending_event.configure.replace((w, h)); } + } else if configure.state.contains(SCTKWindowState::TILED_TOP | SCTKWindowState::TILED_BOTTOM) && is_frame_hidden { + // Tiled window without borders will take exactly half of the screen. + if let Some((w, h)) = configure.suggested_bounds { + pending_event.configure.replace((w / 2, h)); + } } log::debug!( "Config: self.window_state={:?}, states: {:?} {:?}",