以编程方式更改Linux上的壁纸

如何在C / C ++程序中更改Linux桌面上的壁纸(使用GNOME)? 有没有一个系统API来做到这一点?

Solutions Collecting From Web of "以编程方式更改Linux上的壁纸"

虽然问题是gnome特定的,但也有一种方法来处理在高层工具包上不是deppndant的壁纸。 你应该能够通过研究xsetroot.c的源头来处理根窗口(实际上是壁纸),这是我在这里复制的最有趣的部分:

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

你可以使用gconf库来做到这一点。 以下示例是更改背景的完整程序:

 // bkgmanage.c #include <glib.h> #include <gconf/gconf-client.h> #include <stdio.h> typedef enum { WALLPAPER_ALIGN_TILED = 0, WALLPAPER_ALIGN_CENTERED = 1, WALLPAPER_ALIGN_STRETCHED = 2, WALLPAPER_ALIGN_SCALED = 3, WALLPAPER_NONE = 4 } WallpaperAlign; gboolean set_as_wallpaper( const gchar *image_path, WallpaperAlign align ) { GConfClient *client; char *options = "none"; client = gconf_client_get_default(); // TODO: check that image_path is a file if ( image_path == NULL ) options = "none"; else { gconf_client_set_string( client, "/desktop/gnome/background/picture_filename", image_path, NULL ); switch ( align ) { case WALLPAPER_ALIGN_TILED: options = "wallpaper"; break; case WALLPAPER_ALIGN_CENTERED: options = "centered"; break; case WALLPAPER_ALIGN_STRETCHED: options = "stretched"; break; case WALLPAPER_ALIGN_SCALED: options = "scaled"; break; case WALLPAPER_NONE: options = "none"; break; } } gboolean result = gconf_client_set_string( client, "/desktop/gnome/background/picture_options", options, NULL); g_object_unref( G_OBJECT(client) ); return result; } int main(int argc, const char* argv[]) { if ( argc > 1 ) { printf( "Setting %s as wallpaper... ", argv[1] ); if ( set_as_wallpaper( argv[1], WALLPAPER_ALIGN_STRETCHED ) ) printf( "Ok\n" ); else printf( "Failed\n" ); } else printf( "Usage: ./bkgmanage <filename>\n" ); return 0; } 

上面的源代码是基于gthumb项目的。 它可以用下面的字符串编译:

 gcc -Wall -g `pkg-config --libs --cflags glib-2.0 gconf-2.0` bkgmanage.c -o bkgmanage 

如果没有别的,你可以使用system()来调用这里建议的命令行之一:

http://www.linuxquestions.org/questions/linux-general-1/change-background-via-command-line-350936/