Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
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;