c++ - 以编程方式在 Linux 上更改墙纸

标签 c++ linux gnome wallpaper desktop-wallpaper

如何在 C/C++ 程序中更改 Linux 桌面(使用 GNOME)上的墙纸?是否有系统 API 可以做到这一点?

最佳答案

你可以使用 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

关于c++ - 以编程方式在 Linux 上更改墙纸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1220826/

相关文章:

svn - 通过 gnome-keyring 为 ssh(仅限)客户端颠覆客户端加密密码

c++ - 如何正确配置 Clang?

c++ - 将 HBITMAP 绘制到分层窗口上。怎么了?

linux - 检查文件系统百分比并使用 case 命令运行脚本

python - PyQt 4.8 Phenon.VideoPlayer 错误的视频状态

javascript - 未知选项-D Gjs

javascript - 参数 'sql' 的预期类型为 utf8,但得到的类型为 'object'

c++ - 如何命名一个带有索引的变量来存储输入的mxArray?

c++ - 当 z <= 0 时 glm::lookAt 垂直相机翻转

java - Spring Boot RequestMapping 不适用于 Linux Fedora 26