【问题标题】:X11/GLX window above desktop桌面上方的 X11/GLX 窗口
【发布时间】:2019-05-05 23:13:51
【问题描述】:

我想为桌面创建 opengl 应用程序,但图标和壁纸坏了。

窗口应该在图标下:


创建窗口的代码:

XSetWindowAttributes swa;
swa.background_pixmap = ParentRelative;
swa.background_pixel = 0;
swa.border_pixmap = 0;
swa.border_pixel = 0;
swa.bit_gravity = 0;
swa.win_gravity = 0;
swa.override_redirect = True;
swa.colormap = XCreateColormap(dis, root, vi->visual, AllocNone);
swa.event_mask = StructureNotifyMask | ExposureMask;

unsigned long mask = CWOverrideRedirect | CWBackingStore | CWBackPixel | CWBorderPixel | CWColormap;

window = XCreateWindow(display, desktop, 0, 0,
                              display_width, display_height, 0, vi->depth,
                             InputOutput, vi->visual, mask, &swa); // vi -XVisualInfo

XLowerWindow(display, window);


long value = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DESKTOP", false);

XChangeProperty(display, window,
                    XInternAtom(display, "_NET_WM_WINDOW_TYPE", false),
                    XA_ATOM, 32, PropModeReplace, (unsigned char *) &value, 1);

Atom xa; 

 xa = ATOM(_WIN_LAYER); 

  if (xa != None) {
    long prop = 0;

    XChangeProperty(display, window, xa, XA_CARDINAL, 32,
                    PropModeAppend, (unsigned char *)&prop, 1);
  }

  xa = ATOM(_NET_WM_STATE);
  if (xa != None) {
    Atom xa_prop = ATOM(_NET_WM_STATE_BELOW);

    XChangeProperty(display, window, xa, XA_ATOM, 32, PropModeAppend,
                    (unsigned char *)&xa_prop, 1);
  }


  if (transparency < 1.0) {
    uint32_t cardinal_alpha = (uint32_t) (transparency * (uint32_t)-1) ;
    XChangeProperty(display, window,
                    XInternAtom(display, "_NET_WM_WINDOW_OPACITY", 0),
                    XA_CARDINAL, 32, PropModeReplace, (uint8_t*) &cardinal_alpha, 1);
}

XLowerWindow(display, window);
ctx = glXCreateContextAttribsARB(dis, fbc, NULL, True, gl3attr); //ctx =  GLXContext

接下来我创建 XMapWindow(dis, window), glXMakeCurrent(dis, window, ctx), glViewport 和 clearColor(red)\swapBuffers (in cycle)

注意:ATOM = #define ATOM(a) XInternAtom(dis, #a, False)

【问题讨论】:

  • 那么像老式的xv 色键底衬?
  • 请不要发布没有有用信息的图片。

标签: c++ opengl x11 glx


【解决方案1】:

不幸的是,没有一种解决方案可以 100% 解决所有情况。最直接的解决方案是直接绘制到根窗口:打开到 X 的连接,获取根窗口的 xid,查询它配置的视觉对象,创建兼容的 GLX 上下文,然后绘制。 (这对 X11 来说有些可靠;但在 Microsoft Windows 或 macOS 上做类似的事情是不可能的。)

但是,您无法更改视觉/像素格式,并且仅绘制到根窗口不一定会使其成为桌面上图标的“底层”。你看,大多数“桌面”都是通过创建自己的全屏窗口来实现的,在根窗口的顶部(但在其他所有窗口的下方),甚至可以用来绘制壁纸。

如果选择的桌面环境能够配合并将其桌面和其上的图标绘制为透明的复合窗口,则直接绘制到根窗口只会给您想要的效果;或者如果它会使用 X 形状扩展名掩盖图标(我不知道有任何 DE 这样做)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多