2009-08-03 25 views

回答

9

雖然問題是GNOME特有的,有也應對未在高層工具包depepndant牆紙的方式。其中,你應該能夠應付根窗口(其中壁紙,實際上)通過研究xsetroot.c,最有趣的部分源我copypaste這裏:

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

你可以使用gconf庫來做到這一點。下面的示例是一個完整的程序來改變背景:上gthumb項目

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

源以上爲基礎的。這可能與以下字符串進行編譯:

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