添加壁纸功能
This commit is contained in:
88
src/main.c
88
src/main.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user