c++linuxgnomewallpaperdesktop-wallpaper

Changing wallpaper on Linux programmatically


How would I change the wallpaper on a Linux desktop (using GNOME) within a C/C++ program? Is there a system API to do it?


Solution

  • Though the question was gnome-specific, there's also a way to deal with the wallpaper that is not depepndant on the higher layer toolkits. You should be able to deal with the root window (which the wallpaper is, in fact) by studying the source of xsetroot.c, the most interesting part of which I copypaste here:

    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;
    }