c - 我在哪里可以找到 xcb 库的实现?
问题描述
我尝试学习 xcb 并且由于文档很少,我想研究方法本身的实现。例如,源代码https://github.com/stapelberg/libxcb/tree/master/src中没有给出方法 xcb_poly_line 的定义。但是,当我包含它时,它就可以工作。
解决方案
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
推荐阅读
- google-sheets - 如何以 JSON 格式获取 google sheet 多个标签数据?
- android - No Firebase initialized 是我运行 apk 时遇到的错误
- apache-kafka - 在 docker compose 中将 kafka 连接器与 kafka 代理连接时,代理可能不可用
- php - Laravel Auth::check() 总是失败
- python - 将项目添加到对象列表
- amazon-web-services - 使用 ECS Fargate 的应用程序负载均衡器
- javascript - 如何将多个数组和单个 arg 的混合传递给另一个函数并返回它们(GAS/JS)?
- java - Bluej 没有在 Ubuntu 机器上运行
- ios - pod install 抛出错误
- javascript - 尝试创建可读的输出包但错误消息:-找不到入口模块:错误:无法解析'./src/index.js'