git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit21f8bcd7a3ac4ae7523575fefcac73c2294cb937
parentf3030372c2
authorLucas Galante <[email protected]>
date2026-06-23 14:56
feat: keep windows in Pinned mode in Pinned mode when moved

 src/server/cursor.rs       | 5 ++++-
 src/server/seat.rs         | 4 +++-
 src/server/xdg_toplevel.rs | 1 +
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/server/cursor.rs b/src/server/cursor.rs
index b39048d..5ca86f1 100644
--- a/src/server/cursor.rs
+++ b/src/server/cursor.rs
@@ -642,6 +642,7 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
                 if (*target_win).tiling_mode != crate::tiling::TilingMode::Floating
                     && (*target_win).tiling_mode != crate::tiling::TilingMode::Popup
                     && (*target_win).tiling_mode != crate::tiling::TilingMode::Fullscreen
+                    && (*target_win).tiling_mode != crate::tiling::TilingMode::Pinned
                 {
                     (*target_win).tiling_mode = crate::tiling::TilingMode::Floating;
                     (*target_win).mode_locked = true;
@@ -745,7 +746,9 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
                 }
                 BorderZone::Move => {
                     if (*event).button == 0x110 { // BTN_LEFT
-                        if initial_mode != crate::tiling::TilingMode::Floating {
+                        if initial_mode != crate::tiling::TilingMode::Floating
+                            && initial_mode != crate::tiling::TilingMode::Pinned
+                        {
                             (*border_target_win).tiling_mode = crate::tiling::TilingMode::Floating;
                             (*border_target_win).mode_locked = true;
                         }
diff --git a/src/server/seat.rs b/src/server/seat.rs
index 92740d3..41030e4 100644
--- a/src/server/seat.rs
+++ b/src/server/seat.rs
@@ -821,7 +821,9 @@ impl Seat {
             
             let win = op.window_ptr;
             if !win.is_null() && !(*win).closed {
-                if (*win).tiling_mode != crate::tiling::TilingMode::Floating {
+                if (*win).tiling_mode != crate::tiling::TilingMode::Floating
+                    && (*win).tiling_mode != crate::tiling::TilingMode::Pinned
+                {
                     (*win).tiling_mode = crate::tiling::TilingMode::Floating;
                     (*win).mode_locked = true;
                 }
diff --git a/src/server/xdg_toplevel.rs b/src/server/xdg_toplevel.rs
index 272f290..dc242be 100644
--- a/src/server/xdg_toplevel.rs
+++ b/src/server/xdg_toplevel.rs
@@ -587,6 +587,7 @@ unsafe extern "C" fn handle_request_move(
         if initial_mode != crate::tiling::TilingMode::Floating
             && initial_mode != crate::tiling::TilingMode::Popup
             && initial_mode != crate::tiling::TilingMode::Fullscreen
+            && initial_mode != crate::tiling::TilingMode::Pinned
         {
             (*window).tiling_mode = crate::tiling::TilingMode::Floating;
             (*window).mode_locked = true;