检测合成器是否正在运行

时间:2015-10-18 07:50:44

标签: x11 xlib

我希望我的UI根据屏幕是否合成(因此支持某些效果)来改变设计。是否可能

  • 可靠地查询X服务器是否正在运行合成窗口管理器
  • 打开/关闭合成时会收到通知吗?

解决方案:

详细说明Andrey Sidorov对不太熟悉X11 API的人的正确答案,这是检测符合EWMH的合成器的代码:

int has_compositor(Display *dpy, int screen) {
    char prop_name[20];
    snprintf(prop_name, 20, "_NET_WM_CM_S%d", screen);
    Atom prop_atom = XInternAtom(dpy, prop_name, False);
    return XGetSelectionOwner(dpy, prop_atom) != None;
}

1 个答案:

答案 0 :(得分:3)

符合EWMH标准的合成者must acquire ownership of a selection named _NET_WM_CM_Sn, where n is the screen number

要跟踪合成器,您需要使用_NET_WM_CM_S0检查所有人(假设您在屏幕0上)是否拥有选择XGetSelectionOwner。如果不拥有,请自行获取所有权并监视SelectionClear事件,以检测何时启动合成器。