rmux-server 0.10.0

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

use crate::pane_scrollbar::{PaneScrollbarConfig, PaneScrollbarLayout};
use crate::pane_terminals::HandlerState;
use crate::pane_visible_geometry::visible_pane_content_geometry;

pub(crate) fn pane_content_geometry_for_target(
    state: &HandlerState,
    target: &PaneTarget,
) -> Option<PaneGeometry> {
    let session = state.sessions.session(target.session_name())?;
    let window = session.window_at(target.window_index())?;
    let pane = window.pane(target.pane_index())?;
    if window.is_zoomed()
        && window
            .active_pane()
            .is_none_or(|active| active.id() != pane.id())
    {
        return None;
    }
    let content_rows = window.size().rows;
    let alternate_on = state
        .pane_screen_state(target.session_name(), pane.id())
        .is_some_and(|screen| screen.alternate_on);
    let copy_mode_active = state
        .pane_copy_mode_summary(target.session_name(), pane.id())
        .is_some();

    Some(
        resolve_pane_scrollbar_layout(
            state,
            target.session_name(),
            target.window_index(),
            pane,
            content_rows,
            alternate_on,
            copy_mode_active,
        )
        .1
        .content,
    )
}

pub(super) fn resolve_pane_scrollbar_layout(
    state: &HandlerState,
    session_name: &SessionName,
    window_index: u32,
    pane: &rmux_core::Pane,
    content_rows: u16,
    alternate_on: bool,
    copy_mode_active: bool,
) -> (PaneScrollbarConfig, PaneScrollbarLayout) {
    let config =
        PaneScrollbarConfig::resolve(&state.options, session_name, window_index, pane.index());
    let pane_geometry = state
        .sessions
        .session(session_name)
        .and_then(|session| session.window_at(window_index))
        .filter(|window| window.is_zoomed())
        .map_or_else(
            || pane.geometry(),
            |window| PaneGeometry::new(0, 0, window.size().cols, content_rows),
        );
    let geometry = visible_pane_content_geometry(
        &state.options,
        session_name,
        window_index,
        pane_geometry,
        content_rows,
    );
    let layout = config.layout(geometry, alternate_on, copy_mode_active);
    (config, layout)
}