Где я могу найти реализацию библиотеки xcb? - PullRequest
2 голосов
/ 10 марта 2019

Я пытаюсь выучить xcb, и поскольку документация довольно скудная, я хотел бы изучить реализацию самих методов. Например, определение метода xcb_poly_line не приводится в исходном коде https://github.com/stapelberg/libxcb/tree/master/src. Однако, когда я включаю его, он просто работает.

1 Ответ

0 голосов
/ 26 июня 2019

Большинство привязок протокола в 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

...