保存图标像素数据指针以便退出时释放对应的内存

This commit is contained in:
2025-09-01 15:31:45 +08:00
parent e58a43386d
commit 88d9dfd714
4 changed files with 46 additions and 51 deletions

View File

@@ -502,37 +502,35 @@ void free_wallpaper_config(wallpaper_config_t *wallpaper_config) {
void init_icons(void) {
typedef struct {
const char *img_path;
cairo_surface_t **icon;
uint32_t **pixels;
icon_res_t *icon_res;
} icon_path_surface_map_t;
if (icons) return;
icons = ecalloc(1, sizeof(icons_t));
icon_path_surface_map_t map[] = {
{NET_DOWN_ICON, (cairo_surface_t **)&icons->net_down,
&icons->net_down_pixels},
{NET_UP_ICON, (cairo_surface_t **)&icons->net_up, &icons->net_up_pixels},
{SPEAKER_ICON, (cairo_surface_t **)&icons->volume, &icons->volume_pixels},
{MEM_ICON, (cairo_surface_t **)&icons->memory, &icons->memory_pixels},
{CPU_ICON, (cairo_surface_t **)&icons->cpu, &icons->cpu_pixels},
{CLOCK_ICON, (cairo_surface_t **)&icons->clock, &icons->clock_pixels},
{NET_DOWN_ICON, &icons->net_down}, {NET_UP_ICON, &icons->net_up},
{SPEAKER_ICON, &icons->volume}, {MEM_ICON, &icons->memory},
{CPU_ICON, &icons->cpu}, {CLOCK_ICON, &icons->clock},
};
for (int i = 0; i < LENGTH(map); i++) {
const char *path = map[i].img_path;
uint32_t **pixels_addr = map[i].pixels;
cairo_surface_t **surface_addr = map[i].icon;
icon_res_t *res = map[i].icon_res;
if (path && strlen(path)) {
*pixels_addr =
uint32_t *pixels =
generate_icon_pixels(path, bar_height, bar_height, status_icon_pad);
cairo_format_t format = CAIRO_FORMAT_ARGB32;
int stride = cairo_format_stride_for_width(format, bar_height);
cairo_surface_t *surface = cairo_image_surface_create_for_data(
(uint8_t *)*pixels_addr, format, bar_height, bar_height, stride);
(uint8_t *)pixels, format, bar_height, bar_height, stride);
if (cairo_surface_status(surface) == CAIRO_STATUS_SUCCESS) {
*surface_addr = surface;
res->pixels = pixels;
res->surface = surface;
} else {
cairo_surface_destroy(surface);
free(pixels);
res->pixels = NULL;
res->surface = NULL;
}
}
}
@@ -541,19 +539,21 @@ void init_icons(void) {
void clean_icons(void) {
if (!icons) return;
if (icons->net_down) cairo_surface_destroy(icons->net_down);
if (icons->net_up) cairo_surface_destroy(icons->net_up);
if (icons->volume) cairo_surface_destroy(icons->volume);
if (icons->memory) cairo_surface_destroy(icons->memory);
if (icons->cpu) cairo_surface_destroy(icons->cpu);
if (icons->clock) cairo_surface_destroy(icons->clock);
icon_res_t icon_res_list[] = {
icons->net_down, icons->net_up, icons->volume,
icons->memory, icons->cpu, icons->clock,
};
for (int i = 0; i < LENGTH(icon_res_list); i++) {
icon_res_t res = icon_res_list[i];
if (res.surface) {
cairo_surface_finish(res.surface);
free(res.pixels);
cairo_surface_destroy(res.surface);
if (icons->net_down_pixels) free(icons->net_down);
if (icons->net_up_pixels) free(icons->net_up);
if (icons->volume_pixels) free(icons->volume);
if (icons->memory_pixels) free(icons->memory);
if (icons->cpu_pixels) free(icons->cpu);
if (icons->clock_pixels) free(icons->clock);
res.pixels = NULL;
res.surface = NULL;
}
}
free(icons);
icons = NULL;