Создайте окно типа _NET_WM_WINDOW_TYPE_DESKTOP.
Как? Ну, это требует немного кодирования, но на следующий же трюк в моей системе:
#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);
}
Это показало белое окно, которое перекрывается мой существующий рабочий стол, но был помещен ниже окна программы; моя панель задач KDE также была видна.
Несколько замечаний:
- Вы должны установить свойство перед выполнением XMapWindow
- имеют размер окна должен совпадать с размером экрана (я жёстко мои ценности), или вы получите ошибку BadRequest.
Когда я убил программу, мой старый рабочий стол вернулся, но это может не работать с другими оконными менеджерами. Попробуйте.
Что делать, если есть * две программы, которые хотят нажимать соответствующие окна на все остальные окна * и держать их там *? Борьба! Сказав это, вы можете попробовать вызвать XLowerWindow в начале и каждый раз, когда вы получаете событие, выбранное StructureNotifyMask. –
Спасибо, что дает мне отправную точку для работы. Что касается окон, сражающихся друг с другом, я думаю, что я пойму, что с этим делать, когда я прихожу к проблеме. –