diff --git a/src/config.c b/src/config.c index d0b18c2..be3def9 100644 --- a/src/config.c +++ b/src/config.c @@ -1,6 +1,9 @@ #include "config.h" +#include #include /* 壁纸列表,支持通配符和 shell 环境变量拼接,最后以 NULL 结尾 */ const char *wallpager_list[] = {NULL}; +/* 壁纸切换间隔(单位:秒),0 表示不切换 */ +const uint32_t wallpaper_interval = 0; diff --git a/src/include/config.h b/src/include/config.h index 0375e13..02cc801 100644 --- a/src/include/config.h +++ b/src/include/config.h @@ -1,3 +1,6 @@ #pragma once +#include + extern const char *wallpager_list[]; +extern const uint32_t wallpaper_interval; diff --git a/src/main.c b/src/main.c index 9d5ce4f..7c3ebe9 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -15,6 +16,7 @@ static void init_monitors(void); static void init_wallpaper(void); +static gboolean update_wallpaper(gpointer user_data); static void set_wallpaper_by_index(uint32_t index); static wallpaper_config_t *parse_wallpaper_config(const char **wallpapers); static void free_wallpaper_config(wallpaper_config_t *wallpaper_config); @@ -82,8 +84,28 @@ void init_monitors(void) { void init_wallpaper(void) { wallpaper_config = parse_wallpaper_config(wallpager_list); if (!wallpaper_config) return; + if (wallpaper_interval) { + g_timeout_add_seconds(wallpaper_interval, update_wallpaper, + wallpaper_config); + } - set_wallpaper_by_index(0); + update_wallpaper(wallpaper_config); +} + +gboolean update_wallpaper(gpointer user_data) { + wallpaper_config_t *wc = user_data; + if (!wc) return false; + + static uint32_t index = 0; + set_wallpaper_by_index(index); + uint32_t monitor_count = 0; + for (monitor_t *m = monitors; m; m = m->next) monitor_count++; + if (monitor_count) { + index += monitor_count; + index %= wc->count; + } + + return true; } void set_wallpaper_by_index(uint32_t index) {