- 在APUE(见下图)中,终端仿真器进程和窗口管理器(例如openbox)进程如何通信?终端仿真器进程是基于 Unix 域套接字的窗口管理器进程的客户端吗?
X 服务器进程与终端仿真器进程和窗口管理器进程有什么关系?具体来说:
xlsclients
输出包含lxterminal
.这是否意味着终端仿真器进程是 X 服务器的客户端?$ xlsclients -a | grep -i lxterminal ocean lxterminal
xlsclients
输出不包含窗口管理器进程。这是否意味着窗口管理器进程不是 X 服务器的客户端?$ xlsclients -a | grep -i openbox $
答案1
xlsclients
是一个简单的应用程序,它列出了顶部窗口(即作为根窗口的子窗口或具有属性的窗口)上设置的WM_CLIENT_MACHINE
和属性。WM_COMMAND
WM_STATE
这就是它所做的一切。没有魔法。
例如,我正在使用自己的窗口管理器,它打开了一个InputOnly
(不可见)窗口作为根窗口的子窗口,将其用于尤姆赫的气象检查。如果我设置这两个属性,预期的事情就会发生;-)
$ xprop -id 0x400001 -f WM_CLIENT_MACHINE 8s -set WM_CLIENT_MACHINE kgbvax
$ xprop -id 0x400001 -set WM_COMMAND /sbin/reboot
$ $ xlsclients
kgbvax /sbin/reboot
...
但回答你的问题:
终端仿真器进程和窗口管理器(例如 openbox)进程如何通信?终端仿真器进程是基于 Unix 域套接字的窗口管理器进程的客户端吗?
它们都是 X11 服务器的客户端,通常通过使用 XSendEvent(3) 发送客户端消息并在窗口上设置属性来进行通信。该协议描述于国际商会和尤姆赫。请注意,客户端并没有“拥有”窗口;而是“拥有”窗口。任何客户端都可以在任何窗口上进行任何操作,包括但不限于设置和获取窗口的任何属性。
答案2
我不知道 APUE 是什么意思,谷歌搜索也没有找到任何有用的东西,但我可以为像xterm
.虽然xterm
只使用单个 shell 加上 PTY(例如图片的左侧部分),但没有什么可以阻止终端仿真器多次执行此操作(例如在选项卡式子窗口中),因此 APUE 可能就是这样的程序。
1) 终端仿真器只是一个普通的 X 应用程序,因此与 X 窗口管理器的通信方式与其他 X 应用程序相同:间接通过 X 服务器。这个细节很复杂,涉及 X 属性、X 事件和其他东西。它们不涉及任何类型的客户端-服务器关系(因为连接是间接的)或 Unix 域套接字。
2) 任何 X 应用程序,包括终端仿真器,都是一个客户X 的服务器,如果它们在同一台机器上运行,则通过 Unix 域套接字,如果不在同一台机器上则通过网络。是的,xlsclients
正如其名称所暗示的那样,列出了它连接到的 X 服务器的所有客户端应用程序。
3) X 窗口管理器openbox
只是一个 X 应用程序,它在连接到 X 服务器时执行一些特殊命令。所以 X 窗口管理器是客户X 的服务器(除非你坚持对“客户”有一个有趣的定义),并以与上述相同的方式进行沟通。如果xlsclients
没有将其列在“客户端”下,那是因为 X 服务器以特殊方式对待它。我实际上不确定其机制(xlsclients
可能会过滤掉它,或者 X 服务器本身可能会过滤掉它)。
编辑
X 客户端(至少根据我的观点)是任何打开到 X 服务器的连接的东西,即使它不显示窗口。 X 客户端也是如此xlsclients
(只要它运行),查询 X 服务器的其他命令也是如此。
“控制终端”是一个完全独立的概念。您可以启动(至少最初)具有控制终端的 X 应用程序:如果您通过命令行启动它们,这是通常的情况。但是X应用程序也可以在没有控制终端的情况下启动,例如从X显示管理器,或者从其他X客户端(例如在没有控制终端的情况下启动的窗口管理器)。