aboutsummaryrefslogtreecommitdiff
path: root/src/window
diff options
context:
space:
mode:
Diffstat (limited to 'src/window')
-rw-r--r--src/window/mod.rs24
-rw-r--r--src/window/unmapped.rs61
2 files changed, 85 insertions, 0 deletions
diff --git a/src/window/mod.rs b/src/window/mod.rs
new file mode 100644
index 00000000..fd494b42
--- /dev/null
+++ b/src/window/mod.rs
@@ -0,0 +1,24 @@
+use crate::layout::workspace::ColumnWidth;
+
+pub mod unmapped;
+pub use unmapped::{InitialConfigureState, Unmapped};
+
+/// Rules fully resolved for a window.
+#[derive(Debug, Default)]
+pub struct ResolvedWindowRules {
+ /// Default width for this window.
+ ///
+ /// - `None`: unset (global default should be used).
+ /// - `Some(None)`: set to empty (window picks its own width).
+ /// - `Some(Some(width))`: set to a particular width.
+ pub default_width: Option<Option<ColumnWidth>>,
+
+ /// Output to open this window on.
+ pub open_on_output: Option<String>,
+
+ /// Whether the window should open full-width.
+ pub open_maximized: Option<bool>,
+
+ /// Whether the window should open fullscreen.
+ pub open_fullscreen: Option<bool>,
+}
diff --git a/src/window/unmapped.rs b/src/window/unmapped.rs
new file mode 100644
index 00000000..51e37e07
--- /dev/null
+++ b/src/window/unmapped.rs
@@ -0,0 +1,61 @@
+use smithay::desktop::Window;
+use smithay::output::Output;
+
+use super::ResolvedWindowRules;
+use crate::layout::workspace::ColumnWidth;
+
+#[derive(Debug)]
+pub struct Unmapped {
+ pub window: Window,
+ pub state: InitialConfigureState,
+}
+
+#[derive(Debug)]
+pub enum InitialConfigureState {
+ /// The window has not been initially configured yet.
+ NotConfigured {
+ /// Whether the window requested to be fullscreened, and the requested output, if any.
+ wants_fullscreen: Option<Option<Output>>,
+ },
+ /// The window has been configured.
+ Configured {
+ /// Up-to-date rules.
+ ///
+ /// We start tracking window rules when sending the initial configure, since they don't
+ /// affect anything before that.
+ rules: ResolvedWindowRules,
+
+ /// Resolved default width for this window.
+ ///
+ /// `None` means that the window will pick its own width.
+ width: Option<ColumnWidth>,
+
+ /// Whether the window should open full-width.
+ is_full_width: bool,
+
+ /// Output to open this window on.
+ ///
+ /// This can be `None` in cases like:
+ ///
+ /// - There are no outputs connected.
+ /// - This is a dialog with a parent, and there was no explicit output set, so this dialog
+ /// should fetch the parent's current output again upon mapping.
+ output: Option<Output>,
+ },
+}
+
+impl Unmapped {
+ /// Wraps a newly created window that hasn't been initially configured yet.
+ pub fn new(window: Window) -> Self {
+ Self {
+ window,
+ state: InitialConfigureState::NotConfigured {
+ wants_fullscreen: None,
+ },
+ }
+ }
+
+ pub fn needs_initial_configure(&self) -> bool {
+ matches!(self.state, InitialConfigureState::NotConfigured { .. })
+ }
+}