rmux-server 0.10.0

Tokio daemon and request dispatcher for the RMUX terminal multiplexer.
Documentation
use rmux_core::PaneGeometry;
use rmux_proto::{PaneTarget, RmuxError};

use super::mode_tree_model::ModeTreeClientState;
use crate::pane_terminals::{session_not_found, HandlerState};

pub(super) fn content_geometry(
    state: &HandlerState,
    mode: &ModeTreeClientState,
) -> Result<PaneGeometry, RmuxError> {
    let session = state
        .sessions
        .session(&mode.session_name)
        .ok_or_else(|| session_not_found(&mode.session_name))?;
    let status = crate::renderer::StatusGeometry::for_session(session, &state.options);
    let active_target = PaneTarget::with_window(
        session.name().clone(),
        session.active_window_index(),
        session.active_pane_index(),
    );
    let target = mode
        .host_pane
        .as_ref()
        .filter(|target| {
            target.session_name() == session.name()
                && target.window_index() == session.active_window_index()
        })
        .unwrap_or(&active_target);
    let pane = crate::mouse::pane_content_geometry_for_target(state, target)
        .or_else(|| crate::mouse::pane_content_geometry_for_target(state, &active_target))
        .unwrap_or_else(|| {
            PaneGeometry::new(0, 0, session.window().size().cols, status.content_rows())
        });
    let pane = crate::pane_visible_geometry::clip_pane_geometry(pane, status.content_rows());
    Ok(PaneGeometry::new(
        pane.x(),
        pane.y().saturating_add(status.content_y_offset()),
        pane.cols(),
        pane.rows(),
    ))
}