Большинство привязок протокола в XCB автоматически генерируются из XML-описания протокола во время сборки.Таким образом, чтобы получить «реальный исходный код», вы должны собрать XCB самостоятельно (но вам не нужно его устанавливать, поскольку для сборки сначала генерируется исходный код C).
Однако я бы хотелутверждают, что сгенерированный исходный код не очень полезен.Вы просите xcb_poly_line
.Описание XCB для этого запроса выглядит следующим образом (взято из https://gitlab.freedesktop.org/xorg/proto/xcbproto/blob/master/src/xproto.xml):
<request name="PolyLine" opcode="65" combine-adjacent="true">
<field type="BYTE" name="coordinate_mode" enum="CoordMode" />
<field type="DRAWABLE" name="drawable" />
<field type="GCONTEXT" name="gc" />
<list type="POINT" name="points" />
<doc>
[snip]
</doc>
</request>
. Во время сборки создается файл с именем xproto.c
. В нем xcb_poly_line
определяется следующим образом:
xcb_void_cookie_t
xcb_poly_line (xcb_connection_t *c,
uint8_t coordinate_mode,
xcb_drawable_t drawable,
xcb_gcontext_t gc,
uint32_t points_len,
const xcb_point_t *points)
{
static const xcb_protocol_request_t xcb_req = {
.count = 4,
.ext = 0,
.opcode = XCB_POLY_LINE,
.isvoid = 1
};
struct iovec xcb_parts[6];
xcb_void_cookie_t xcb_ret;
xcb_poly_line_request_t xcb_out;
xcb_out.coordinate_mode = coordinate_mode;
xcb_out.drawable = drawable;
xcb_out.gc = gc;
xcb_parts[2].iov_base = (char *) &xcb_out;
xcb_parts[2].iov_len = sizeof(xcb_out);
xcb_parts[3].iov_base = 0;
xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
/* xcb_point_t points */
xcb_parts[4].iov_base = (char *) points;
xcb_parts[4].iov_len = points_len * sizeof(xcb_point_t);
xcb_parts[5].iov_base = 0;
xcb_parts[5].iov_len = -xcb_parts[4].iov_len & 3;
xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
return xcb_ret;
}
Эта функция просто принимает заданные аргументы и отправляет их на сервер X11. Никакой магии не применяется.
На сервере X.org X11 запрос PolyLine обрабатывается функцией ProcPolyLine
. Его реализация, скорее всего, не слишком вас просветит: https://cgit.freedesktop.org/xorg/xserver/tree/dix/dispatch.c#n1802