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

commit93d787fb58f371ea95427ae5706a54bf3f831de1
parent99c14cc89e
authorLucas Galante <[email protected]>
date2026-06-27 18:59
Rename Pinned to Overlay mode, set cce-cloud to Overlay, bypass overview input block

 src/cce_ctl.rs               |  4 +--
 src/server/config.rs         | 74 ++++++++++++++++++++++----------------------
 src/server/cursor.rs         | 28 +++++++++++++----
 src/server/keyboard_group.rs | 11 +++++++
 src/server/seat.rs           |  4 +--
 src/server/tiling.rs         |  4 +--
 src/server/window_manager.rs | 41 ++++++++++++------------
 src/server/xdg_toplevel.rs   |  2 +-
 8 files changed, 99 insertions(+), 69 deletions(-)

diff --git a/src/cce_ctl.rs b/src/cce_ctl.rs
index c23a0e5..757bee0 100644
--- a/src/cce_ctl.rs
+++ b/src/cce_ctl.rs
@@ -51,8 +51,8 @@ fn usage(name: &str, to_stderr: bool) {
     print("  pbind <mods> <button> <action>");
     print("  retile");
     print("  set-viewport <1-4>");
-    print("  mode <cascade|grid|fullscreen|floating|popup|maximized> <app_id> [title]");
-    print("  viewport-layout <1-4> <cascade|grid|fullscreen|floating|popup|maximized>");
+    print("  mode <cascade|grid|fullscreen|floating|popup|maximized|overlay> <app_id> [title]");
+    print("  viewport-layout <1-4> <cascade|grid|fullscreen|floating|popup|maximized|overlay>");
     print("  pointer-location");
     print("  pointer-move-to <x> <y>");
     print("  pointer-move-by <dx> <dy>");
diff --git a/src/server/config.rs b/src/server/config.rs
index cbd0ac2..884ad5b 100644
--- a/src/server/config.rs
+++ b/src/server/config.rs
@@ -32,10 +32,10 @@ pub struct Layout {
     pub grid_gap: i32,
     pub border_blur: bool,
     pub window_blur: bool,
-    pub pinned_behavior: String,
-    pub pinned_width: i32,
-    pub pinned_position: String,
-    pub pinned_border_gap: i32,
+    pub overlay_behavior: String,
+    pub overlay_width: i32,
+    pub overlay_position: String,
+    pub overlay_border_gap: i32,
     pub status_normal_color: String,
     pub desktop_background: String,
     pub transparency_opacity: f32,
@@ -73,10 +73,10 @@ impl Default for Layout {
             grid_gap: 18,
             border_blur: false,
             window_blur: false,
-            pinned_behavior: "inline".to_string(),
-            pinned_width: 360,
-            pinned_position: "left".to_string(),
-            pinned_border_gap: 0,
+            overlay_behavior: "inline".to_string(),
+            overlay_width: 360,
+            overlay_position: "left".to_string(),
+            overlay_border_gap: 0,
             status_normal_color: "#ccccd8".to_string(),
             desktop_background: "#000000".to_string(),
             transparency_opacity: 0.9,
@@ -125,8 +125,8 @@ pub enum Action {
     SetViewport4,
     Expose,
     Minimize,
-    PinnedLeft,
-    PinnedRight,
+    OverlayLeft,
+    OverlayRight,
     ZoomIn,
     ZoomOut,
     ZoomReset,
@@ -340,14 +340,14 @@ pub struct LayoutConfig {
     pub border_blur: bool,
     #[serde(default = "default_window_blur")]
     pub window_blur: bool,
-    #[serde(default = "default_pinned_behavior", alias = "side_panel_behavior")]
-    pub pinned_behavior: String,
-    #[serde(default = "default_pinned_width", alias = "side_panel_width")]
-    pub pinned_width: i64,
-    #[serde(default = "default_pinned_position", alias = "side_panel_position")]
-    pub pinned_position: String,
-    #[serde(default = "default_pinned_border_gap", alias = "side_panel_border_gap")]
-    pub pinned_border_gap: i64,
+    #[serde(default = "default_overlay_behavior", alias = "pinned_behavior", alias = "side_panel_behavior")]
+    pub overlay_behavior: String,
+    #[serde(default = "default_overlay_width", alias = "pinned_width", alias = "side_panel_width")]
+    pub overlay_width: i64,
+    #[serde(default = "default_overlay_position", alias = "pinned_position", alias = "side_panel_position")]
+    pub overlay_position: String,
+    #[serde(default = "default_overlay_border_gap", alias = "pinned_border_gap", alias = "side_panel_border_gap")]
+    pub overlay_border_gap: i64,
     #[serde(default = "default_status_normal_color")]
     pub status_normal_color: String,
     #[serde(default = "default_window_opacity")]
@@ -376,10 +376,10 @@ impl Default for LayoutConfig {
             grid_gap: default_grid_gap(),
             border_blur: default_border_blur(),
             window_blur: default_window_blur(),
-            pinned_behavior: default_pinned_behavior(),
-            pinned_width: default_pinned_width(),
-            pinned_position: default_pinned_position(),
-            pinned_border_gap: default_pinned_border_gap(),
+            overlay_behavior: default_overlay_behavior(),
+            overlay_width: default_overlay_width(),
+            overlay_position: default_overlay_position(),
+            overlay_border_gap: default_overlay_border_gap(),
             status_normal_color: default_status_normal_color(),
             window_opacity: default_window_opacity(),
         }
@@ -405,10 +405,10 @@ fn default_transition_duration() -> i64 { 300 }
 fn default_grid_gap() -> i64 { 18 }
 fn default_border_blur() -> bool { false }
 fn default_window_blur() -> bool { false }
-fn default_pinned_behavior() -> String { "inline".to_string() }
-fn default_pinned_width() -> i64 { 360 }
-fn default_pinned_position() -> String { "left".to_string() }
-fn default_pinned_border_gap() -> i64 { 0 }
+fn default_overlay_behavior() -> String { "inline".to_string() }
+fn default_overlay_width() -> i64 { 360 }
+fn default_overlay_position() -> String { "left".to_string() }
+fn default_overlay_border_gap() -> i64 { 0 }
 fn default_status_normal_color() -> String { "#ccccd8".to_string() }
 fn default_window_opacity() -> bool { true }
 
@@ -483,7 +483,7 @@ pub fn parse_tiling_mode(s: &str) -> TilingMode {
         "grid" => TilingMode::Grid,
         "fullscreen" => TilingMode::Fullscreen,
         "popup" => TilingMode::Popup,
-        "sidepanel" | "side_panel" | "side-panel" | "pinned" => TilingMode::Pinned,
+        "sidepanel" | "side_panel" | "side-panel" | "pinned" | "overlay" => TilingMode::Overlay,
         "status" => TilingMode::Status,
         "maximized" => TilingMode::Maximized,
         _ => TilingMode::Cascade,
@@ -588,10 +588,10 @@ pub fn parse_action(s: &str) -> Action {
         Action::None
     } else if s == "expose" {
         Action::Expose
-    } else if s == "side-panel-left" || s == "pinned-left" {
-        Action::PinnedLeft
-    } else if s == "side-panel-right" || s == "pinned-right" {
-        Action::PinnedRight
+    } else if s == "side-panel-left" || s == "pinned-left" || s == "overlay-left" {
+        Action::OverlayLeft
+    } else if s == "side-panel-right" || s == "pinned-right" || s == "overlay-right" {
+        Action::OverlayRight
     } else if s == "zoom-in" {
         Action::ZoomIn
     } else if s == "zoom-out" {
@@ -750,10 +750,10 @@ pub fn parse_config(path: &str, state: &mut crate::window_manager::WindowManager
     state.layout.grid_gap = config.layout.grid_gap as i32;
     state.layout.border_blur = config.layout.border_blur;
     state.layout.window_blur = config.layout.window_blur;
-    state.layout.pinned_behavior = config.layout.pinned_behavior;
-    state.layout.pinned_width = config.layout.pinned_width as i32;
-    state.layout.pinned_position = config.layout.pinned_position;
-    state.layout.pinned_border_gap = config.layout.pinned_border_gap as i32;
+    state.layout.overlay_behavior = config.layout.overlay_behavior;
+    state.layout.overlay_width = config.layout.overlay_width as i32;
+    state.layout.overlay_position = config.layout.overlay_position;
+    state.layout.overlay_border_gap = config.layout.overlay_border_gap as i32;
     state.layout.status_normal_color = config.layout.status_normal_color.clone();
     state.layout.transparency_opacity = config.transparency.as_ref().and_then(|t| t.opacity).unwrap_or(0.9) as f32;
     state.layout.window_opacity = config.layout.window_opacity;
@@ -795,7 +795,7 @@ pub fn parse_config(path: &str, state: &mut crate::window_manager::WindowManager
         state.keybinds.push(Keybind {
             mods: super_mod,
             keysym: left_sym,
-            action: Action::PinnedLeft,
+            action: Action::OverlayLeft,
             command: None,
         });
     }
@@ -803,7 +803,7 @@ pub fn parse_config(path: &str, state: &mut crate::window_manager::WindowManager
         state.keybinds.push(Keybind {
             mods: super_mod,
             keysym: right_sym,
-            action: Action::PinnedRight,
+            action: Action::OverlayRight,
             command: None,
         });
     }
diff --git a/src/server/cursor.rs b/src/server/cursor.rs
index eed5ae5..5d77bd7 100644
--- a/src/server/cursor.rs
+++ b/src/server/cursor.rs
@@ -577,11 +577,15 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
     let server = seat.server;
 
     let mut is_app_surface = false;
+    let mut is_overlay_window = false;
     if let Some(result) = (*server).scene.at(lx, ly) {
         match result.data {
             SceneNodeDataVal::Window(window) => {
                 if !(*window).is_status_bar() {
                     is_app_surface = true;
+                    if (*window).tiling_mode == crate::tiling::TilingMode::Overlay {
+                        is_overlay_window = true;
+                    }
                 }
             }
             SceneNodeDataVal::ShellSurface(_) | SceneNodeDataVal::OverrideRedirect(_) => {
@@ -590,7 +594,7 @@ unsafe extern "C" fn handle_button(listener: *mut ffi::wl_listener, data: *mut s
             _ => {}
         }
     }
-    let should_block_button = (*(*seat).server).wm.mode == crate::window_manager::WindowManagerMode::Overview && is_app_surface;
+    let should_block_button = (*(*seat).server).wm.mode == crate::window_manager::WindowManagerMode::Overview && is_app_surface && !is_overlay_window;
     
     if (*event).state == ffi::wl_pointer_button_state_WL_POINTER_BUTTON_STATE_PRESSED {
         if cursor.pressed.contains_key(&(*event).button) {
@@ -667,7 +671,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::Overlay
                 {
                     if (*target_win).was_maximized {
                         (*target_win).box_geom.width = (*target_win).saved_maximized_width;
@@ -812,7 +816,7 @@ 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
-                            && initial_mode != crate::tiling::TilingMode::Pinned
+                            && initial_mode != crate::tiling::TilingMode::Overlay
                         {
                             if (*border_target_win).was_maximized {
                                 (*border_target_win).box_geom.width = (*border_target_win).saved_maximized_width;
@@ -1251,10 +1255,14 @@ unsafe extern "C" fn handle_touch_down(listener: *mut ffi::wl_listener, data: *m
         }
         
         let mut is_app_surface = false;
+        let mut is_overlay_window = false;
         match result.data {
             SceneNodeDataVal::Window(window) => {
                 if !(*window).is_status_bar() {
                     is_app_surface = true;
+                    if (*window).tiling_mode == crate::tiling::TilingMode::Overlay {
+                        is_overlay_window = true;
+                    }
                 }
             }
             SceneNodeDataVal::ShellSurface(_) | SceneNodeDataVal::OverrideRedirect(_) => {
@@ -1262,7 +1270,7 @@ unsafe extern "C" fn handle_touch_down(listener: *mut ffi::wl_listener, data: *m
             }
             _ => {}
         }
-        let should_block_touch = (*(*seat).server).wm.mode == crate::window_manager::WindowManagerMode::Overview && is_app_surface;
+        let should_block_touch = (*(*seat).server).wm.mode == crate::window_manager::WindowManagerMode::Overview && is_app_surface && !is_overlay_window;
 
         if !result.surface.is_null() && !should_block_touch {
             ffi::wlr_seat_touch_notify_down(
@@ -1304,10 +1312,14 @@ unsafe extern "C" fn handle_touch_motion(listener: *mut ffi::wl_listener, data:
         let server = seat.server;
         if let Some(result) = (*server).scene.at(lx, ly) {
             let mut is_app_surface = false;
+            let mut is_overlay_window = false;
             match result.data {
                 SceneNodeDataVal::Window(window) => {
                     if !(*window).is_status_bar() {
                         is_app_surface = true;
+                        if (*window).tiling_mode == crate::tiling::TilingMode::Overlay {
+                            is_overlay_window = true;
+                        }
                     }
                 }
                 SceneNodeDataVal::ShellSurface(_) | SceneNodeDataVal::OverrideRedirect(_) => {
@@ -1315,7 +1327,7 @@ unsafe extern "C" fn handle_touch_motion(listener: *mut ffi::wl_listener, data:
                 }
                 _ => {}
             }
-            let should_block_touch = (*(*seat).server).wm.mode == crate::window_manager::WindowManagerMode::Overview && is_app_surface;
+            let should_block_touch = (*(*seat).server).wm.mode == crate::window_manager::WindowManagerMode::Overview && is_app_surface && !is_overlay_window;
 
             if !should_block_touch {
                 ffi::wlr_seat_touch_notify_motion(
@@ -1340,11 +1352,15 @@ unsafe extern "C" fn handle_touch_up(listener: *mut ffi::wl_listener, data: *mut
     if let Some((lx, ly)) = cursor.touch_points.remove(&(*event).touch_id) {
         let server = seat.server;
         let mut is_app_surface = false;
+        let mut is_overlay_window = false;
         if let Some(result) = (*server).scene.at(lx, ly) {
             match result.data {
                 SceneNodeDataVal::Window(window) => {
                     if !(*window).is_status_bar() {
                         is_app_surface = true;
+                        if (*window).tiling_mode == crate::tiling::TilingMode::Overlay {
+                            is_overlay_window = true;
+                        }
                     }
                 }
                 SceneNodeDataVal::ShellSurface(_) | SceneNodeDataVal::OverrideRedirect(_) => {
@@ -1353,7 +1369,7 @@ unsafe extern "C" fn handle_touch_up(listener: *mut ffi::wl_listener, data: *mut
                 _ => {}
             }
         }
-        let should_block_touch = (*(*seat).server).wm.mode == crate::window_manager::WindowManagerMode::Overview && is_app_surface;
+        let should_block_touch = (*(*seat).server).wm.mode == crate::window_manager::WindowManagerMode::Overview && is_app_surface && !is_overlay_window;
 
         if !should_block_touch {
             ffi::wlr_seat_touch_notify_up(
diff --git a/src/server/keyboard_group.rs b/src/server/keyboard_group.rs
index fb1fffb..7c0b6d5 100644
--- a/src/server/keyboard_group.rs
+++ b/src/server/keyboard_group.rs
@@ -441,7 +441,18 @@ unsafe extern "C" fn handle_group_key(listener: *mut ffi::wl_listener, data: *mu
             }
         }
         KeyConsumer::Focus => {
+            let is_overlay_mode = if let crate::seat::Focus::Window(fw) = (*group.seat).focused {
+                if !fw.is_null() {
+                    (*fw).tiling_mode == crate::tiling::TilingMode::Overlay
+                } else {
+                    false
+                }
+            } else {
+                false
+            };
+
             if (*(*group.seat).server).wm.mode != crate::window_manager::WindowManagerMode::Overview
+                || is_overlay_mode
                 || (*event).state == ffi::wl_keyboard_key_state_WL_KEYBOARD_KEY_STATE_RELEASED
             {
                 ffi::wlr_seat_set_keyboard((*group.seat).wlr_seat, &mut group.wlr_keyboard);
diff --git a/src/server/seat.rs b/src/server/seat.rs
index 152f07d..a4458b4 100644
--- a/src/server/seat.rs
+++ b/src/server/seat.rs
@@ -946,7 +946,7 @@ impl Seat {
             let win = op.window_ptr;
             if !win.is_null() && !(*win).closed {
                 if (*win).tiling_mode != crate::tiling::TilingMode::Floating
-                    && (*win).tiling_mode != crate::tiling::TilingMode::Pinned
+                    && (*win).tiling_mode != crate::tiling::TilingMode::Overlay
                 {
                     (*win).tiling_mode = crate::tiling::TilingMode::Floating;
                     (*win).mode_locked = true;
@@ -1084,7 +1084,7 @@ impl Seat {
                     (*self.server).wm.dirty_windowing();
                 }
                 if let PointerOpType::Move = op.op_type {
-                    if (*win).tiling_mode == crate::tiling::TilingMode::Pinned {
+                    if (*win).tiling_mode == crate::tiling::TilingMode::Overlay {
                         (*self.server).wm.dirty_windowing();
                     }
                 }
diff --git a/src/server/tiling.rs b/src/server/tiling.rs
index cb3e799..043e6f8 100644
--- a/src/server/tiling.rs
+++ b/src/server/tiling.rs
@@ -7,7 +7,7 @@ pub enum TilingMode {
     Grid,
     Fullscreen,
     Popup,
-    Pinned,
+    Overlay,
     Status,
     Maximized,
 }
@@ -20,7 +20,7 @@ impl TilingMode {
             TilingMode::Grid => "Grid",
             TilingMode::Fullscreen => "Fullscreen",
             TilingMode::Popup => "Popup",
-            TilingMode::Pinned => "Pinned",
+            TilingMode::Overlay => "Overlay",
             TilingMode::Status => "Status",
             TilingMode::Maximized => "Maximized",
         }
diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index e9f35c0..ab8369b 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -693,7 +693,7 @@ impl WindowManager {
         self.keep_status_bar_on_top();
 
         let mut hasher = std::collections::hash_map::DefaultHasher::new();
-        self.layout.pinned_behavior.hash(&mut hasher);
+        self.layout.overlay_behavior.hash(&mut hasher);
         let render_list = &mut self.rendering_requested.list as *mut ffi::wl_list as *mut WlList;
         let mut curr = (*render_list).next;
         while curr != render_list {
@@ -741,7 +741,7 @@ impl WindowManager {
                             } else if (*window).rendering_requested.circular {
                                 ffi::wlr_scene_node_reparent((*window).tree as *mut _, (*self.server).scene.layers.top);
                                 ffi::wlr_scene_node_raise_to_top((*window).tree as *mut _);
-                            } else if (*window).tiling_mode == crate::tiling::TilingMode::Pinned && self.layout.pinned_behavior == "above" {
+                            } else if (*window).tiling_mode == crate::tiling::TilingMode::Overlay && self.layout.overlay_behavior == "above" {
                                 ffi::wlr_scene_node_reparent((*window).tree as *mut _, (*self.server).scene.layers.top);
                                 ffi::wlr_scene_node_raise_to_top((*window).tree as *mut _);
                             } else {
@@ -827,6 +827,9 @@ impl WindowManager {
         if app_id.as_deref() == Some("cce-notification-daemon") || app_id.as_deref() == Some("clear-notification-daemon") {
             return crate::tiling::TilingMode::Popup;
         }
+        if app_id.as_deref() == Some("cce-cloud") {
+            return crate::tiling::TilingMode::Overlay;
+        }
 
 
 
@@ -982,7 +985,7 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
             let camera_center_y = self.desk_pan_y + (viewport_h / 2.0) / self.desk_zoom;
             let _active_tag = Self::get_closest_tag(camera_center_x, camera_center_y);
 
-            let mut pinned_windows: Vec<*mut Window> = Vec::new();
+            let mut overlay_windows: Vec<*mut Window> = Vec::new();
             let mut normal_windows: Vec<*mut Window> = Vec::new();
 
             for &win_ptr in self.windows.iter() {
@@ -1038,8 +1041,8 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
                 }
 
                 let is_moving = self.is_window_being_moved(win_ptr);
-                if mode == crate::tiling::TilingMode::Pinned && !is_moving {
-                    pinned_windows.push(win_ptr);
+                if mode == crate::tiling::TilingMode::Overlay && !is_moving {
+                    overlay_windows.push(win_ptr);
                 } else {
                     normal_windows.push(win_ptr);
                 }
@@ -1047,9 +1050,9 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
 
             let bw = self.layout.border_width;
 
-            let g = self.layout.pinned_border_gap;
+            let g = self.layout.overlay_border_gap;
             let dec_h = std::cmp::max(bw, 16);
-            for (sp_idx, &win_ptr) in pinned_windows.iter().enumerate() {
+            for (sp_idx, &win_ptr) in overlay_windows.iter().enumerate() {
                 if sp_idx == 0 {
                     let mut sp_x = (*win_ptr).box_geom.x;
                     let mut sp_y = (*win_ptr).box_geom.y;
@@ -1058,13 +1061,13 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
 
                     if sp_w == 0 || sp_h == 0 {
                         sp_w = if (*win_ptr).wm_scheduled.dimensions_hint.min_width > 32 {
-                            std::cmp::max(self.layout.pinned_width, (*win_ptr).wm_scheduled.dimensions_hint.min_width as i32)
+                            std::cmp::max(self.layout.overlay_width, (*win_ptr).wm_scheduled.dimensions_hint.min_width as i32)
                         } else {
-                            self.layout.pinned_width
+                            self.layout.overlay_width
                         };
                         sp_h = (usable_h - (dec_h + bw) - 2 * g).max(1);
 
-                        sp_x = if self.layout.pinned_position == "right" {
+                        sp_x = if self.layout.overlay_position == "right" {
                             usable_x + usable_w - sp_w - g + bw
                         } else {
                             usable_x + g + bw
@@ -1832,12 +1835,12 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
                 }
                 self.dirty_windowing();
             }
-            Action::PinnedLeft => {
-                self.layout.pinned_position = "left".to_string();
+            Action::OverlayLeft => {
+                self.layout.overlay_position = "left".to_string();
                 self.dirty_windowing();
             }
-            Action::PinnedRight => {
-                self.layout.pinned_position = "right".to_string();
+            Action::OverlayRight => {
+                self.layout.overlay_position = "right".to_string();
                 self.dirty_windowing();
             }
             Action::Expose => {
@@ -1904,7 +1907,7 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
                         }
 
                         let mode = self.get_mode_for_window(win_ptr);
-                        if mode == crate::tiling::TilingMode::Popup || mode == crate::tiling::TilingMode::Pinned {
+                        if mode == crate::tiling::TilingMode::Popup || mode == crate::tiling::TilingMode::Overlay {
                             continue;
                         }
 
@@ -2312,10 +2315,10 @@ fn get_closest_tag(x: f64, y: f64) -> i32 {
                         self.layout.border_g = ((border_color_val >> 8) & 0xFF) * 0x01010101;
                         self.layout.border_b = (border_color_val & 0xFF) * 0x01010101;
                     }
-                    "side_panel_width" | "pinned_width" => { if let Ok(v) = val.parse::<i32>() { self.layout.pinned_width = v; } }
-                    "side_panel_behavior" | "pinned_behavior" => { self.layout.pinned_behavior = val.to_string(); }
-                    "side_panel_position" | "pinned_position" => { self.layout.pinned_position = val.to_string(); }
-                    "side_panel_border_gap" | "pinned_border_gap" => { if let Ok(v) = val.parse::<i32>() { self.layout.pinned_border_gap = v; } }
+                    "side_panel_width" | "pinned_width" | "overlay_width" => { if let Ok(v) = val.parse::<i32>() { self.layout.overlay_width = v; } }
+                    "side_panel_behavior" | "pinned_behavior" | "overlay_behavior" => { self.layout.overlay_behavior = val.to_string(); }
+                    "side_panel_position" | "pinned_position" | "overlay_position" => { self.layout.overlay_position = val.to_string(); }
+                    "side_panel_border_gap" | "pinned_border_gap" | "overlay_border_gap" => { if let Ok(v) = val.parse::<i32>() { self.layout.overlay_border_gap = v; } }
                     _ => return format!("error: unknown layout key: {}\n", key),
                 }
                 self.dirty_windowing();
diff --git a/src/server/xdg_toplevel.rs b/src/server/xdg_toplevel.rs
index 57d93c0..99cbdce 100644
--- a/src/server/xdg_toplevel.rs
+++ b/src/server/xdg_toplevel.rs
@@ -643,7 +643,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
+            && initial_mode != crate::tiling::TilingMode::Overlay
         {
             (*window).tiling_mode = crate::tiling::TilingMode::Floating;
             (*window).mode_locked = true;