summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2020-10-18 22:01:49 +0200
committerDave Davenport <qball@gmpclient.org>2020-10-18 22:01:49 +0200
commit6e9829033521d09240db7b084c8f761b1e8ed65e (patch)
tree603b66a94920a7cf81dbc4a36ce29974d83d4df4
parent5994df7f048492b234c2827cf9a7e313b356c6b8 (diff)
[RofiIconFetcher] Do image checking in icon fetcher, use nkutils-enum
-rw-r--r--include/rofi-icon-fetcher.h3
-rw-r--r--source/dialogs/filebrowser.c27
-rw-r--r--source/rofi-icon-fetcher.c79
3 files changed, 67 insertions, 42 deletions
diff --git a/include/rofi-icon-fetcher.h b/include/rofi-icon-fetcher.h
index 25db41df..daa3e5e6 100644
--- a/include/rofi-icon-fetcher.h
+++ b/include/rofi-icon-fetcher.h
@@ -45,5 +45,8 @@ uint32_t rofi_icon_fetcher_query ( const char *name, const int size );
*/
cairo_surface_t * rofi_icon_fetcher_get ( const uint32_t uid );
+
+
+gboolean rofi_icon_fetcher_file_is_image ( const char * const path );
/** @} */
#endif // ROFI_ICON_FETCHER_H
diff --git a/source/dialogs/filebrowser.c b/source/dialogs/filebrowser.c
index 426e3127..b2294a3a 100644
--- a/source/dialogs/filebrowser.c
+++ b/source/dialogs/filebrowser.c
@@ -36,8 +36,6 @@
#include <dirent.h>
-#include <config.h>
-
#include "mode.h"
#include "helper.h"
#include "mode-private.h"
@@ -344,29 +342,6 @@ static int file_browser_token_match ( const Mode *sw, rofi_int_matcher **tokens,
}
-const char * const image_exts[] = {".png",".PNG",".jpg",".JPG",".jpeg",".JPEG",".svg",".SVG"
-#ifdef HAVE_LIBGIF
- ,".gif",".GIF"
-#endif
-};
-static gboolean file_browser_is_image ( const char * const path )
-{
- if ( path == NULL ) {
- return FALSE;
- }
- const char *suf = strrchr(path, '.');
- if ( suf == NULL ) {
- return FALSE;
- }
- for ( uint32_t i = 0; i < G_N_ELEMENTS(image_exts); i++ ) {
- if ( g_strcmp0(suf,image_exts[i]) == 0 ) {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-
static cairo_surface_t *_get_icon ( const Mode *sw, unsigned int selected_line, int height )
{
FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw );
@@ -375,7 +350,7 @@ static cairo_surface_t *_get_icon ( const Mode *sw, unsigned int selected_line,
if ( dr->icon_fetch_uid > 0 ) {
return rofi_icon_fetcher_get ( dr->icon_fetch_uid );
}
- if ( file_browser_is_image ( dr->path ) ){
+ if ( rofi_icon_fetcher_file_is_image ( dr->path ) ){
dr->icon_fetch_uid = rofi_icon_fetcher_query ( dr->path, height );
} else {
dr->icon_fetch_uid = rofi_icon_fetcher_query ( icon_name[dr->type], height );
diff --git a/source/rofi-icon-fetcher.c b/source/rofi-icon-fetcher.c
index f0216473..2f0630e0 100644
--- a/source/rofi-icon-fetcher.c
+++ b/source/rofi-icon-fetcher.c
@@ -28,6 +28,8 @@
/** The log domain of this Helper. */
#define G_LOG_DOMAIN "Helpers.IconFetcher"
+#include <stdlib.h>
+#include <config.h>
#include "rofi-icon-fetcher.h"
#include "rofi-types.h"
@@ -39,13 +41,13 @@
#include "view.h"
#include "nkutils-xdg-theme.h"
+#include "nkutils-enum.h"
#include <stdint.h>
#include <jpeglib.h>
#include <setjmp.h>
-#include <config.h>
typedef struct
{
// Context for icon-themes.
@@ -288,6 +290,42 @@ done:
}
#endif
+enum {
+ IMAGE_PNG,
+ IMAGE_JPG,
+ IMAGE_JPEG,
+ IMAGE_SVG,
+#ifdef HAVE_LIBGIF
+ IMAGE_GIF,
+#endif
+ IMAGE_MAX_VALUES
+} RofiIconFetchDecoder;
+
+static const gchar * const _image_exts[IMAGE_MAX_VALUES] = {
+ [IMAGE_PNG] = ".png",
+ [IMAGE_JPG] = ".jpg",
+ [IMAGE_JPEG] = ".jpeg",
+ [IMAGE_SVG] = ".svg",
+#ifdef HAVE_LIBGIF
+ [IMAGE_GIF] = ".gif",
+#endif
+};
+
+gboolean rofi_icon_fetcher_file_is_image ( const char * const path )
+{
+ if ( path == NULL ) {
+ return FALSE;
+ }
+ const char *suf = strrchr(path, '.');
+ if ( suf == NULL ) {
+ return FALSE;
+ }
+
+ guint64 type;
+ gboolean r = nk_enum_parse ( suf, _image_exts, G_N_ELEMENTS(_image_exts), TRUE, FALSE, &type );
+ return r;
+}
+
static void rofi_icon_fetcher_worker ( thread_state *sdata, G_GNUC_UNUSED gpointer user_data )
{
g_debug ( "starting up icon fetching thread." );
@@ -316,24 +354,33 @@ static void rofi_icon_fetcher_worker ( thread_state *sdata, G_GNUC_UNUSED gpoint
}
}
cairo_surface_t *icon_surf = NULL;
- if ( g_str_has_suffix ( icon_path, ".png" ) || g_str_has_suffix ( icon_path, ".PNG" ) ) {
- icon_surf = cairo_image_surface_create_from_png ( icon_path );
+
+ const char *suf = strrchr(icon_path, '.');
+ if ( suf == NULL ) {
+ return ;
}
+
+ guint64 type;
+ gboolean is_image = nk_enum_parse ( suf, _image_exts, G_N_ELEMENTS(_image_exts), TRUE, FALSE, &type );
+ if ( is_image )
+ {
+ if ( type == IMAGE_PNG ) {
+ icon_surf = cairo_image_surface_create_from_png ( icon_path );
+ }
#ifdef HAVE_LIBGIF
- else if ( g_str_has_suffix ( icon_path, ".gif" ) || g_str_has_suffix ( icon_path, ".GIF" ) ) {
- icon_surf = cairo_image_surface_create_from_gif ( icon_path );
- }
+ else if ( type == IMAGE_GIF ) {
+ icon_surf = cairo_image_surface_create_from_gif ( icon_path );
+ }
#endif
- else if ( g_str_has_suffix ( icon_path, ".jpeg" ) || g_str_has_suffix ( icon_path, ".jpg" ) ||
- g_str_has_suffix ( icon_path, ".JPEG" ) || g_str_has_suffix ( icon_path, ".JPG" )
- ) {
- icon_surf = cairo_image_surface_create_from_jpeg ( icon_path );
- }
- else if ( g_str_has_suffix ( icon_path, ".svg" ) || g_str_has_suffix ( icon_path, ".SVG" ) ) {
- icon_surf = cairo_image_surface_create_from_svg ( icon_path, sentry->size );
- }
- else {
- g_debug ( "icon type not yet supported: %s", icon_path );
+ else if ( type == IMAGE_JPG || type == IMAGE_JPEG ) {
+ icon_surf = cairo_image_surface_create_from_jpeg ( icon_path );
+ }
+ else if ( type == IMAGE_SVG ) {
+ icon_surf = cairo_image_surface_create_from_svg ( icon_path, sentry->size );
+ }
+ else {
+ g_debug ( "icon type not yet supported: %s", icon_path );
+ }
}
if ( icon_surf ) {
if ( cairo_surface_status ( icon_surf ) == CAIRO_STATUS_SUCCESS ) {