Improving error messages for icon loading
authorphillbush <phillbush@cock.li>
Wed, 12 Aug 2020 23:29:33 +0000 (20:29 -0300)
committerphillbush <phillbush@cock.li>
Wed, 12 Aug 2020 23:29:33 +0000 (20:29 -0300)
xmenu.c

diff --git a/xmenu.c b/xmenu.c
index 4407229..d6b2cde 100644 (file)
--- a/xmenu.c
+++ b/xmenu.c
@@ -574,6 +574,8 @@ parsestdin(void)
                        file = label + 4;
                        label = strtok(NULL, "\t\n");
                }
                        file = label + 4;
                        label = strtok(NULL, "\t\n");
                }
+               if (file && *file == '\0')
+                       errx(1, "blank icon filename");
 
                /* get the output */
                output = strtok(NULL, "\n");
 
                /* get the output */
                output = strtok(NULL, "\n");
@@ -888,13 +890,51 @@ static Imlib_Image
 loadicon(const char *file)
 {
        Imlib_Image icon;
 loadicon(const char *file)
 {
        Imlib_Image icon;
+       Imlib_Load_Error errcode;
+       const char *errstr;
        int width;
        int height;
        int imgsize;
 
        int width;
        int height;
        int imgsize;
 
-       icon = imlib_load_image(file);
-       if (icon == NULL)
-               errx(1, "could not load icon %s", file);
+       icon = imlib_load_image_with_error_return(file, &errcode);
+       if (icon == NULL) {
+               switch (errcode) {
+               case IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST:
+                       errstr = "file does not exist";
+                       break;
+               case IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY:
+                       errstr = "file is directory";
+                       break;
+               case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ:
+               case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE:
+                       errstr = "permission denied";
+                       break;
+               case IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT:
+                       errstr = "unknown file format";
+                       break;
+               case IMLIB_LOAD_ERROR_PATH_TOO_LONG:
+                       errstr = "path too long";
+                       break;
+               case IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT:
+               case IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY:
+               case IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE:
+                       errstr = "improper path";
+                       break;
+               case IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS:
+                       errstr = "too many symbolic links";
+                       break;
+               case IMLIB_LOAD_ERROR_OUT_OF_MEMORY:
+                       errstr = "out of memory";
+                       break;
+               case IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS:
+                       errstr = "out of file descriptors";
+                       break;
+               default:
+                       errstr = "unknown error";
+                       break;
+               }
+               errx(1, "could not load icon (%s): %s", errstr, file);
+       }
 
        imlib_context_set_image(icon);
 
 
        imlib_context_set_image(icon);