zellij-org/zellij · error · anyhow::Error

ToggleFullscreenByPaneId missing pane_id

Error message

ToggleFullscreenByPaneId missing pane_id

What it means

ToggleFullscreenByPaneId toggles focus-fullscreen mode for one specific pane; internally it maps to Action::ToggleFocusFullscreenByPaneId. The protobuf message ToggleFullscreenByPaneIdAction has one optional pane_id field that the internal Action requires. If pane_id is None, conversion fails with 'ToggleFullscreenByPaneId missing pane_id'.

Source

Thrown at zellij-utils/src/ipc/protobuf_conversion.rs:3031

                        .pane_id
                        .ok_or_else(|| anyhow!("ClearScreenByPaneId missing pane_id"))?
                        .try_into()?,
                })
            },
            ActionType::EditScrollbackByPaneId(a) => {
                Ok(crate::input::actions::Action::EditScrollbackByPaneId {
                    pane_id: a
                        .pane_id
                        .ok_or_else(|| anyhow!("EditScrollbackByPaneId missing pane_id"))?
                        .try_into()?,
                    ansi: a.ansi,
                })
            },
            ActionType::ToggleFullscreenByPaneId(a) => Ok(
                crate::input::actions::Action::ToggleFocusFullscreenByPaneId {
                    pane_id: a
                        .pane_id
                        .ok_or_else(|| anyhow!("ToggleFullscreenByPaneId missing pane_id"))?
                        .try_into()?,
                },
            ),
            ActionType::ToggleNoUiFullscreenByPaneId(a) => Ok(
                crate::input::actions::Action::ToggleFocusNoUiFullscreenByPaneId {
                    pane_id: a
                        .pane_id
                        .ok_or_else(|| anyhow!("ToggleNoUiFullscreenByPaneId missing pane_id"))?
                        .try_into()?,
                },
            ),
            ActionType::TogglePaneEmbedOrFloatingByPaneId(a) => Ok(
                crate::input::actions::Action::TogglePaneEmbedOrFloatingByPaneId {
                    pane_id: a
                        .pane_id
                        .ok_or_else(|| {
                            anyhow!("TogglePaneEmbedOrFloatingByPaneId missing pane_id")
                        })?

View on GitHub (pinned to 98a0837077)

Solutions

  1. Set pane_id: Some(PaneId { pane_type: Some(PaneType::Terminal(id)) }) before sending.
  2. Use the plain ToggleFocusFullscreen action for the focused pane.
  3. Reject the send when the pane lookup returns None instead of forwarding an incomplete message.
  4. Align client and server versions.

Example fix

// before
let action = ActionType::ToggleFullscreenByPaneId(
    ToggleFullscreenByPaneIdAction { pane_id: None },
); // -> "ToggleFullscreenByPaneId missing pane_id"

// after
let action = ActionType::ToggleFullscreenByPaneId(
    ToggleFullscreenByPaneIdAction {
        pane_id: Some(PaneId { pane_type: Some(PaneType::Terminal(1)) }),
    },
);
Defensive patterns

Strategy: validation

Validate before calling

fn is_sendable(a: &ToggleFullscreenByPaneIdAction) -> bool {
    a.pane_id
        .as_ref()
        .and_then(|p| p.pane_type.as_ref())
        .is_some()
}

Type guard

fn has_valid_pane_id(a: &ToggleFullscreenByPaneIdAction) -> bool {
    matches!(
        a.pane_id.as_ref().and_then(|p| p.pane_type.as_ref()),
        Some(pane_id::PaneType::Terminal(_)) | Some(pane_id::PaneType::Plugin(_))
    )
}

Try / catch

match Action::try_from(proto_action) {
    Ok(action) => dispatch(action),
    Err(e) if e.to_string().contains("ToggleFullscreenByPaneId missing pane_id") => {
        log::warn!("fullscreen toggle without pane target: {e}");
    },
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Sending ActionType::ToggleFullscreenByPaneId with ToggleFullscreenByPaneIdAction.pane_id = None.

Common situations: Plugins toggling fullscreen on a pane whose id lookup returned None and was passed through; hand-assembled actions; client/server contract version mismatch; intending the focused-pane ToggleFocusFullscreen variant.

Related errors


AI-assisted analysis of zellij-org/zellij@98a0837077 (2026-08-16). Data as JSON: /api/errors/b39bbadac4f8e97f. Report an issue: GitHub.