xlib push window 到另一个windows 的后面

xlib push window to the back of the other windows

我正在使用 c 和 xlib 制作第一个应用程序,到目前为止它进展顺利并且正在做我想做的事!它是无边框的 window,当应用程序启动时会自动全屏显示。

我的应用程序将有一些实用程序,例如桌面上的时钟和当前天气。

所以要做到这一点,我需要能够将我的 window 推到所有其他 windows 的后面,并保持在那里。

我的问题是,如何将 window 推到所有其他打开的 windows 后面(理想情况下是在 cairo-dock 后面,但不是必需的),并保持在那里?

创建类型 _NET_WM_WINDOW_TYPE_DESKTOP 的 window。

怎么样?好吧,它需要一些编码,但以下对我的系统起到了作用:

#include <X11/StringDefs.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>

int main(int argc, char *argv[])
{
  Display *display = XOpenDisplay("");
  Window win = XCreateSimpleWindow(display, XDefaultRootWindow(display), 0, 0, 1920, 1080, 0, 0, WhitePixel(display, DefaultScreen(display)));

  Atom window_type = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False);
  Atom desktop = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DESKTOP", False);
  XChangeProperty (display, win, window_type, XA_ATOM, 32, PropModeReplace, (unsigned char *) &desktop, 1);

  XClearWindow(display, win);
  XMapWindow(display, win);

  while (1)
  {
    XEvent event;

    XNextEvent(display, &event);
  }

  XUnmapWindow(display, win);
  XCloseDisplay(display);
}

这显示了一个白色 window 与我现有的桌面重叠,但位于程序 windows 下方;我的 KDE 任务栏也仍然可见。

一些注意事项:

  • 您必须在执行 XMapWindow
  • 之前设置 属性
  • window 的大小应与您的屏幕大小相匹配(我硬编码了我的值),否则您会收到 BadRequest 错误。

当我终止程序时,我的旧桌面返回,但这可能不适用于其他 window 管理器。试试吧。