xkb: XkbWriteGeomDoodads(): use x_rpcbuf_t

Use x_rpcbuf_t for reply payload chunk assembly and byte-swapping.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult
2025-08-19 16:07:29 +02:00
committed by Enrico Weigelt
parent ca27ebbd7d
commit a2211393df

View File

@@ -4522,59 +4522,53 @@ XkbSizeGeomDoodads(int num_doodads, XkbDoodadPtr doodad)
return size;
}
static char *
XkbWriteGeomDoodads(char *wire, int num_doodads, XkbDoodadPtr doodad, Bool swap)
static void XkbWriteGeomDoodads(x_rpcbuf_t *rpcbuf, int num_doodads, XkbDoodadPtr doodad)
{
register int i;
xkbDoodadWireDesc *doodadWire;
for (i = 0; i < num_doodads; i++, doodad++) {
doodadWire = (xkbDoodadWireDesc *) wire;
wire = (char *) &doodadWire[1];
memset(doodadWire, 0, SIZEOF(xkbDoodadWireDesc));
doodadWire->any.name = doodad->any.name;
doodadWire->any.type = doodad->any.type;
doodadWire->any.priority = doodad->any.priority;
doodadWire->any.top = doodad->any.top;
doodadWire->any.left = doodad->any.left;
if (swap) {
swapl(&doodadWire->any.name);
swaps(&doodadWire->any.top);
swaps(&doodadWire->any.left);
}
/* write xkbAnyDoodadWireDesc head part */
x_rpcbuf_write_CARD32(rpcbuf, doodad->any.name);
x_rpcbuf_write_CARD8(rpcbuf, doodad->any.type);
x_rpcbuf_write_CARD8(rpcbuf, doodad->any.priority);
x_rpcbuf_write_INT16(rpcbuf, doodad->any.top);
x_rpcbuf_write_INT16(rpcbuf, doodad->any.left);
x_rpcbuf_write_INT16(rpcbuf, doodad->any.angle);
switch (doodad->any.type) {
case XkbOutlineDoodad:
case XkbSolidDoodad:
doodadWire->shape.angle = doodad->shape.angle;
doodadWire->shape.colorNdx = doodad->shape.color_ndx;
doodadWire->shape.shapeNdx = doodad->shape.shape_ndx;
if (swap) {
swaps(&doodadWire->shape.angle);
}
/* write xkbShapeDoodadWireDesc head part */
x_rpcbuf_write_CARD8(rpcbuf, doodad->shape.color_ndx);
x_rpcbuf_write_CARD8(rpcbuf, doodad->shape.shape_ndx);
x_rpcbuf_write_CARD16(rpcbuf, 0); /* pad1 */
x_rpcbuf_write_CARD32(rpcbuf, 0); /* pad2 */
break;
case XkbTextDoodad:
doodadWire->text.angle = doodad->text.angle;
doodadWire->text.width = doodad->text.width;
doodadWire->text.height = doodad->text.height;
doodadWire->text.colorNdx = doodad->text.color_ndx;
if (swap) {
swaps(&doodadWire->text.angle);
swaps(&doodadWire->text.width);
swaps(&doodadWire->text.height);
}
wire = XkbWriteCountedString(wire, doodad->text.text, swap);
wire = XkbWriteCountedString(wire, doodad->text.font, swap);
/* write xkbTextDoodadWireDesc head part */
x_rpcbuf_write_CARD16(rpcbuf, doodad->text.width);
x_rpcbuf_write_CARD16(rpcbuf, doodad->text.height);
x_rpcbuf_write_CARD8(rpcbuf, doodad->text.color_ndx);
x_rpcbuf_write_CARD8(rpcbuf, 0); /* pad1 */
x_rpcbuf_write_CARD16(rpcbuf, 0); /* pad2 */
x_rpcbuf_write_counted_string_pad(rpcbuf, doodad->text.text);
x_rpcbuf_write_counted_string_pad(rpcbuf, doodad->text.font);
break;
case XkbIndicatorDoodad:
doodadWire->indicator.shapeNdx = doodad->indicator.shape_ndx;
doodadWire->indicator.onColorNdx = doodad->indicator.on_color_ndx;
doodadWire->indicator.offColorNdx = doodad->indicator.off_color_ndx;
/* write xkbIndicatorDoodadWireDesc head part */
x_rpcbuf_write_CARD8(rpcbuf, doodad->indicator.shape_ndx);
x_rpcbuf_write_CARD8(rpcbuf, doodad->indicator.on_color_ndx);
x_rpcbuf_write_CARD8(rpcbuf, doodad->indicator.off_color_ndx);
x_rpcbuf_write_CARD8(rpcbuf, 0); /* pad1 */
x_rpcbuf_write_CARD32(rpcbuf, 0); /* pad2 */
break;
case XkbLogoDoodad:
doodadWire->logo.angle = doodad->logo.angle;
doodadWire->logo.colorNdx = doodad->logo.color_ndx;
doodadWire->logo.shapeNdx = doodad->logo.shape_ndx;
wire = XkbWriteCountedString(wire, doodad->logo.logo_name, swap);
/* write xkbLogoDoodadWireDesc head part */
x_rpcbuf_write_CARD8(rpcbuf, doodad->logo.color_ndx);
x_rpcbuf_write_CARD8(rpcbuf, doodad->logo.shape_ndx);
x_rpcbuf_write_CARD16(rpcbuf, 0); /* pad1 */
x_rpcbuf_write_CARD32(rpcbuf, 0); /* pad2 */
x_rpcbuf_write_counted_string_pad(rpcbuf, doodad->logo.logo_name);
break;
default:
ErrorF("[xkb] Unknown doodad type %d in XkbWriteGeomDoodads\n",
@@ -4583,7 +4577,6 @@ XkbWriteGeomDoodads(char *wire, int num_doodads, XkbDoodadPtr doodad, Bool swap)
break;
}
}
return wire;
}
static void XkbWriteGeomOverlay(x_rpcbuf_t *rpcbuf, XkbOverlayPtr ol)
@@ -4721,10 +4714,13 @@ XkbWriteGeomSections(char *wire, XkbGeometryPtr geom, Bool swap)
}
}
}
if (section->doodads) {
wire = XkbWriteGeomDoodads(wire,
section->num_doodads, section->doodads,
swap);
x_rpcbuf_t rpcbuf = { .swapped = swap, .err_clear = TRUE };
XkbWriteGeomDoodads(&rpcbuf, section->num_doodads, section->doodads);
memcpy(wire, rpcbuf.buffer, rpcbuf.wpos);
wire += rpcbuf.wpos;
x_rpcbuf_clear(&rpcbuf);
}
if (section->overlays) {
x_rpcbuf_t rpcbuf = { .swapped = swap, .err_clear = TRUE };
@@ -4800,9 +4796,13 @@ XkbAssembleGeometry(ClientPtr client,
desc = XkbWriteGeomShapes(desc, geom, client->swapped);
if (rep.nSections > 0)
desc = XkbWriteGeomSections(desc, geom, client->swapped);
if (rep.nDoodads > 0)
desc = XkbWriteGeomDoodads(desc, geom->num_doodads, geom->doodads,
client->swapped);
if (rep.nDoodads > 0) {
x_rpcbuf_t rpcbuf = { .swapped = client->swapped, .err_clear = TRUE };
XkbWriteGeomDoodads(&rpcbuf, geom->num_doodads, geom->doodads);
memcpy(desc, rpcbuf.buffer, rpcbuf.wpos);
desc += rpcbuf.wpos;
x_rpcbuf_clear(&rpcbuf);
}
if (rep.nKeyAliases > 0)
desc = XkbWriteGeomKeyAliases(desc, geom, client->swapped);
}