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

  1. Include the `coordinates` submessage with the new position/dimensions alongside pane_id
  2. Regenerate protobuf stubs for the client against the running server
  3. Keep emitter and server on the same zellij release
  4. 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

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


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