如何在没有图形库的情况下与C中的X服务器通信?

时间:2015-11-21 15:56:46

标签: c linux xserver

如果我想编写一个C程序与Linux上的X服务器通信并产生最简单的可视化结果,例如:在显示器上设置一个像素,我该怎么做?

我想尽可能少地使用库,从头开始理解它,无论代码多么低效/混乱。

更新 - “没有库”,我的意思是基本上没有任何可用于X的帮助库,也没有图形工具包。

更新 - 答案是“通过unix套接字”,特别是/tmp/.X11-unix/X0(至少在这台机器上,大概是显示0)。实际上绘制一个像素太复杂了,我想在这里得不到答案。

2 个答案:

答案 0 :(得分:7)

如果您根本不使用任何库,则需要执行以下步骤:

  • 了解目标平台的装配
  • 了解如何在不使用目标上的libc的情况下制作二进制文件。这可能涉及编写用于设置初始堆栈框架的程序集
  • 了解如何在不使用目标上的libc的情况下进行系统调用。这可能涉及装配。
  • 了解并了解网络编程以及POSIX套接字API的工作原理
  • 了解如何在不使用目标上的libc的情况下打开网络连接
  • 了解并了解X11 protocol
  • 实施您需要的X11协议子集
  • 打开与X服务器的网络连接
  • 告诉X服务器创建一个窗口
  • 使用X服务器协商色彩空间
  • 告诉X服务器为窗口中的单个像素着色

如果你想使用libc和libsocket,那么只剩下以下步骤(大致):

  • 了解并了解网络编程以及POSIX套接字API的工作原理
  • 了解并理解X11协议
  • 实施您需要的X11协议子集
  • 打开与X服务器的网络连接
  • 告诉X服务器创建一个窗口
  • 使用X服务器协商色彩空间
  • 告诉X服务器为窗口中的单个像素着色

答案 1 :(得分:1)

X11正在变老。考虑Wayland并阅读其FAQ。还有几个X related protocols,有关X11 Core protocol的内容,以及EWMH等惯例。

您需要阅读数千页。只需了解协议就需要几个月的时间。 OReilly(上个世纪)出版了一本8到10本与X11相关的书籍。

您可以使用低级 X11库,例如XCB - 或更早的Xlib - ,它由Qt或GTK(或FOX等图形工具包)使用etc ..),它们都是free software工具包,因此你可以研究它们的源代码(而Xlib和XCB也是免费软件)。

请注意,今天的GUI通常不会使用X11文本显示请求显示字体。他们经常使用Xft(字体在客户端,而不是在Xorg服务器中)。实际上,我听说大多数图形渲染几乎发生在客户端,而今天大多数X11请求只是向服务器发送pixmaps(因此X11核心协议请求绘制线条或圆圈几乎不可能今天使用)。更一般地说,基于X11的主要工具包(如Qt或GTK)的趋势是避免使用 服务器端 drawing abilities of X11(例如Xlib的XDrawLineXDrawText),因为工具包正在绘制像素图像客户端并且sending它到服务器。

您可以考虑使用libSDL

等低级库

要理解的重要一点是,X11应用程序是事件驱动的,并且基于事件循环(通常由工具包提供),在某些多路复用syscall之上,如poll(2)。他们被X11暴露或损坏事件要求重绘一些屏幕区域(当然,键盘,鼠标和Xorg服务器本身正在发送事件)。

另见this对类似问题的回答。