{"record":{"id":"079bdb7c56d17bd5","repo":"zellij-org/zellij","slug":"changefloatingpanecoordinates-missing-coordinates","errorCode":null,"errorMessage":"ChangeFloatingPaneCoordinates missing coordinates","messagePattern":"ChangeFloatingPaneCoordinates missing coordinates","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"zellij-utils/src/ipc/protobuf_conversion.rs","lineNumber":2871,"sourceCode":"            ActionType::StackPanes(stack_panes_action) => {\n                Ok(crate::input::actions::Action::StackPanes {\n                    pane_ids: stack_panes_action\n                        .pane_ids\n                        .into_iter()\n                        .map(|id| id.try_into())\n                        .collect::<Result<Vec<_>>>()?,\n                })\n            },\n            ActionType::ChangeFloatingPaneCoordinates(change_coords_action) => Ok(\n                crate::input::actions::Action::ChangeFloatingPaneCoordinates {\n                    pane_id: change_coords_action\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"ChangeFloatingPaneCoordinates missing pane_id\"))?\n                        .try_into()?,\n                    coordinates: change_coords_action\n                        .coordinates\n                        .ok_or_else(|| {\n                            anyhow!(\"ChangeFloatingPaneCoordinates missing coordinates\")\n                        })?\n                        .try_into()?,\n                },\n            ),\n            ActionType::TogglePaneBorderless(toggle_borderless_action) => {\n                Ok(crate::input::actions::Action::TogglePaneBorderless {\n                    pane_id: toggle_borderless_action\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"TogglePaneBorderless missing pane_id\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::SetPaneBorderless(set_borderless_action) => {\n                Ok(crate::input::actions::Action::SetPaneBorderless {\n                    pane_id: set_borderless_action\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"SetPaneBorderless missing pane_id\"))?\n                        .try_into()?,","sourceCodeStart":2853,"sourceCodeEnd":2889,"githubUrl":"https://github.com/zellij-org/zellij/blob/98a0837077492d53dd252ab30bc3e43e41e504f4/zellij-utils/src/ipc/protobuf_conversion.rs#L2853-L2889","documentation":"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.","triggerScenarios":"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.","commonSituations":"Programmatic window-management of floating panes that only computes the target pane; version skew where coordinates became a nested message; malformed replayed captures.","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"],"exampleFix":"// before\nChangeFloatingPaneCoordinatesAction { pane_id: Some(3), ..Default::default() } // coordinates: None\n\n// after\nChangeFloatingPaneCoordinatesAction {\n    pane_id: Some(3),\n    coordinates: Some(ProtobufPaneCoordinates { x: Some(10), y: Some(5), cols: Some(80), rows: Some(24) }),\n}","handlingStrategy":"validation","validationCode":"if let ActionType::ChangeFloatingPaneCoordinates(a) = action.action_type.as_ref().unwrap() {\n    if a.coordinates.is_none() {\n        anyhow::bail!(\"ChangeFloatingPaneCoordinates requires coordinates\");\n    }\n}","typeGuard":"fn change_coords_action_is_valid(a: &ChangeFloatingPaneCoordinatesAction) -> bool {\n    a.pane_id.is_some() && a.coordinates.is_some()\n}","tryCatchPattern":"match protobuf_action.try_into() {\n    Ok(action) => dispatch(action),\n    Err(e) if e.to_string().contains(\"missing coordinates\") => {\n        log::warn!(\"dropping ChangeFloatingPaneCoordinates without coordinates\");\n    },\n    Err(e) => return Err(e.context(\"action conversion failed\")),\n}","preventionTips":["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"],"tags":["protobuf","ipc","action","floating-pane","coordinates","validation"],"backgroundTag":null,"analyzedSha":"98a0837077492d53dd252ab30bc3e43e41e504f4","analyzedAt":"2026-08-16T13:02:01.396Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}