zellij-org/zellij · error · anyhow::Error
ChangeFloatingPaneCoordinates missing coordinates
Error message
ChangeFloatingPaneCoordinates missing coordinates
What it means
Second required-field check in the ChangeFloatingPaneCoordinates protobuf conversion: besides pane_id, the action must carry the new `coordinates` submessage (x/y/size for the floating pane). If the coordinates message is missing the conversion aborts here even when pane_id was supplied, because there is nothing to move the pane to.
Source
Thrown at zellij-utils/src/ipc/protobuf_conversion.rs:2871
ActionType::StackPanes(stack_panes_action) => {
Ok(crate::input::actions::Action::StackPanes {
pane_ids: stack_panes_action
.pane_ids
.into_iter()
.map(|id| id.try_into())
.collect::<Result<Vec<_>>>()?,
})
},
ActionType::ChangeFloatingPaneCoordinates(change_coords_action) => Ok(
crate::input::actions::Action::ChangeFloatingPaneCoordinates {
pane_id: change_coords_action
.pane_id
.ok_or_else(|| anyhow!("ChangeFloatingPaneCoordinates missing pane_id"))?
.try_into()?,
coordinates: change_coords_action
.coordinates
.ok_or_else(|| {
anyhow!("ChangeFloatingPaneCoordinates missing coordinates")
})?
.try_into()?,
},
),
ActionType::TogglePaneBorderless(toggle_borderless_action) => {
Ok(crate::input::actions::Action::TogglePaneBorderless {
pane_id: toggle_borderless_action
.pane_id
.ok_or_else(|| anyhow!("TogglePaneBorderless missing pane_id"))?
.try_into()?,
})
},
ActionType::SetPaneBorderless(set_borderless_action) => {
Ok(crate::input::actions::Action::SetPaneBorderless {
pane_id: set_borderless_action
.pane_id
.ok_or_else(|| anyhow!("SetPaneBorderless missing pane_id"))?
.try_into()?,View on GitHub (pinned to 98a0837077)
Solutions
- Include the `coordinates` submessage with the new position/dimensions alongside pane_id
- Regenerate protobuf stubs for the client against the running server
- Keep emitter and server on the same zellij release
- Validate the full required shape (pane_id + coordinates) before sending the action
Example fix
// before
ChangeFloatingPaneCoordinatesAction { pane_id: Some(3), ..Default::default() } // coordinates: None
// after
ChangeFloatingPaneCoordinatesAction {
pane_id: Some(3),
coordinates: Some(ProtobufPaneCoordinates { x: Some(10), y: Some(5), cols: Some(80), rows: Some(24) }),
} Defensive patterns
Strategy: validation
Validate before calling
if let ActionType::ChangeFloatingPaneCoordinates(a) = action.action_type.as_ref().unwrap() {
if a.coordinates.is_none() {
anyhow::bail!("ChangeFloatingPaneCoordinates requires coordinates");
}
} Type guard
fn change_coords_action_is_valid(a: &ChangeFloatingPaneCoordinatesAction) -> bool {
a.pane_id.is_some() && a.coordinates.is_some()
} Try / catch
match protobuf_action.try_into() {
Ok(action) => dispatch(action),
Err(e) if e.to_string().contains("missing coordinates") => {
log::warn!("dropping ChangeFloatingPaneCoordinates without coordinates");
},
Err(e) => return Err(e.context("action conversion failed")),
} Prevention
- Build coordinates from validated dimensions (non-zero cols/rows within the terminal size)
- Never send a move action with only part of the (pane_id, coordinates) pair
- Clamp coordinates to the current viewport before sending
- Recheck required submessages after any proto regeneration
When it happens
Trigger: An IPC action of type ChangeFloatingPaneCoordinates with pane_id set but no coordinates submessage — senders that populate the id and forget the geometry, or default-constructed messages from generated stubs that drifted from the server schema.
Common situations: Programmatic window-management of floating panes that only computes the target pane; version skew where coordinates became a nested message; malformed replayed captures.
Related errors
- NewFloatingPluginPane missing plugin
- ChangeFloatingPaneCoordinates missing pane_id
- SkipConfirm missing action
- NewTiledPluginPane missing plugin
- NewInPlacePluginPane missing plugin
AI-assisted analysis of zellij-org/zellij@98a0837077 (2026-08-16).
Data as JSON: /api/errors/079bdb7c56d17bd5.
Report an issue: GitHub.