{"record":{"id":"0e235fb8177212c0","repo":"zellij-org/zellij","slug":"missing-pixel-dimensions","errorCode":null,"errorMessage":"Missing pixel_dimensions","messagePattern":"Missing pixel_dimensions","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"zellij-utils/src/ipc/protobuf_conversion.rs","lineNumber":211,"sourceCode":"    }\n}\n\n// Convert protobuf ClientToServerMsg to Rust\nimpl TryFrom<ProtoClientToServerMsg> for ClientToServerMsg {\n    type Error = anyhow::Error;\n\n    fn try_from(msg: ProtoClientToServerMsg) -> Result<Self> {\n        match msg.message {\n            Some(client_to_server_msg::Message::DetachSession(detach)) => {\n                Ok(ClientToServerMsg::DetachSession {\n                    client_ids: detach.client_ids.into_iter().map(|id| id as u16).collect(),\n                })\n            },\n            Some(client_to_server_msg::Message::TerminalPixelDimensions(pixel_dims)) => {\n                Ok(ClientToServerMsg::TerminalPixelDimensions {\n                    pixel_dimensions: pixel_dims\n                        .pixel_dimensions\n                        .ok_or_else(|| anyhow!(\"Missing pixel_dimensions\"))?\n                        .try_into()?,\n                })\n            },\n            Some(client_to_server_msg::Message::BackgroundColor(bg_color)) => {\n                Ok(ClientToServerMsg::BackgroundColor {\n                    color: bg_color.color,\n                })\n            },\n            Some(client_to_server_msg::Message::ForegroundColor(fg_color)) => {\n                Ok(ClientToServerMsg::ForegroundColor {\n                    color: fg_color.color,\n                })\n            },\n            Some(client_to_server_msg::Message::ColorRegisters(color_regs)) => {\n                Ok(ClientToServerMsg::ColorRegisters {\n                    color_registers: color_regs\n                        .color_registers\n                        .into_iter()","sourceCodeStart":193,"sourceCodeEnd":229,"githubUrl":"https://github.com/zellij-org/zellij/blob/e839bfffa586992364309a685b2c71f3b23c247e/zellij-utils/src/ipc/protobuf_conversion.rs#L193-L229","documentation":"Thrown while converting a ClientToServerMsg::TerminalPixelDimensions frame (zellij-utils/src/ipc/protobuf_conversion.rs): the outer message was present but its nested pixel_dimensions field (the PixelDimensions message with height/width/character_cell_size) was None. Optional message-typed fields do not get proto3 defaults, so an unset nested message is indistinguishable from an absent one and conversion refuses to invent values.","triggerScenarios":"A client sends the TerminalPixelDimensions variant without setting the nested pixel_dimensions message — older zellij client that predates the field, custom/web clients constructing the oneof member with defaults, or a test fixture omission.","commonSituations":"Version-mixed sessions (old client, new server); first implementations of custom clients copying the message shape incompletely; refactors that drop the nested assignment.","solutions":["Always populate pixel_dimensions (with character_cell_size where known) when sending the TerminalPixelDimensions variant.","Update the zellij client on the sending side to a release matching the server.","On the receiving side, treat a missing nested field as a protocol violation: skip/log the frame rather than propagating the error."],"exampleFix":"// before\nlet msg = client_to_server_msg::Message::TerminalPixelDimensions(TerminalPixelDimensions::default());\n\n// after: set the nested message\nlet msg = client_to_server_msg::Message::TerminalPixelDimensions(TerminalPixelDimensions {\n    pixel_dimensions: Some(PixelDimensions { height: Some(1080), width: Some(1920), character_cell_size: Some(SizeInPixels { width: 9, height: 18 }) }),\n});","handlingStrategy":"validation","validationCode":"// receiver side: skip frames that lack the nested message\nlet Some(pixel_dimensions) = pixel_dims.pixel_dimensions else {\n    log::warn!(\"TerminalPixelDimensions without pixel_dimensions; ignored\");\n    return Ok(None);\n};","typeGuard":"fn has_pixel_dimensions(m: &TerminalPixelDimensions) -> bool {\n    m.pixel_dimensions.is_some()\n}","tryCatchPattern":"match ClientToServerMsg::try_from(proto_msg) {\n    Ok(msg) => Some(msg),\n    Err(e) if e.to_string().contains(\"Missing pixel_dimensions\") => {\n        log::warn!(\"peer sent pixel-dims frame without payload; frame ignored\");\n        None\n    },\n    Err(e) => return Err(e),\n}","preventionTips":["When constructing the TerminalPixelDimensions variant, always set pixel_dimensions in the same expression.","Match zellij client/server versions so both sides agree the nested field is required.","Centralize proto construction in one helper so no call site can omit the nested message."],"tags":["zellij","rust","protobuf","ipc","missing-field","client-server"],"backgroundTag":"missing-required-proto-field","analyzedSha":"e839bfffa586992364309a685b2c71f3b23c247e","analyzedAt":"2026-08-19T07:42:58.758Z","contentChangedAt":"2026-08-19T07:42:58.758Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}