mirror of
https://github.com/labwc/labwc.git
synced 2025-11-01 22:58:47 -04:00
icon-loader: refactor in preparation for supporting absolute icon names
No functional change intended.
This commit is contained in:
parent
340733e494
commit
be5472a840
1 changed files with 55 additions and 17 deletions
|
|
@ -4,6 +4,7 @@
|
||||||
#include <sfdo-basedir.h>
|
#include <sfdo-basedir.h>
|
||||||
#include <wlr/util/log.h>
|
#include <wlr/util/log.h>
|
||||||
#include "common/mem.h"
|
#include "common/mem.h"
|
||||||
|
#include "common/string-helpers.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "icon-loader.h"
|
#include "icon-loader.h"
|
||||||
#include "img/img-png.h"
|
#include "img/img-png.h"
|
||||||
|
|
@ -82,6 +83,45 @@ icon_loader_finish(struct server *server)
|
||||||
server->icon_loader = NULL;
|
server->icon_loader = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct icon_ctx {
|
||||||
|
char *path;
|
||||||
|
enum sfdo_icon_file_format format;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return 0 on success and -1 on error
|
||||||
|
* The calling function is responsible for free()ing ctx->path
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
process_rel_name(struct icon_ctx *ctx, const char *icon_name,
|
||||||
|
struct icon_loader *loader, int size, int scale)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
int lookup_options = SFDO_ICON_THEME_LOOKUP_OPTIONS_DEFAULT;
|
||||||
|
#if !HAVE_RSVG
|
||||||
|
lookup_options |= SFDO_ICON_THEME_LOOKUP_OPTION_NO_SVG;
|
||||||
|
#endif
|
||||||
|
struct sfdo_icon_file *icon_file = sfdo_icon_theme_lookup(
|
||||||
|
loader->icon_theme, icon_name, SFDO_NT, size, scale,
|
||||||
|
lookup_options);
|
||||||
|
if (!icon_file || icon_file == SFDO_ICON_FILE_INVALID) {
|
||||||
|
ret = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
ctx->path = xstrdup(sfdo_icon_file_get_path(icon_file, NULL));
|
||||||
|
ctx->format = sfdo_icon_file_get_format(icon_file);
|
||||||
|
out:
|
||||||
|
sfdo_icon_file_destroy(icon_file);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
process_abs_name(struct icon_ctx *ctx, const char *icon_name)
|
||||||
|
{
|
||||||
|
wlr_log(WLR_ERROR, "absolute paths not yet supported");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
struct lab_data_buffer *
|
struct lab_data_buffer *
|
||||||
icon_loader_lookup(struct server *server, const char *app_id, int size, int scale)
|
icon_loader_lookup(struct server *server, const char *app_id, int size, int scale)
|
||||||
{
|
{
|
||||||
|
|
@ -96,34 +136,33 @@ icon_loader_lookup(struct server *server, const char *app_id, int size, int scal
|
||||||
if (entry) {
|
if (entry) {
|
||||||
icon_name = sfdo_desktop_entry_get_icon(entry, NULL);
|
icon_name = sfdo_desktop_entry_get_icon(entry, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct icon_ctx ctx = {0};
|
||||||
|
int ret;
|
||||||
if (!icon_name) {
|
if (!icon_name) {
|
||||||
/* fall back to app id */
|
/* fall back to app id */
|
||||||
icon_name = app_id;
|
ret = process_rel_name(&ctx, app_id, loader, size, scale);
|
||||||
|
} else 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, loader, size, scale);
|
||||||
}
|
}
|
||||||
|
if (ret < 0) {
|
||||||
int lookup_options = SFDO_ICON_THEME_LOOKUP_OPTIONS_DEFAULT;
|
|
||||||
#if !HAVE_RSVG
|
|
||||||
lookup_options |= SFDO_ICON_THEME_LOOKUP_OPTION_NO_SVG;
|
|
||||||
#endif
|
|
||||||
struct sfdo_icon_file *icon_file = sfdo_icon_theme_lookup(
|
|
||||||
loader->icon_theme, icon_name, SFDO_NT, size, scale,
|
|
||||||
lookup_options);
|
|
||||||
if (!icon_file || icon_file == SFDO_ICON_FILE_INVALID) {
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct lab_data_buffer *icon_buffer = NULL;
|
struct lab_data_buffer *icon_buffer = NULL;
|
||||||
const char *icon_path = sfdo_icon_file_get_path(icon_file, NULL);
|
|
||||||
|
|
||||||
wlr_log(WLR_DEBUG, "loading icon file %s", icon_path);
|
wlr_log(WLR_DEBUG, "loading icon file %s", ctx.path);
|
||||||
|
|
||||||
switch (sfdo_icon_file_get_format(icon_file)) {
|
switch (ctx.format) {
|
||||||
case SFDO_ICON_FILE_FORMAT_PNG:
|
case SFDO_ICON_FILE_FORMAT_PNG:
|
||||||
img_png_load(icon_path, &icon_buffer);
|
img_png_load(ctx.path, &icon_buffer);
|
||||||
break;
|
break;
|
||||||
case SFDO_ICON_FILE_FORMAT_SVG:
|
case SFDO_ICON_FILE_FORMAT_SVG:
|
||||||
#if HAVE_RSVG
|
#if HAVE_RSVG
|
||||||
img_svg_load(icon_path, &icon_buffer, size * scale);
|
img_svg_load(ctx.path, &icon_buffer, size * scale);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case SFDO_ICON_FILE_FORMAT_XPM:
|
case SFDO_ICON_FILE_FORMAT_XPM:
|
||||||
|
|
@ -131,7 +170,6 @@ icon_loader_lookup(struct server *server, const char *app_id, int size, int scal
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sfdo_icon_file_destroy(icon_file);
|
free(ctx.path);
|
||||||
|
|
||||||
return icon_buffer;
|
return icon_buffer;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue