void desktop_entry_init(struct server *server);
void desktop_entry_finish(struct server *server);
-struct lab_img *desktop_entry_icon_lookup(struct server *server,
- const char *app_id, int size, float scale);
+struct lab_img *desktop_entry_load_icon_from_app_id(
+ struct server *server, const char *app_id, int size, float scale);
+
+struct lab_img *desktop_entry_load_icon(
+ struct server *server, const char *icon_name, int size, float scale);
/**
* desktop_entry_name_lookup() - return the application name
}
struct lab_img *
-desktop_entry_icon_lookup(struct server *server, const char *app_id, int size,
- float scale)
+desktop_entry_load_icon(struct server *server, const char *icon_name, int size, float scale)
{
- if (string_null_or_empty(app_id)) {
+ /* static analyzer isn't able to detect the NULL check in string_null_or_empty() */
+ if (string_null_or_empty(icon_name) || !icon_name) {
return NULL;
}
return NULL;
}
- const char *icon_name = NULL;
- struct sfdo_desktop_entry *entry = get_desktop_entry(sfdo, app_id);
- if (entry) {
- icon_name = sfdo_desktop_entry_get_icon(entry, NULL);
- }
-
/*
* libsfdo doesn't support loading icons for fractional scales,
* so round down and increase the icon size to compensate.
struct icon_ctx ctx = {0};
int ret;
- if (!icon_name) {
- /* fall back to app id */
- ret = process_rel_name(&ctx, app_id, sfdo, lookup_size, lookup_scale);
- } else if (icon_name[0] == '/') {
+ if (icon_name[0] == '/') {
ret = process_abs_name(&ctx, icon_name);
} else {
- /* this should be the case for most icons */
ret = process_rel_name(&ctx, icon_name, sfdo, lookup_size, lookup_scale);
- /* Icon defined in .desktop file could not be loaded, retry with app_id */
- if (ret < 0) {
- ret = process_rel_name(&ctx, app_id, sfdo, lookup_size, lookup_scale);
- }
}
if (ret < 0) {
+ wlr_log(WLR_INFO, "failed to load icon file %s", icon_name);
return NULL;
}
struct lab_img *img = lab_img_load(convert_img_type(ctx.format), ctx.path, NULL);
free(ctx.path);
+ return img;
+}
+
+struct lab_img *
+desktop_entry_load_icon_from_app_id(struct server *server,
+ const char *app_id, int size, float scale)
+{
+ if (string_null_or_empty(app_id)) {
+ return NULL;
+ }
+
+ struct sfdo *sfdo = server->sfdo;
+ if (!sfdo) {
+ return NULL;
+ }
+ const char *icon_name = NULL;
+ struct sfdo_desktop_entry *entry = get_desktop_entry(sfdo, app_id);
+ if (entry) {
+ icon_name = sfdo_desktop_entry_get_icon(entry, NULL);
+ }
+
+ struct lab_img *img = desktop_entry_load_icon(server, icon_name, size, scale);
+ if (!img) {
+ /* Icon not defined in .desktop file or could not be loaded */
+ img = desktop_entry_load_icon(server, app_id, size, scale);
+ }
return img;
}