Программное изменение обоев в Linux независимо от среды рабочего стола или оконного менеджера

В Linux есть множество настольных сред (GNOME, KDE, Xfce, Cinnamon...) и оконных систем (X11, Wayland, Mir...), и кажется, что у каждого есть свой способ сменить обои. Существуют ли высокоуровневые библиотеки, особенно в C++ (и Qt 5), которые позволяют разработчику программно менять обои в Linux, независимо от управления окнами или рабочего стола? Я ищу что-то подобное:

#include <the_lib>
#include <cstdlib>

int main(int argc, char ** argv) {
    std::string theNewWallpaper = "path/to/my/wallpaper.jpg";
    // Or a file, an image, or something else representing the wallpaper.

    TheLib::changeWallpaper(theNewWallpaper);
    // or a more complicated piece of code which does the same.

    return EXIT_SUCCESS;
}

1 ответ

Попробуйте решение "Andrew Y" в посте: программная смена обоев в Linux

Он утверждает, что его решение не зависит от наборов инструментов более высокого уровня, поэтому оно должно работать для любых сред Linux.

static void
SetBackgroundToBitmap(Pixmap bitmap, unsigned int width, unsigned int height)
{
    Pixmap pix;
    GC gc;
    XGCValues gc_init;

    gc_init.foreground = NameToPixel(fore_color, BlackPixel(dpy, screen));
    gc_init.background = NameToPixel(back_color, WhitePixel(dpy, screen));
    if (reverse) {
        unsigned long temp=gc_init.foreground;
        gc_init.foreground=gc_init.background;
        gc_init.background=temp;
    }
    gc = XCreateGC(dpy, root, GCForeground|GCBackground, &gc_init);
    pix = XCreatePixmap(dpy, root, width, height,
                        (unsigned int)DefaultDepth(dpy, screen));
    XCopyPlane(dpy, bitmap, pix, gc, 0, 0, width, height, 0, 0, (unsigned long)1);
    XSetWindowBackgroundPixmap(dpy, root, pix);
    XFreeGC(dpy, gc);
    XFreePixmap(dpy, bitmap);
    if (save_colors)
        save_pixmap = pix;
    else
        XFreePixmap(dpy, pix);
    XClearWindow(dpy, root);
    unsave_past = 1;
}
Другие вопросы по тегам