C++ 在Linux中独立于桌面环境或窗口管理器以编程方式更改墙纸

C++ 在Linux中独立于桌面环境或窗口管理器以编程方式更改墙纸,c++,linux,qt,wallpaper,desktop-wallpaper,C++,Linux,Qt,Wallpaper,Desktop Wallpaper,Linux有很多桌面环境(GNOME、KDE、Xfce、肉桂……)和窗口系统(X11、Wayland、Mir……),似乎每一个都有自己的方式来改变壁纸。是否有一些高级库,特别是在C++(和Qt 5)中,它使开发者能够在程序上改变Linux的壁纸,而不管窗口管理还是桌面管理?我正在寻找这样的东西: #include <the_lib> #include <cstdlib> int main(int argc, char ** argv) { std::string

Linux有很多桌面环境(GNOME、KDE、Xfce、肉桂……)和窗口系统(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;
}
#包括
#包括
int main(int argc,字符**argv){
std::string theNewWallpaper=“path/to/my/wallpaper.jpg”;
//或者一个文件,一个图像,或者其他代表壁纸的东西。
图书馆:更换墙纸(新墙纸);
//或者是一段更复杂的代码,也是这样做的。
返回退出成功;
}
在帖子中尝试“Andrew Y”的解决方案:

他声称他的解决方案不依赖于更高层的工具包,所以它应该适用于任何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;
}

只是一个建议:为什么不搜索保存桌面墙纸的位置,然后替换它呢?这是可能的。但是,不管您的窗口管理或桌面环境如何,您如何找到它呢?这是这个问题的主要难点。。。这就是为什么我没有写它作为答案,我不知道路径在哪里。X11、Wayland和Mir不是窗口管理器。顺便说一句,如果你的程序更改了我的wallaper,它会在那一分钟被卸载。尽管我的DE每分钟都会更改,所以您的更改无论如何都不会持续。@n.m.您是对的。这些是寡居系统,而不是“窗口管理器”。我已经编辑了我的问题。至于我的程序,它会改变你的墙纸,只有当你要求它。一般来说,我想让它在Linux桌面上运行,所以我不想为“
if(desktop==“GNOME”){/*…*/}或者if(desktop==“KDE”){/*…*/}/*等等诸如此类的事情操心。我看到了so问题,但它没有回答我的问题。代码依赖于X11。那么这段带有Mir或Wayland的代码呢?没有通用的API。和平号和威兰仍然是利基产品。如果你关心它们,你就必须分别为它们找到解决方案。