保存图标像素数据指针以便退出时释放对应的内存
This commit is contained in:
52
src/main.c
52
src/main.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user