diff --git a/komorebi/src/lib.rs b/komorebi/src/lib.rs index 485dc036..230dd2bc 100644 --- a/komorebi/src/lib.rs +++ b/komorebi/src/lib.rs @@ -242,7 +242,9 @@ lazy_static! { pub static DEFAULT_WORKSPACE_PADDING: AtomicI32 = AtomicI32::new(10); pub static DEFAULT_CONTAINER_PADDING: AtomicI32 = AtomicI32::new(10); +pub static DEFAULT_RESIZE_DELTA: i32 = 50; +pub static DEFAULT_MOUSE_FOLLOWS_FOCUS: bool = true; pub static INITIAL_CONFIGURATION_LOADED: AtomicBool = AtomicBool::new(false); pub static CUSTOM_FFM: AtomicBool = AtomicBool::new(false); pub static SESSION_ID: AtomicU32 = AtomicU32::new(0); diff --git a/komorebi/src/static_config.rs b/komorebi/src/static_config.rs index 889d6677..34981f51 100644 --- a/komorebi/src/static_config.rs +++ b/komorebi/src/static_config.rs @@ -3,6 +3,8 @@ use crate::Axis; use crate::CrossBoundaryBehaviour; use crate::DATA_DIR; use crate::DEFAULT_CONTAINER_PADDING; +use crate::DEFAULT_MOUSE_FOLLOWS_FOCUS; +use crate::DEFAULT_RESIZE_DELTA; use crate::DEFAULT_WORKSPACE_PADDING; use crate::DISPLAY_INDEX_PREFERENCES; use crate::FLOATING_APPLICATIONS; @@ -106,25 +108,6 @@ use std::sync::atomic::Ordering; use uds_windows::UnixListener; use uds_windows::UnixStream; -mod defaults { - pub const RESIZE_DELTA: i32 = 50; - pub const BORDER_WIDTH: i32 = 8; - pub const BORDER_OFFSET: i32 = -1; - pub const BORDER_ENABLED: bool = true; - pub const TRANSPARENCY_ENABLED: bool = false; - pub const TRANSPARENCY_ALPHA: u8 = 200; - pub const DEFAULT_WORKSPACE_PADDING: i32 = 10; - pub const DEFAULT_CONTAINER_PADDING: i32 = 10; - pub const MOUSE_FOLLOWS_FOCUS: bool = true; - pub const FLOAT_OVERRIDE: bool = false; - pub const TILE: bool = true; - pub const APPLY_WINDOW_BASED_WORK_AREA_OFFSET: bool = true; - pub const WINDOW_BASED_WORK_AREA_OFFSET_LIMIT: isize = 1; - pub const GENERATE_THEME: bool = true; - pub const ANIMATION_FPS: u64 = 60; - pub const SLOW_APPLICATION_COMPENSATION_TIME: u64 = 20; -} - #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] /// Border colours for different container states @@ -209,7 +192,7 @@ pub struct Wallpaper { pub path: PathBuf, /// Generate and apply Base16 theme for this wallpaper #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::GENERATE_THEME)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = true)))] pub generate_theme: Option, /// Specify Light or Dark variant for theme generation #[serde(skip_serializing_if = "Option::is_none")] @@ -262,7 +245,7 @@ pub struct WorkspaceConfig { pub work_area_offset: Option, /// Apply this monitor's window-based work area offset #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::APPLY_WINDOW_BASED_WORK_AREA_OFFSET)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = true)))] pub apply_window_based_work_area_offset: Option, /// Determine what happens when a new window is opened #[serde(skip_serializing_if = "Option::is_none")] @@ -273,11 +256,11 @@ pub struct WorkspaceConfig { pub window_container_behaviour_rules: Option>, /// Enable or disable float override, which makes it so every new window opens in floating mode #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::FLOAT_OVERRIDE)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = false)))] pub float_override: Option, /// Enable or disable tiling for the workspace #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::TILE)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = true)))] pub tile: Option, /// Specify an axis on which to flip the selected layout #[serde(skip_serializing_if = "Option::is_none")] @@ -391,7 +374,7 @@ pub struct MonitorConfig { pub window_based_work_area_offset: Option, /// Open window limit after which the window based work area offset will no longer be applied #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::WINDOW_BASED_WORK_AREA_OFFSET_LIMIT)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = 1)))] pub window_based_work_area_offset_limit: Option, /// Container padding (default: global) #[serde(skip_serializing_if = "Option::is_none")] @@ -476,7 +459,7 @@ pub struct StaticConfig { pub minimum_window_height: Option, /// Delta to resize windows by #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::RESIZE_DELTA)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = DEFAULT_RESIZE_DELTA)))] pub resize_delta: Option, /// Determine what happens when a new window is opened #[serde(skip_serializing_if = "Option::is_none")] @@ -484,7 +467,7 @@ pub struct StaticConfig { pub window_container_behaviour: Option, /// Enable or disable float override, which makes it so every new window opens in floating mode #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::FLOAT_OVERRIDE)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = false)))] pub float_override: Option, /// Determines what happens on a new window when on the `FloatingLayer` #[serde(skip_serializing_if = "Option::is_none")] @@ -526,7 +509,7 @@ pub struct StaticConfig { pub focus_follows_mouse: Option, /// Enable or disable mouse follows focus #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::MOUSE_FOLLOWS_FOCUS)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = DEFAULT_MOUSE_FOLLOWS_FOCUS)))] pub mouse_follows_focus: Option, /// Path to applications.json from komorebi-application-specific-configurations #[serde(skip_serializing_if = "Option::is_none")] @@ -534,17 +517,17 @@ pub struct StaticConfig { /// Width of window borders #[serde(skip_serializing_if = "Option::is_none")] #[serde(alias = "active_window_border_width")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::BORDER_WIDTH)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = border_manager::BORDER_WIDTH)))] pub border_width: Option, /// Offset of window borders #[serde(skip_serializing_if = "Option::is_none")] #[serde(alias = "active_window_border_offset")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::BORDER_OFFSET)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = border_manager::BORDER_OFFSET)))] pub border_offset: Option, /// Display window borders #[serde(skip_serializing_if = "Option::is_none")] #[serde(alias = "active_window_border")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::BORDER_ENABLED)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = border_manager::BORDER_ENABLED)))] pub border: Option, /// Window border colours for different container types (has no effect if [`theme`] is defined) #[serde(skip_serializing_if = "Option::is_none")] @@ -565,22 +548,22 @@ pub struct StaticConfig { pub border_implementation: Option, /// Add transparency to unfocused windows #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::TRANSPARENCY_ENABLED)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = transparency_manager::TRANSPARENCY_ENABLED)))] pub transparency: Option, /// Alpha value for unfocused window transparency [[0-255]] #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::TRANSPARENCY_ALPHA)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = transparency_manager::TRANSPARENCY_ALPHA)))] pub transparency_alpha: Option, /// Individual window transparency ignore rules #[serde(skip_serializing_if = "Option::is_none")] pub transparency_ignore_rules: Option>, /// Global default workspace padding #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::DEFAULT_WORKSPACE_PADDING)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = DEFAULT_WORKSPACE_PADDING)))] pub default_workspace_padding: Option, /// Global default container padding #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::DEFAULT_CONTAINER_PADDING)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = DEFAULT_CONTAINER_PADDING)))] pub default_container_padding: Option, /// Monitor and workspace configurations #[serde(skip_serializing_if = "Option::is_none")] @@ -639,7 +622,7 @@ pub struct StaticConfig { pub slow_application_identifiers: Option>, /// How long to wait when compensating for slow applications, in milliseconds #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::SLOW_APPLICATION_COMPENSATION_TIME)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = SLOW_APPLICATION_COMPENSATION_TIME)))] pub slow_application_compensation_time: Option, /// Komorebi status bar configuration files for multiple instances on different monitors // this option is a little special because it is only consumed by komorebic @@ -675,7 +658,7 @@ pub struct AnimationsConfig { pub style: Option>, /// Set the animation FPS #[serde(skip_serializing_if = "Option::is_none")] - #[cfg_attr(feature = "schemars", schemars(extend("default" = defaults::ANIMATION_FPS)))] + #[cfg_attr(feature = "schemars", schemars(extend("default" = ANIMATION_FPS)))] pub fps: Option, } @@ -1006,18 +989,17 @@ impl StaticConfig { DEFAULT_WORKSPACE_PADDING.store(workspace, Ordering::SeqCst); } - border_manager::BORDER_WIDTH.store( - self.border_width.unwrap_or(defaults::BORDER_WIDTH), - Ordering::SeqCst, - ); - border_manager::BORDER_OFFSET.store( - self.border_offset.unwrap_or(defaults::BORDER_OFFSET), - Ordering::SeqCst, - ); - border_manager::BORDER_ENABLED.store( - self.border.unwrap_or(defaults::BORDER_ENABLED), - Ordering::SeqCst, - ); + if let Some(border_width) = self.border_width { + border_manager::BORDER_WIDTH.store(border_width, Ordering::SeqCst); + } + + if let Some(border_offset) = self.border_offset { + border_manager::BORDER_OFFSET.store(border_offset, Ordering::SeqCst); + } + + if let Some(border_enabled) = self.border { + border_manager::BORDER_ENABLED.store(border_enabled, Ordering::SeqCst); + } if let Some(colours) = &self.border_colours { if let Some(single) = colours.single { @@ -1071,15 +1053,14 @@ impl StaticConfig { border_manager::send_notification(None); } - transparency_manager::TRANSPARENCY_ENABLED.store( - self.transparency.unwrap_or(defaults::TRANSPARENCY_ENABLED), - Ordering::SeqCst, - ); - transparency_manager::TRANSPARENCY_ALPHA.store( - self.transparency_alpha - .unwrap_or(defaults::TRANSPARENCY_ALPHA), - Ordering::SeqCst, - ); + if let Some(transparency_enabled) = self.transparency { + transparency_manager::TRANSPARENCY_ENABLED + .store(transparency_enabled, Ordering::SeqCst); + } + + if let Some(transparency_alpha) = self.transparency_alpha { + transparency_manager::TRANSPARENCY_ALPHA.store(transparency_alpha, Ordering::SeqCst); + } let mut ignore_identifiers = IGNORE_IDENTIFIERS.lock(); let mut regex_identifiers = REGEX_IDENTIFIERS.lock(); @@ -1303,12 +1284,12 @@ impl StaticConfig { unmanaged_window_operation_behaviour: value .unmanaged_window_operation_behaviour .unwrap_or(OperationBehaviour::Op), - resize_delta: value.resize_delta.unwrap_or(defaults::RESIZE_DELTA), + resize_delta: value.resize_delta.unwrap_or(DEFAULT_RESIZE_DELTA), #[allow(deprecated)] focus_follows_mouse: value.focus_follows_mouse, mouse_follows_focus: value .mouse_follows_focus - .unwrap_or(defaults::MOUSE_FOLLOWS_FOCUS), + .unwrap_or(DEFAULT_MOUSE_FOLLOWS_FOCUS), hotwatch: Hotwatch::new()?, has_pending_raise_op: false, pending_move_op: Arc::new(None), @@ -1398,7 +1379,7 @@ impl StaticConfig { monitor_config.window_based_work_area_offset; monitor.window_based_work_area_offset_limit = monitor_config .window_based_work_area_offset_limit - .unwrap_or(defaults::WINDOW_BASED_WORK_AREA_OFFSET_LIMIT); + .unwrap_or(1); monitor.container_padding = monitor_config.container_padding; monitor.workspace_padding = monitor_config.workspace_padding; monitor.wallpaper = monitor_config.wallpaper.clone(); @@ -1490,7 +1471,7 @@ impl StaticConfig { m.window_based_work_area_offset = monitor_config.window_based_work_area_offset; m.window_based_work_area_offset_limit = monitor_config .window_based_work_area_offset_limit - .unwrap_or(defaults::WINDOW_BASED_WORK_AREA_OFFSET_LIMIT); + .unwrap_or(1); m.container_padding = monitor_config.container_padding; m.workspace_padding = monitor_config.workspace_padding; m.floating_layer_behaviour = monitor_config.floating_layer_behaviour; @@ -1571,7 +1552,7 @@ impl StaticConfig { monitor_config.window_based_work_area_offset; monitor.window_based_work_area_offset_limit = monitor_config .window_based_work_area_offset_limit - .unwrap_or(defaults::WINDOW_BASED_WORK_AREA_OFFSET_LIMIT); + .unwrap_or(1); monitor.container_padding = monitor_config.container_padding; monitor.workspace_padding = monitor_config.workspace_padding; monitor.wallpaper = monitor_config.wallpaper.clone(); @@ -1655,7 +1636,7 @@ impl StaticConfig { m.window_based_work_area_offset = monitor_config.window_based_work_area_offset; m.window_based_work_area_offset_limit = monitor_config .window_based_work_area_offset_limit - .unwrap_or(defaults::WINDOW_BASED_WORK_AREA_OFFSET_LIMIT); + .unwrap_or(1); m.container_padding = monitor_config.container_padding; m.workspace_padding = monitor_config.workspace_padding; m.floating_layer_behaviour = monitor_config.floating_layer_behaviour; @@ -1675,10 +1656,10 @@ impl StaticConfig { wm.enforce_workspace_rules()?; - border_manager::BORDER_ENABLED.store( - value.border.unwrap_or(defaults::BORDER_ENABLED), - Ordering::SeqCst, - ); + if let Some(border_enabled) = value.border { + border_manager::BORDER_ENABLED.store(border_enabled, Ordering::SeqCst); + } + wm.window_management_behaviour.current_behaviour = value.window_container_behaviour.unwrap_or_default(); wm.window_management_behaviour.float_override = value.float_override.unwrap_or_default(); @@ -1698,10 +1679,10 @@ impl StaticConfig { wm.unmanaged_window_operation_behaviour = value .unmanaged_window_operation_behaviour .unwrap_or_default(); - wm.resize_delta = value.resize_delta.unwrap_or(defaults::RESIZE_DELTA); + wm.resize_delta = value.resize_delta.unwrap_or(DEFAULT_RESIZE_DELTA); wm.mouse_follows_focus = value .mouse_follows_focus - .unwrap_or(defaults::MOUSE_FOLLOWS_FOCUS); + .unwrap_or(DEFAULT_MOUSE_FOLLOWS_FOCUS); wm.work_area_offset = value.global_work_area_offset; #[allow(deprecated)] { diff --git a/schema.bar.json b/schema.bar.json index f73ba43c..df4ab75f 100644 --- a/schema.bar.json +++ b/schema.bar.json @@ -2490,47 +2490,47 @@ "description": "A predefined komorebi layout", "oneOf": [ { - "description": "BSP Layout\n\n```\n+-------+-----+\n| | |\n| +--+--+\n| | |--|\n+-------+--+--+\n```", + "description": "BSP Layout\n\n```text\n+-------+-----+\n| | |\n| +--+--+\n| | |--|\n+-------+--+--+\n```", "type": "string", "const": "BSP" }, { - "description": "Columns Layout\n\n```\n+--+--+--+--+\n| | | | |\n| | | | |\n| | | | |\n+--+--+--+--+\n```", + "description": "Columns Layout\n\n```text\n+--+--+--+--+\n| | | | |\n| | | | |\n| | | | |\n+--+--+--+--+\n```", "type": "string", "const": "Columns" }, { - "description": "Rows Layout\n\n```\n+-----------+\n|-----------|\n|-----------|\n|-----------|\n+-----------+\n```", + "description": "Rows Layout\n\n```text\n+-----------+\n|-----------|\n|-----------|\n|-----------|\n+-----------+\n```", "type": "string", "const": "Rows" }, { - "description": "Vertical Stack Layout\n\n```\n+-------+-----+\n| | |\n| +-----+\n| | |\n+-------+-----+\n```", + "description": "Vertical Stack Layout\n\n```text\n+-------+-----+\n| | |\n| +-----+\n| | |\n+-------+-----+\n```", "type": "string", "const": "VerticalStack" }, { - "description": "Horizontal Stack Layout\n\n```\n+------+------+\n| |\n|------+------+\n| | |\n+------+------+\n```", + "description": "Horizontal Stack Layout\n\n```text\n+------+------+\n| |\n|------+------+\n| | |\n+------+------+\n```", "type": "string", "const": "HorizontalStack" }, { - "description": "Ultrawide Vertical Stack Layout\n\n```\n+-----+-----------+-----+\n| | | |\n| | +-----+\n| | | |\n| | +-----+\n| | | |\n+-----+-----------+-----+\n```", + "description": "Ultrawide Vertical Stack Layout\n\n```text\n+-----+-----------+-----+\n| | | |\n| | +-----+\n| | | |\n| | +-----+\n| | | |\n+-----+-----------+-----+\n```", "type": "string", "const": "UltrawideVerticalStack" }, { - "description": "Grid Layout\n\n```\n+-----+-----+ +---+---+---+ +---+---+---+ +---+---+---+\n| | | | | | | | | | | | | | |\n| | | | | | | | | | | | | +---+\n+-----+-----+ | +---+---+ +---+---+---+ +---+---| |\n| | | | | | | | | | | | | +---+\n| | | | | | | | | | | | | | |\n+-----+-----+ +---+---+---+ +---+---+---+ +---+---+---+\n 4 windows 5 windows 6 windows 7 windows\n```", + "description": "Grid Layout\n\n```text\n+-----+-----+ +---+---+---+ +---+---+---+ +---+---+---+\n| | | | | | | | | | | | | | |\n| | | | | | | | | | | | | +---+\n+-----+-----+ | +---+---+ +---+---+---+ +---+---| |\n| | | | | | | | | | | | | +---+\n| | | | | | | | | | | | | | |\n+-----+-----+ +---+---+---+ +---+---+---+ +---+---+---+\n 4 windows 5 windows 6 windows 7 windows\n```", "type": "string", "const": "Grid" }, { - "description": "Right Main Vertical Stack Layout\n\n```\n+-----+-------+\n| | |\n+-----+ |\n| | |\n+-----+-------+\n```", + "description": "Right Main Vertical Stack Layout\n\n```text\n+-----+-------+\n| | |\n+-----+ |\n| | |\n+-----+-------+\n```", "type": "string", "const": "RightMainVerticalStack" }, { - "description": "Scrolling Layout\n\n```\n+--+--+--+--+--+--+\n| | | |\n| | | |\n| | | |\n+--+--+--+--+--+--+\n```", + "description": "Scrolling Layout\n\n```text\n+--+--+--+--+--+--+\n| | | |\n| | | |\n| | | |\n+--+--+--+--+--+--+\n```", "type": "string", "const": "Scrolling" } diff --git a/schema.json b/schema.json index 94046143..97760954 100644 --- a/schema.json +++ b/schema.json @@ -2695,47 +2695,47 @@ "description": "A predefined komorebi layout", "oneOf": [ { - "description": "BSP Layout\n\n```\n+-------+-----+\n| | |\n| +--+--+\n| | |--|\n+-------+--+--+\n```", + "description": "BSP Layout\n\n```text\n+-------+-----+\n| | |\n| +--+--+\n| | |--|\n+-------+--+--+\n```", "type": "string", "const": "BSP" }, { - "description": "Columns Layout\n\n```\n+--+--+--+--+\n| | | | |\n| | | | |\n| | | | |\n+--+--+--+--+\n```", + "description": "Columns Layout\n\n```text\n+--+--+--+--+\n| | | | |\n| | | | |\n| | | | |\n+--+--+--+--+\n```", "type": "string", "const": "Columns" }, { - "description": "Rows Layout\n\n```\n+-----------+\n|-----------|\n|-----------|\n|-----------|\n+-----------+\n```", + "description": "Rows Layout\n\n```text\n+-----------+\n|-----------|\n|-----------|\n|-----------|\n+-----------+\n```", "type": "string", "const": "Rows" }, { - "description": "Vertical Stack Layout\n\n```\n+-------+-----+\n| | |\n| +-----+\n| | |\n+-------+-----+\n```", + "description": "Vertical Stack Layout\n\n```text\n+-------+-----+\n| | |\n| +-----+\n| | |\n+-------+-----+\n```", "type": "string", "const": "VerticalStack" }, { - "description": "Horizontal Stack Layout\n\n```\n+------+------+\n| |\n|------+------+\n| | |\n+------+------+\n```", + "description": "Horizontal Stack Layout\n\n```text\n+------+------+\n| |\n|------+------+\n| | |\n+------+------+\n```", "type": "string", "const": "HorizontalStack" }, { - "description": "Ultrawide Vertical Stack Layout\n\n```\n+-----+-----------+-----+\n| | | |\n| | +-----+\n| | | |\n| | +-----+\n| | | |\n+-----+-----------+-----+\n```", + "description": "Ultrawide Vertical Stack Layout\n\n```text\n+-----+-----------+-----+\n| | | |\n| | +-----+\n| | | |\n| | +-----+\n| | | |\n+-----+-----------+-----+\n```", "type": "string", "const": "UltrawideVerticalStack" }, { - "description": "Grid Layout\n\n```\n+-----+-----+ +---+---+---+ +---+---+---+ +---+---+---+\n| | | | | | | | | | | | | | |\n| | | | | | | | | | | | | +---+\n+-----+-----+ | +---+---+ +---+---+---+ +---+---| |\n| | | | | | | | | | | | | +---+\n| | | | | | | | | | | | | | |\n+-----+-----+ +---+---+---+ +---+---+---+ +---+---+---+\n 4 windows 5 windows 6 windows 7 windows\n```", + "description": "Grid Layout\n\n```text\n+-----+-----+ +---+---+---+ +---+---+---+ +---+---+---+\n| | | | | | | | | | | | | | |\n| | | | | | | | | | | | | +---+\n+-----+-----+ | +---+---+ +---+---+---+ +---+---| |\n| | | | | | | | | | | | | +---+\n| | | | | | | | | | | | | | |\n+-----+-----+ +---+---+---+ +---+---+---+ +---+---+---+\n 4 windows 5 windows 6 windows 7 windows\n```", "type": "string", "const": "Grid" }, { - "description": "Right Main Vertical Stack Layout\n\n```\n+-----+-------+\n| | |\n+-----+ |\n| | |\n+-----+-------+\n```", + "description": "Right Main Vertical Stack Layout\n\n```text\n+-----+-------+\n| | |\n+-----+ |\n| | |\n+-----+-------+\n```", "type": "string", "const": "RightMainVerticalStack" }, { - "description": "Scrolling Layout\n\n```\n+--+--+--+--+--+--+\n| | | |\n| | | |\n| | | |\n+--+--+--+--+--+--+\n```", + "description": "Scrolling Layout\n\n```text\n+--+--+--+--+--+--+\n| | | |\n| | | |\n| | | |\n+--+--+--+--+--+--+\n```", "type": "string", "const": "Scrolling" }