Окно X11 / GLX над рабочим столом - PullRequest
0 голосов
/ 06 мая 2019

Я хочу создать приложение opengl для рабочего стола, но значки и обои не работают.

Окно должно быть под значками:

enter image description here

код для создания окна:

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 = # определить ATOM (a) XInternAtom (dis, #a, False)

1 Ответ

0 голосов
/ 06 мая 2019

К сожалению, нет решения, которое бы работало в 100% случаев.Самым непосредственным решением было бы нарисовать непосредственно в корневом окне: открыть соединение с X, получить xid корневого окна, запросить, на что оно настроено, создать совместимый контекст GLX, нарисовать для этого. (это работает несколько надежно для X11; сделать подобное в Microsoft Windows или macOS невозможно, хотя.)

Однако вы не можете изменить визуальный / пиксельный формат, а просто отрисовать в корневом окне.не обязательно сделает его «подложкой» для значков на рабочем столе.Видите ли, большинство «рабочих столов» реализовано путем создания собственного полноэкранного окна поверх корневого окна (но под всем остальным), и даже будет использоваться для рисования обоев.

Рисование непосредственнокорневое окно даст вам желаемый эффект только в том случае, если выбранная среда рабочего стола будет взаимодействовать и нарисует свой рабочий стол и значки на нем в виде прозрачного составного окна;или если бы он маскировал значки с помощью расширения X-формы (я не знаю ни об одном DE, который это делает).

...