rmux-server 0.10.0

Tokio daemon and request dispatcher for the RMUX terminal multiplexer.
Documentation
use rmux_core::{Pane, PaneGeometry, Session, Window};
use rmux_proto::ResizePaneAdjustment;

use crate::pane_visible_geometry::{clip_pane_geometry, visible_pane_content_geometry};

use super::RuntimeFormatContext;

impl RuntimeFormatContext<'_> {
    pub(super) fn visible_session_snapshot(&self) -> Option<Session> {
        self.session.cloned()
    }

    pub(super) fn visible_window_snapshot(&self) -> Option<Window> {
        let session = self.visible_session_snapshot()?;
        let window_index = self
            .window_index
            .unwrap_or_else(|| session.active_window_index());
        session.window_at(window_index).cloned()
    }

    pub(super) fn layout_window_snapshot(&self) -> Option<Window> {
        let mut session = self.session?.clone();
        for window_index in session.windows().keys().copied().collect::<Vec<_>>() {
            let Some(active_pane_index) = session
                .window_at(window_index)
                .map(|window| (window.is_zoomed(), window.active_pane_index()))
                .and_then(|(zoomed, active_pane_index)| zoomed.then_some(active_pane_index))
            else {
                continue;
            };
            let _ = session.resize_pane_in_window(
                window_index,
                active_pane_index,
                ResizePaneAdjustment::Zoom,
            );
        }
        let window_index = self
            .window_index
            .unwrap_or_else(|| session.active_window_index());
        session.window_at(window_index).cloned()
    }

    pub(super) fn visible_pane_snapshot(&self) -> Option<Pane> {
        let session = self.visible_session_snapshot()?;
        let window_index = self
            .window_index
            .unwrap_or_else(|| session.active_window_index());
        let window = session.window_at(window_index)?;
        let pane_index = self
            .pane
            .map(Pane::index)
            .unwrap_or_else(|| window.active_pane_index());
        window.pane(pane_index).cloned()
    }

    pub(super) fn visible_pane_geometry(&self) -> Option<PaneGeometry> {
        let session = self.session?;
        let window = self.visible_window_snapshot()?;
        let window_index = self
            .window_index
            .unwrap_or_else(|| session.active_window_index());
        let content_rows = window.size().rows;
        let pane_index = self
            .pane
            .map(Pane::index)
            .unwrap_or_else(|| window.active_pane_index());
        if window.is_zoomed() && pane_index == window.active_pane_index() {
            let size = window.size();
            let geometry = PaneGeometry::new(0, 0, size.cols, size.rows);
            return Some(match self.option_store() {
                Some(options) => visible_pane_content_geometry(
                    options,
                    session.name(),
                    window_index,
                    geometry,
                    content_rows,
                ),
                None => clip_pane_geometry(geometry, content_rows),
            });
        }
        self.visible_pane_snapshot().map(|pane| {
            let geometry = pane.geometry();
            match self.option_store() {
                Some(options) => visible_pane_content_geometry(
                    options,
                    session.name(),
                    window_index,
                    geometry,
                    content_rows,
                ),
                None => clip_pane_geometry(geometry, content_rows),
            }
        })
    }
}