mirror of
https://github.com/swaywm/sway.git
synced 2026-04-17 06:46:32 -04:00
Finds paths to icon files using libsfdo. Libsfdo is currently an
optional compile time dependency. This means the former code paths are all retained and new ones are wrapped in #if HAVE_LIBSFDO. Behavior should be identical now between the two code paths. Later commits will add the handling of icons specified as absolute paths which both former swaybar code and libsfdo have thus far avoided.
This commit is contained in:
parent
34d2020042
commit
478c77a69b
14 changed files with 220 additions and 23 deletions
|
|
@ -8,6 +8,7 @@ lib_sway_common = static_library(
|
||||||
'loop.c',
|
'loop.c',
|
||||||
'list.c',
|
'list.c',
|
||||||
'pango.c',
|
'pango.c',
|
||||||
|
'sfdo.c',
|
||||||
'stringop.c',
|
'stringop.c',
|
||||||
'util.c'
|
'util.c'
|
||||||
),
|
),
|
||||||
|
|
|
||||||
95
common/sfdo.c
Normal file
95
common/sfdo.c
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sfdo-basedir.h>
|
||||||
|
#include <sfdo-desktop.h>
|
||||||
|
#include <sfdo-icon.h>
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
#include "sfdo.h"
|
||||||
|
|
||||||
|
char *sfdo_icon_lookup_extended(struct sfdo *sfdo, char *icon_name, int target_size, int scale) {
|
||||||
|
int lookup_options = SFDO_ICON_THEME_LOOKUP_OPTIONS_DEFAULT;
|
||||||
|
struct sfdo_icon_file *icon_file = \
|
||||||
|
sfdo_icon_theme_lookup(sfdo->icon_theme, icon_name, SFDO_NT, \
|
||||||
|
target_size, scale, lookup_options);
|
||||||
|
char *icon_path = NULL;
|
||||||
|
if (icon_file && icon_file != SFDO_ICON_FILE_INVALID) {
|
||||||
|
icon_path = strdup(sfdo_icon_file_get_path(icon_file, NULL));
|
||||||
|
}
|
||||||
|
sfdo_icon_file_destroy(icon_file);
|
||||||
|
return icon_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sfdo *sfdo_create(char *icon_theme) {
|
||||||
|
if (!icon_theme) {
|
||||||
|
goto error_null;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sfdo *sfdo = calloc(1, sizeof(struct sfdo));
|
||||||
|
if (!sfdo) {
|
||||||
|
goto error_calloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sfdo_basedir_ctx *basedir_ctx = sfdo_basedir_ctx_create();
|
||||||
|
if (!basedir_ctx) {
|
||||||
|
goto error_basedir_ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
sfdo->desktop_ctx = sfdo_desktop_ctx_create(basedir_ctx);
|
||||||
|
if (!sfdo->desktop_ctx) {
|
||||||
|
goto error_desktop_ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
sfdo->icon_ctx = sfdo_icon_ctx_create(basedir_ctx);
|
||||||
|
if (!sfdo->icon_ctx) {
|
||||||
|
goto error_icon_ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
sfdo->desktop_db = sfdo_desktop_db_load(sfdo->desktop_ctx, NULL);
|
||||||
|
if (!sfdo->desktop_db) {
|
||||||
|
goto error_desktop_db;
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_options = SFDO_ICON_THEME_LOAD_OPTIONS_DEFAULT
|
||||||
|
| SFDO_ICON_THEME_LOAD_OPTION_ALLOW_MISSING
|
||||||
|
| SFDO_ICON_THEME_LOAD_OPTION_RELAXED;
|
||||||
|
|
||||||
|
sfdo->icon_theme = sfdo_icon_theme_load(sfdo->icon_ctx, icon_theme, load_options);
|
||||||
|
if (!sfdo->icon_theme) {
|
||||||
|
goto error_icon_theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
sfdo_basedir_ctx_destroy(basedir_ctx);
|
||||||
|
|
||||||
|
sway_log(SWAY_INFO, "Successfully setup sfdo with icon theme %s", icon_theme);
|
||||||
|
return sfdo;
|
||||||
|
|
||||||
|
error_icon_theme:
|
||||||
|
sfdo_desktop_db_destroy(sfdo->desktop_db);
|
||||||
|
error_desktop_db:
|
||||||
|
sfdo_icon_ctx_destroy(sfdo->icon_ctx);
|
||||||
|
error_icon_ctx:
|
||||||
|
sfdo_desktop_ctx_destroy(sfdo->desktop_ctx);
|
||||||
|
error_desktop_ctx:
|
||||||
|
sfdo_basedir_ctx_destroy(basedir_ctx);
|
||||||
|
error_basedir_ctx:
|
||||||
|
free(sfdo);
|
||||||
|
error_calloc:
|
||||||
|
error_null:
|
||||||
|
// it's safe to call with null
|
||||||
|
sway_log(SWAY_ERROR, "Failed to setup sfdo with icon theme %s", icon_theme);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sfdo_destroy(struct sfdo *sfdo) {
|
||||||
|
if (!sfdo) {
|
||||||
|
sway_log(SWAY_DEBUG, "Null sfdo passed in");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sfdo_desktop_ctx_destroy(sfdo->desktop_ctx);
|
||||||
|
sfdo_icon_ctx_destroy(sfdo->icon_ctx);
|
||||||
|
sfdo_desktop_db_destroy(sfdo->desktop_db);
|
||||||
|
sfdo_icon_theme_destroy(sfdo->icon_theme);
|
||||||
|
free(sfdo);
|
||||||
|
sway_log(SWAY_DEBUG, "Successfully destroyed sfdo");
|
||||||
|
}
|
||||||
19
include/sfdo.h
Normal file
19
include/sfdo.h
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef _SWAY_SFDO_H
|
||||||
|
#define _SWAY_SFDO_H
|
||||||
|
|
||||||
|
#include <sfdo-desktop.h>
|
||||||
|
#include <sfdo-icon.h>
|
||||||
|
#include <sfdo-basedir.h>
|
||||||
|
|
||||||
|
struct sfdo {
|
||||||
|
struct sfdo_desktop_ctx *desktop_ctx;
|
||||||
|
struct sfdo_icon_ctx *icon_ctx;
|
||||||
|
struct sfdo_desktop_db *desktop_db;
|
||||||
|
struct sfdo_icon_theme *icon_theme;
|
||||||
|
};
|
||||||
|
|
||||||
|
char *sfdo_icon_lookup_extended(struct sfdo *sfdo, char *icon_name, int target_size, int scale);
|
||||||
|
struct sfdo *sfdo_create(char *icon_theme);
|
||||||
|
void sfdo_destroy(struct sfdo *sfdo);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -399,8 +399,11 @@ struct bar_config {
|
||||||
char *binding_mode_text;
|
char *binding_mode_text;
|
||||||
} colors;
|
} colors;
|
||||||
|
|
||||||
#if HAVE_TRAY
|
#if HAVE_TRAY || HAVE_LIBSFDO
|
||||||
char *icon_theme;
|
char *icon_theme;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_TRAY
|
||||||
struct wl_list tray_bindings; // struct tray_binding::link
|
struct wl_list tray_bindings; // struct tray_binding::link
|
||||||
list_t *tray_outputs; // char *
|
list_t *tray_outputs; // char *
|
||||||
int tray_padding;
|
int tray_padding;
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,11 @@
|
||||||
#if WLR_HAS_XWAYLAND
|
#if WLR_HAS_XWAYLAND
|
||||||
#include "sway/xwayland.h"
|
#include "sway/xwayland.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_LIBSFDO
|
#if HAVE_LIBSFDO
|
||||||
#include <sfdo-desktop.h>
|
#include "sfdo.h"
|
||||||
#include <sfdo-icon.h>
|
|
||||||
#include <sfdo-basedir.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct sway_transaction;
|
struct sway_transaction;
|
||||||
|
|
||||||
struct sway_session_lock {
|
struct sway_session_lock {
|
||||||
|
|
@ -28,15 +28,6 @@ struct sway_session_lock {
|
||||||
struct wl_listener destroy;
|
struct wl_listener destroy;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if HAVE_LIBSFDO
|
|
||||||
struct sfdo {
|
|
||||||
struct sfdo_desktop_ctx *desktop_ctx;
|
|
||||||
struct sfdo_icon_ctx *icon_ctx;
|
|
||||||
struct sfdo_desktop_db *desktop_db;
|
|
||||||
struct sfdo_icon_theme *icon_theme;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct sway_server {
|
struct sway_server {
|
||||||
struct wl_display *wl_display;
|
struct wl_display *wl_display;
|
||||||
struct wl_event_loop *wl_event_loop;
|
struct wl_event_loop *wl_event_loop;
|
||||||
|
|
@ -210,9 +201,4 @@ void set_rr_scheduling(void);
|
||||||
|
|
||||||
void handle_new_tearing_hint(struct wl_listener *listener, void *data);
|
void handle_new_tearing_hint(struct wl_listener *listener, void *data);
|
||||||
|
|
||||||
#if HAVE_LIBSFDO
|
|
||||||
struct sfdo *sfdo_create(char *theme);
|
|
||||||
void sfdo_destroy(struct sfdo *sfdo);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,10 @@ struct swaybar_tray;
|
||||||
struct swaybar_workspace;
|
struct swaybar_workspace;
|
||||||
struct loop;
|
struct loop;
|
||||||
|
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
struct sfdo;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct swaybar {
|
struct swaybar {
|
||||||
char *id;
|
char *id;
|
||||||
char *mode;
|
char *mode;
|
||||||
|
|
@ -50,6 +54,10 @@ struct swaybar {
|
||||||
struct swaybar_tray *tray;
|
struct swaybar_tray *tray;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
struct sfdo *sfdo;
|
||||||
|
#endif
|
||||||
|
|
||||||
bool running;
|
bool running;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,10 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <pango/pangocairo.h>
|
#include <pango/pangocairo.h>
|
||||||
|
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
#include "sfdo.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
struct box_colors {
|
struct box_colors {
|
||||||
uint32_t border;
|
uint32_t border;
|
||||||
uint32_t background;
|
uint32_t background;
|
||||||
|
|
@ -73,13 +77,20 @@ struct swaybar_config {
|
||||||
struct box_colors binding_mode;
|
struct box_colors binding_mode;
|
||||||
} colors;
|
} colors;
|
||||||
|
|
||||||
#if HAVE_TRAY
|
#if HAVE_TRAY || HAVE_LIBSFDO
|
||||||
char *icon_theme;
|
char *icon_theme;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_TRAY
|
||||||
struct wl_list tray_bindings; // struct tray_binding::link
|
struct wl_list tray_bindings; // struct tray_binding::link
|
||||||
bool tray_hidden;
|
bool tray_hidden;
|
||||||
list_t *tray_outputs; // char *
|
list_t *tray_outputs; // char *
|
||||||
int tray_padding;
|
int tray_padding;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
struct sfdo *sfdo;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#if HAVE_TRAY
|
#if HAVE_TRAY
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,14 @@ void free_bar_config(struct bar_config *bar) {
|
||||||
free(bar->colors.binding_mode_border);
|
free(bar->colors.binding_mode_border);
|
||||||
free(bar->colors.binding_mode_bg);
|
free(bar->colors.binding_mode_bg);
|
||||||
free(bar->colors.binding_mode_text);
|
free(bar->colors.binding_mode_text);
|
||||||
|
|
||||||
|
// this is to cover the case where tray support is not compiled in
|
||||||
|
// but we have libsfdo support which implies at least a default
|
||||||
|
// icon_theme string was allocated
|
||||||
|
#if HAVE_LIBSFDO && !HAVE_TRAY
|
||||||
|
free(bar->icone_theme);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if HAVE_TRAY
|
#if HAVE_TRAY
|
||||||
list_free_items_and_destroy(bar->tray_outputs);
|
list_free_items_and_destroy(bar->tray_outputs);
|
||||||
free(bar->icon_theme);
|
free(bar->icon_theme);
|
||||||
|
|
@ -170,6 +178,13 @@ struct bar_config *default_bar_config(void) {
|
||||||
bar->colors.binding_mode_bg = NULL;
|
bar->colors.binding_mode_bg = NULL;
|
||||||
bar->colors.binding_mode_text = NULL;
|
bar->colors.binding_mode_text = NULL;
|
||||||
|
|
||||||
|
// we need some default when we initialize sfdo
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
if (!(bar->icon_theme = strdup("Hicolor"))) {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if HAVE_TRAY
|
#if HAVE_TRAY
|
||||||
bar->tray_padding = 2;
|
bar->tray_padding = 2;
|
||||||
wl_list_init(&bar->tray_bindings);
|
wl_list_init(&bar->tray_bindings);
|
||||||
|
|
|
||||||
|
|
@ -70,9 +70,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_LIBSFDO
|
#if HAVE_LIBSFDO
|
||||||
#include <sfdo-basedir.h>
|
#include "sfdo.h"
|
||||||
#include <sfdo-desktop.h>
|
|
||||||
#include <sfdo-icon.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SWAY_XDG_SHELL_VERSION 5
|
#define SWAY_XDG_SHELL_VERSION 5
|
||||||
|
|
|
||||||
|
|
@ -537,6 +537,9 @@ static void free_seats(struct wl_list *list) {
|
||||||
void bar_teardown(struct swaybar *bar) {
|
void bar_teardown(struct swaybar *bar) {
|
||||||
#if HAVE_TRAY
|
#if HAVE_TRAY
|
||||||
destroy_tray(bar->tray);
|
destroy_tray(bar->tray);
|
||||||
|
#endif
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
sfdo_destroy(bar->config->sfdo);
|
||||||
#endif
|
#endif
|
||||||
free_outputs(&bar->outputs);
|
free_outputs(&bar->outputs);
|
||||||
free_outputs(&bar->unused_outputs);
|
free_outputs(&bar->unused_outputs);
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,10 @@
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
#include "sfdo.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
uint32_t parse_position(const char *position) {
|
uint32_t parse_position(const char *position) {
|
||||||
uint32_t horiz = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT |
|
uint32_t horiz = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT |
|
||||||
ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT;
|
ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT;
|
||||||
|
|
@ -131,5 +135,15 @@ void free_config(struct swaybar_config *config) {
|
||||||
|
|
||||||
free(config->icon_theme);
|
free(config->icon_theme);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_LIBSFDO && !HAVE_TRAY
|
||||||
|
free(config->icon_theme);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
sfdo_destroy(config->sfdo);
|
||||||
|
sway_log(SWAY_DEBUG, "Destroyed swaybar sfdo");
|
||||||
|
#endif
|
||||||
|
|
||||||
free(config);
|
free(config);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,10 @@
|
||||||
#include "stringop.h"
|
#include "stringop.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
#include "sfdo.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
void ipc_send_workspace_command(struct swaybar *bar, const char *ws) {
|
void ipc_send_workspace_command(struct swaybar *bar, const char *ws) {
|
||||||
uint32_t size = strlen("workspace \"\"") + strlen(ws);
|
uint32_t size = strlen("workspace \"\"") + strlen(ws);
|
||||||
for (size_t i = 0; i < strlen(ws); ++i) {
|
for (size_t i = 0; i < strlen(ws); ++i) {
|
||||||
|
|
@ -330,6 +334,10 @@ static bool ipc_parse_config(
|
||||||
|
|
||||||
if ((json_object_object_get_ex(bar_config, "icon_theme", &icon_theme))) {
|
if ((json_object_object_get_ex(bar_config, "icon_theme", &icon_theme))) {
|
||||||
config->icon_theme = strdup(json_object_get_string(icon_theme));
|
config->icon_theme = strdup(json_object_get_string(icon_theme));
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
sfdo_destroy(config->sfdo);
|
||||||
|
config->sfdo = sfdo_create(config->icon_theme);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,15 @@ if have_tray
|
||||||
swaybar_deps += sdbus
|
swaybar_deps += sdbus
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if have_libsfdo
|
||||||
|
swaybar_deps += [
|
||||||
|
sfdo_basedir,
|
||||||
|
sfdo_desktop,
|
||||||
|
sfdo_desktop_file,
|
||||||
|
sfdo_icon
|
||||||
|
]
|
||||||
|
endif
|
||||||
|
|
||||||
executable(
|
executable(
|
||||||
'swaybar', [
|
'swaybar', [
|
||||||
'bar.c',
|
'bar.c',
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <cairo.h>
|
#include <cairo.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <sfdo-common.h>
|
||||||
|
#include <sfdo-icon.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
@ -18,6 +20,10 @@
|
||||||
#include "stringop.h"
|
#include "stringop.h"
|
||||||
#include "wlr-layer-shell-unstable-v1-client-protocol.h"
|
#include "wlr-layer-shell-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
#if HAVE_LIBSFDO
|
||||||
|
#include "sfdo.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO menu
|
// TODO menu
|
||||||
|
|
||||||
static bool sni_ready(struct swaybar_sni *sni) {
|
static bool sni_ready(struct swaybar_sni *sni) {
|
||||||
|
|
@ -420,15 +426,36 @@ static void reload_sni(struct swaybar_sni *sni, char *icon_theme,
|
||||||
char *icon_name = sni->status[0] == 'N' ?
|
char *icon_name = sni->status[0] == 'N' ?
|
||||||
sni->attention_icon_name : sni->icon_name;
|
sni->attention_icon_name : sni->icon_name;
|
||||||
if (icon_name) {
|
if (icon_name) {
|
||||||
|
char *icon_path = NULL;
|
||||||
|
#if !HAVE_LIBSFDO
|
||||||
list_t *icon_search_paths = create_list();
|
list_t *icon_search_paths = create_list();
|
||||||
list_cat(icon_search_paths, sni->tray->basedirs);
|
list_cat(icon_search_paths, sni->tray->basedirs);
|
||||||
if (sni->icon_theme_path) {
|
if (sni->icon_theme_path) {
|
||||||
list_add(icon_search_paths, sni->icon_theme_path);
|
list_add(icon_search_paths, sni->icon_theme_path);
|
||||||
}
|
}
|
||||||
char *icon_path = find_icon(sni->tray->themes, icon_search_paths,
|
icon_path = find_icon(sni->tray->themes, icon_search_paths,
|
||||||
icon_name, target_size, icon_theme,
|
icon_name, target_size, icon_theme,
|
||||||
&sni->min_size, &sni->max_size);
|
&sni->min_size, &sni->max_size);
|
||||||
|
#else
|
||||||
|
struct sfdo *sfdo = sni->tray->bar->config->sfdo;
|
||||||
|
if (sfdo) {
|
||||||
|
int lookup_options = SFDO_ICON_THEME_LOOKUP_OPTIONS_DEFAULT;
|
||||||
|
int scale = 1;
|
||||||
|
struct sfdo_icon_file *icon_file = \
|
||||||
|
sfdo_icon_theme_lookup(sfdo->icon_theme, icon_name, SFDO_NT, \
|
||||||
|
target_size, scale, lookup_options);
|
||||||
|
if (!icon_file || icon_file == SFDO_ICON_FILE_INVALID) {
|
||||||
|
sway_log(SWAY_ERROR, "sfdo: icon %s invalid or not found in theme %s at size %d", \
|
||||||
|
icon_name, icon_theme, target_size);
|
||||||
|
} else {
|
||||||
|
icon_path = strdup(sfdo_icon_file_get_path(icon_file, NULL));
|
||||||
|
}
|
||||||
|
sfdo_icon_file_destroy(icon_file);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if !HAVE_LIBSFDO
|
||||||
list_free(icon_search_paths);
|
list_free(icon_search_paths);
|
||||||
|
#endif
|
||||||
if (icon_path) {
|
if (icon_path) {
|
||||||
cairo_surface_destroy(sni->icon);
|
cairo_surface_destroy(sni->icon);
|
||||||
sni->icon = load_image(icon_path);
|
sni->icon = load_image(icon_path);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue