rmux-server 0.1.1

Tokio daemon and request dispatcher for the RMUX terminal multiplexer.
Documentation
use rmux_core::{OptionStore, Session};
use rmux_proto::{OptionName, TerminalSize};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(in crate::renderer) struct StatusGeometry {
    pub(in crate::renderer) terminal_size: TerminalSize,
    pub(in crate::renderer) content_rows: u16,
    pub(in crate::renderer) content_y_offset: u16,
    pub(in crate::renderer) status_y: Option<u16>,
}

impl StatusGeometry {
    pub(in crate::renderer) fn for_session(session: &Session, options: &OptionStore) -> Self {
        let size = session.window().size();
        let status = options.resolve(Some(session.name()), OptionName::Status);
        if size.cols == 0 || size.rows == 0 || matches!(status, Some("off")) {
            return Self::without_status(size);
        }

        match options.resolve(Some(session.name()), OptionName::StatusPosition) {
            Some("top") => Self {
                terminal_size: size,
                content_rows: size.rows.saturating_sub(1),
                content_y_offset: 1,
                status_y: Some(0),
            },
            _ => Self {
                terminal_size: size,
                content_rows: size.rows.saturating_sub(1),
                content_y_offset: 0,
                status_y: Some(size.rows.saturating_sub(1)),
            },
        }
    }

    pub(in crate::renderer) const fn without_status(size: TerminalSize) -> Self {
        Self {
            terminal_size: size,
            content_rows: size.rows,
            content_y_offset: 0,
            status_y: None,
        }
    }

    pub(in crate::renderer) const fn content_size(self) -> TerminalSize {
        TerminalSize {
            cols: self.terminal_size.cols,
            rows: self.content_rows,
        }
    }
}