添加壁纸功能

This commit is contained in:
2025-08-10 02:07:57 +08:00
parent 751fce23c1
commit fc58edca2d
8 changed files with 241 additions and 21 deletions

View File

@@ -1,4 +1,5 @@
#include <glib.h>
#include <glibconfig.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
@@ -7,11 +8,14 @@
#include <wordexp.h>
#include "config.h"
#include "renderer.h"
#include "types.h"
#include "utils.h"
#include "xcb.h"
static void init_monitors(void);
static void init_wallpaper(void);
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);
static void cleanup(void);
@@ -19,9 +23,40 @@ static void cleanup(void);
static monitor_t *monitors = NULL;
static wallpaper_config_t *wallpaper_config = NULL;
/* 调试函数,开发完成后删除 */
static void print_monitor_list_info(monitor_t *monitor_list) {
for (monitor_t *m = monitor_list; m; m = m->next) {
printf("mon[%u]: x: %d, y: %d, width: %u, height: %u\n", m->index,
m->monitor_x, m->monitor_y, m->monitor_width, m->monitor_height);
}
}
static void print_wallpaper_config(wallpaper_config_t *config) {
if (!config) {
printf("no wallpaper\n");
return;
}
printf("wallpaper count: %u\n", config->count);
for (uint32_t i = 0; i < config->count; i++) {
printf("wallpaper[%02u]: %s\n", i, config->path_list[i]);
}
}
static void print_window_list(window_list_t *window_list) {
if (!window_list) {
printf("no window\n");
return;
}
for (uint32_t i = 0; i < window_list->count; i++) {
printf("window[%u]: 0x%x\n", i, window_list->list[i]);
}
}
/* 调试函数结束 */
void init_monitors(void) {
monitor_rect_t *mr = detect_monitor_rect();
uint32_t i = 0;
monitor_t *prev_monitor = NULL;
while (mr) {
monitor_t *m = ecalloc(1, sizeof(monitor_t));
m->monitor_x = mr->x;
@@ -30,10 +65,12 @@ void init_monitors(void) {
m->monitor_height = mr->height;
m->index = i;
printf("mon[%u]: x: %d, y: %d, w: %u, h: %u\n", i, mr->x, mr->y, mr->width,
mr->height);
if (!i) monitors = m;
if (prev_monitor) {
prev_monitor->next = m;
} else {
monitors = m;
}
prev_monitor = m;
i++;
monitor_rect_t *next_mr = mr->next;
@@ -42,6 +79,25 @@ void init_monitors(void) {
}
}
void init_wallpaper(void) {
wallpaper_config = parse_wallpaper_config(wallpager_list);
if (!wallpaper_config) return;
set_wallpaper_by_index(0);
}
void set_wallpaper_by_index(uint32_t index) {
if (!wallpaper_config) return;
rect_size_t *screen_size = get_screen_size();
uint32_t *wallpaper = generate_wallpaper(
wallpaper_config, monitors, index, screen_size->width, screen_size->height);
set_wallpaper(wallpaper);
free(screen_size);
free(wallpaper);
}
wallpaper_config_t *parse_wallpaper_config(const char **wallpapers) {
if (!wallpapers) return NULL;
@@ -105,26 +161,20 @@ int main(int argc, char *argv[]) {
die("another window manager is already running");
}
wallpaper_config = parse_wallpaper_config(wallpager_list);
if (wallpaper_config) {
printf("wallpaper count: %u\n", wallpaper_config->count);
for (uint32_t i = 0; i < wallpaper_config->count; i++) {
printf("wallpaper[%02u]: %s\n", i, wallpaper_config->path_list[i]);
}
}
init_monitors();
init_wallpaper();
window_list_t *window_list = scan_window_list();
if (window_list) {
for (uint32_t i = 0; i < window_list->count; i++) {
printf("window[%u]: 0x%x\n", i, window_list->list[i]);
}
} else {
printf("no window\n");
}
print_monitor_list_info(monitors);
print_wallpaper_config(wallpaper_config);
print_window_list(window_list);
free_window_list(window_list);
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
cleanup();
return 0;