簡體   English   中英

桌面上方的X11 / GLX窗口

[英]X11/GLX window above desktop

我想為桌面創建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(紅色)\\ swapBuffers(循環中)

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

不幸的是,沒有解決方案可以在所有情況下100%起作用。 最直接的解決方案是直接繪制到根窗口:打開與X的連接,獲取根窗口的xid,查詢配置的視覺效果,創建兼容的GLX上下文,繪制到該窗口。 (這對於X11來說有點可靠;但是在Microsoft Windows或macOS上做類似的事情是不可能的。)

但是,您無法更改視覺/像素格式,只是繪制到根窗口不一定會使其成為桌面上圖標的“底層”。 你看,大多數“桌面”都是通過在根窗口頂部創建自己的全屏窗口(但在其他所有窗口之下)來實現的,甚至可以用來繪制壁紙。

如果選擇的桌面環境合作並將其桌面及其上的圖標繪制為透明的合成窗口,則直接繪制到根窗口將僅為您提供所需的效果; 或者如果它使用X形狀擴展名掩蓋了圖標(我不知道任何DE也會這樣做)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM