2009-08-03 10 views
6

C/C++プログラム内でLinuxデスクトップ(GNOMEを使用)で壁紙を変更するにはどうすればよいですか?それを行うシステムAPIはありますか?Linuxで壁紙をプログラムで変更する

+1

あなたが、行ってください方法を見つけ出す場合それ、私はしばらくの間それをやりたいと思っていました。 – fauxCoder

答えて

9

:それは次の文字列を指定してコンパイルすることができます。あなたが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; 
} 
+0

ありがとうございます。それは完全に機能します。 – computergeek6

2

何もない場合は、おそらく、コマンドラインは、ここで提案の一つ呼び出すためにsystem()を使用することができます。

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

+2

OPはKDEではなく、GNOMEについて尋ねました。 –

+0

誰が気にしますか?リンクされたスレッドはどちらの質問にも答えません。 – innaM

+1

スレッドに#5を投稿すると、GNOMEに背景画像を設定するgconftool-2コマンドが記述されています。 – Amber

18

をあなたはそれを行うには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プロジェクトに基づいています。質問は、上位層のツールキットでdepepndantない壁紙に対処する方法はまた、GNOME特有ありますたが

gcc -Wall -g `pkg-config --libs --cflags glib-2.0 gconf-2.0` bkgmanage.c -o bkgmanage 
関連する問題