zellij-org/zellij · error · anyhow::Error
ToggleNoUiFullscreenByPaneId missing pane_id
Error message
ToggleNoUiFullscreenByPaneId missing pane_id
What it means
ToggleNoUiFullscreenByPaneId toggles the no-UI (frameless) fullscreen mode of one specific pane; internally it maps to Action::ToggleFocusNoUiFullscreenByPaneId. The protobuf message ToggleNoUiFullscreenByPaneIdAction requires the optional pane_id field to be set. With pane_id = None the conversion fails with 'ToggleNoUiFullscreenByPaneId missing pane_id'.
Source
Thrown at zellij-utils/src/ipc/protobuf_conversion.rs:3039
.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")
})?
.try_into()?,
},
),
ActionType::CloseFocusByPaneId(a) => {
Ok(crate::input::actions::Action::CloseFocusByPaneId {
pane_id: a
.pane_id
.ok_or_else(|| anyhow!("CloseFocusByPaneId missing pane_id"))?View on GitHub (pinned to 98a0837077)
Solutions
- Set pane_id: Some(PaneId { pane_type: Some(PaneType::Terminal(id)) }).
- Use the focused-pane equivalent if you do not need to target a specific pane.
- Verify the pane exists before constructing the action.
- Rebuild all IPC participants from the same zellij source.
Example fix
// before
let action = ActionType::ToggleNoUiFullscreenByPaneId(
ToggleNoUiFullscreenByPaneIdAction { pane_id: None },
); // -> "ToggleNoUiFullscreenByPaneId missing pane_id"
// after
let action = ActionType::ToggleNoUiFullscreenByPaneId(
ToggleNoUiFullscreenByPaneIdAction {
pane_id: Some(PaneId { pane_type: Some(PaneType::Plugin(2)) }),
},
); Defensive patterns
Strategy: validation
Validate before calling
fn is_sendable(a: &ToggleNoUiFullscreenByPaneIdAction) -> bool {
a.pane_id
.as_ref()
.and_then(|p| p.pane_type.as_ref())
.is_some()
} Type guard
fn has_valid_pane_id(a: &ToggleNoUiFullscreenByPaneIdAction) -> 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("ToggleNoUiFullscreenByPaneId missing pane_id") => {
log::warn!("no-ui fullscreen toggle without pane target: {e}");
},
Err(e) => return Err(e),
} Prevention
- Proto ToggleNoUiFullscreenByPaneId maps to internal ToggleFocusNoUiFullscreenByPaneId - test both directions.
- Always bind fullscreen toggles to a pane id resolved in the same event.
- Version-lock the contract crate to the server.
When it happens
Trigger: Sending ActionType::ToggleNoUiFullscreenByPaneId where ToggleNoUiFullscreenByPaneIdAction.pane_id is None.
Common situations: Plugins building fullscreen toggle actions without a resolved pane id; default prost construction; schema version skew between the tool sending the action and the zellij server decoding it.
Related errors
- ToggleFullscreenByPaneId missing pane_id
- PageScrollUpByPaneId missing pane_id
- PageScrollDownByPaneId missing pane_id
- HalfPageScrollUpByPaneId missing pane_id
- HalfPageScrollDownByPaneId missing pane_id
AI-assisted analysis of zellij-org/zellij@98a0837077 (2026-08-16).
Data as JSON: /api/errors/83edfbaea511ada2.
Report an issue: GitHub.