基于Xlib开发窗口管理器:如何判断窗口是否含嵌入式标题栏?
首先明确:ICCCM和EWMH规范并没有专门定义用于判断窗口是否自带嵌入式标题栏的标准属性。你提到的MotifWmHints虽然是非标准,但它是X11生态中事实上的准标准,绝大多数应用都会支持,实际开发中很难绕开它。
不过结合ICCCM/EWMH的现有属性,你可以搭配以下经验性判断来实现需求:
检查窗口的
_NET_WM_WINDOW_TYPE原子属性
很多自带标题栏的窗口会设置特定的窗口类型,比如对话框(_NET_WM_WINDOW_TYPE_DIALOG)、工具窗口(_NET_WM_WINDOW_TYPE_UTILITY)、工具栏(_NET_WM_WINDOW_TYPE_TOOLBAR)等。这类窗口通常不需要WM额外添加标题栏,你可以通过判断窗口类型来做决策。
实现时用XGetWindowProperty获取该属性,对比对应的原子值即可。参考
_NET_WM_BYPASS_COMPOSITOR属性
如果窗口将这个属性设为1,说明它希望完全掌控自身的绘制逻辑(包括标题栏),此时WM可以考虑跳过标题栏的添加。注意这个属性原本是给合成器用的,但可以作为辅助判断依据。用MotifWmHints做核心判断
虽然不是标准,但GTK、Qt等主流工具包都会设置这个属性。你需要获取窗口的_MOTIF_WM_HINTS属性,解析其中的结构体:typedef struct { unsigned long flags; unsigned long functions; unsigned long decorations; long input_mode; unsigned long status; } MotifWmHints;当
flags包含MWM_HINTS_DECORATIONS,且decorations不包含MWM_DECOR_TITLE时,说明窗口不需要WM提供标题栏(大概率是自己实现了嵌入式标题栏)。
实际开发中没有绝对完美的判断方式,主流窗口管理器(比如i3、Openbox)都是结合上述多种方法,再加上一些经验规则来处理的。
内容的提问来源于stack exchange,提问作者gsm

