From d15264ea3213a56113952d16b042fd4fb249da6d Mon Sep 17 00:00:00 2001 From: Bert Date: Mon, 11 Apr 2011 16:58:38 +0200 Subject: [PATCH] Remove invalid images when loading them; refactorings --- icon.h | 180 ------------------------------------------------------- image.c | 57 +++++------------- image.h | 2 - main.c | 154 +++++++++++++++++++++++++---------------------- thumbs.c | 54 ++++++++--------- thumbs.h | 6 +- window.c | 86 +++++++++++++++----------- window.h | 1 + 8 files changed, 179 insertions(+), 361 deletions(-) delete mode 100644 icon.h diff --git a/icon.h b/icon.h deleted file mode 100644 index bdd83b4..0000000 --- a/icon.h +++ /dev/null @@ -1,180 +0,0 @@ -#ifndef ICON_H -#define ICON_H - -#include - -static DATA32 icon_invalid[] = { - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, - 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xffbbbbbb, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, 0xff444444, - 0xff444444, 0xff444444, 0xff444444, 0xff444444 -}; - -#endif /* ICON_H */ diff --git a/image.c b/image.c index a7530a8..e3e9dc2 100644 --- a/image.c +++ b/image.c @@ -16,8 +16,9 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include + #include "config.h" -#include "icon.h" #include "image.h" #include "options.h" #include "util.h" @@ -26,15 +27,11 @@ int zl_cnt; float zoom_min; float zoom_max; -Imlib_Image *im_invalid; - void img_init(img_t *img, win_t *win) { zl_cnt = sizeof(zoom_levels) / sizeof(zoom_levels[0]); zoom_min = zoom_levels[0] / 100.0; zoom_max = zoom_levels[zl_cnt - 1] / 100.0; - im_invalid = imlib_create_image_using_data(32, 32, icon_invalid); - if (img) { img->im = NULL; img->zoom = options->zoom; @@ -51,43 +48,20 @@ void img_init(img_t *img, win_t *win) { } } -void img_free(img_t* img) { - imlib_context_set_image(im_invalid); - imlib_free_image(); -} - -int img_check(const char *filename) { - Imlib_Image *im; - - if (!filename) - return 0; - - if ((im = imlib_load_image(filename))) { - imlib_context_set_image(im); - imlib_image_set_changes_on_disk(); - imlib_free_image(); - return 1; - } else { - warn("invalid file: %s", filename); - return 0; - } -} - int img_load(img_t *img, const char *filename) { if (!img || !filename) return 0; - if ((img->im = imlib_load_image(filename))) { - imlib_context_set_image(img->im); - imlib_image_set_changes_on_disk(); - imlib_context_set_anti_alias(img->aa); - img->scalemode = options->scalemode; - } else { - warn("invalid file: %s", filename); - imlib_context_set_image(im_invalid); - imlib_context_set_anti_alias(0); + if (access(filename, R_OK) || !(img->im = imlib_load_image(filename))) { + warn("could not open image: %s", filename); + return 0; } + imlib_context_set_image(img->im); + imlib_image_set_changes_on_disk(); + imlib_context_set_anti_alias(img->aa); + + img->scalemode = options->scalemode; img->re = 0; img->checkpan = 0; @@ -151,12 +125,12 @@ void img_render(img_t *img, win_t *win) { int sx, sy, sw, sh; int dx, dy, dw, dh; - if (!img || !win) + if (!img || !img->im || !win) return; - if (!img->im || img->scalemode != SCALE_ZOOM) { + if (img->scalemode != SCALE_ZOOM) { img_fit(img, win); - if ((!img->im || img->scalemode == SCALE_DOWN) && img->zoom > 1.0) + if (img->scalemode == SCALE_DOWN && img->zoom > 1.0) img->zoom = 1.0; } @@ -204,10 +178,7 @@ void img_render(img_t *img, win_t *win) { win_clear(win); - if (img->im) - imlib_context_set_image(img->im); - else - imlib_context_set_image(im_invalid); + imlib_context_set_image(img->im); if (imlib_image_has_alpha() && !img->alpha) win_draw_rect(win, win->pm, dx, dy, dw, dh, True, 0, win->white); diff --git a/image.h b/image.h index 5fc4ec6..ed7302d 100644 --- a/image.h +++ b/image.h @@ -54,9 +54,7 @@ typedef struct { } img_t; void img_init(img_t*, win_t*); -void img_free(img_t*); -int img_check(const char*); int img_load(img_t*, const char*); void img_close(img_t*, int); diff --git a/main.c b/main.c index 8fd1ba5..d1acf32 100644 --- a/main.c +++ b/main.c @@ -40,6 +40,14 @@ #include "commands.h" #endif +#define FNAME_CNT 1024 +#define TITLE_LEN 256 + +#define TO_WIN_RESIZE 75000 +#define TO_IMAGE_DRAG 1000 +#define TO_CURSOR_HIDE 1500000 +#define TO_THUMBS_LOAD 75000 + typedef enum { MODE_NORMAL = 0, MODE_THUMBS @@ -52,42 +60,74 @@ img_t img; tns_t tns; win_t win; -#define FNAME_CNT 1024 const char **filenames; int filecnt, fileidx; size_t filesize; -#define TITLE_LEN 256 char win_title[TITLE_LEN]; +int timo_cursor; +int timo_redraw; +unsigned char drag; +int mox, moy; + void cleanup() { static int in = 0; if (!in++) { img_close(&img, 0); - img_free(&img); - tns_free(&tns, &win); + tns_free(&tns); win_close(&win); } } +void remove_file(int n, unsigned char silent) { + if (n < 0 || n >= filecnt) + return; + + if (filecnt == 1) { + if (!silent) + fprintf(stderr, "sxiv: no more files to display\n"); + cleanup(); + exit(!silent); + } + + if (n + 1 < filecnt) + memmove(filenames + n, filenames + n + 1, (filecnt - n - 1) * + sizeof(const char*)); + if (n + 1 < tns.cnt) { + memmove(tns.thumbs + n, tns.thumbs + n + 1, (tns.cnt - n - 1) * + sizeof(thumb_t)); + memset(tns.thumbs + tns.cnt - 1, 0, sizeof(thumb_t)); + } + + --filecnt; + if (n < tns.cnt) + --tns.cnt; +} + int load_image(int new) { - int ret = 0; struct stat fstats; if (new >= 0 && new < filecnt) { win_set_cursor(&win, CURSOR_WATCH); img_close(&img, 0); + + while (!img_load(&img, filenames[new])) { + remove_file(new, 0); + if (new >= filecnt) + new = filecnt - 1; + } fileidx = new; - if (!stat(filenames[fileidx], &fstats)) + if (!stat(filenames[new], &fstats)) filesize = fstats.st_size; else filesize = 0; - if (!(ret = img_load(&img, filenames[fileidx]))) + + if (!timo_cursor) win_set_cursor(&win, CURSOR_NONE); } - - return ret; + return 1; } void update_title() { @@ -100,16 +140,11 @@ void update_title() { tns.cnt ? tns.sel + 1 : 0, tns.cnt, tns.cnt ? filenames[tns.sel] : ""); } else { - if (img.im) { - size = filesize; - size_readable(&size, &unit); - n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] <%d%%> (%.2f%s) %s", - fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, - filenames[fileidx]); - } else { - n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] invalid: %s", - fileidx + 1, filecnt, filenames[fileidx]); - } + size = filesize; + size_readable(&size, &unit); + n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] <%d%%> (%.2f%s) %s", + fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, + filenames[fileidx]); } if (n >= TITLE_LEN) { @@ -128,7 +163,7 @@ int check_append(const char *filename) { if (access(filename, R_OK)) { warn("could not open file: %s", filename); return 0; - } else if (options->all || img_check(filename)) { + } else { if (fileidx == filecnt) { filecnt *= 2; filenames = (const char**) s_realloc(filenames, @@ -136,8 +171,6 @@ int check_append(const char *filename) { } filenames[fileidx++] = filename; return 1; - } else { - return 0; } } @@ -155,7 +188,7 @@ int main(int argc, char **argv) { if (options->clean_cache) { tns_init(&tns, 0); - tns_clear_cache(&tns); + tns_clean_cache(&tns); exit(0); } @@ -208,26 +241,27 @@ int main(int argc, char **argv) { fileidx = 0; if (!filecnt) { - fprintf(stderr, "sxiv: no valid image filename given, aborting\n"); + fprintf(stderr, "sxiv: no valid image file given, aborting\n"); exit(1); } - win_open(&win); + win_init(&win); img_init(&img, &win); if (options->thumbnails) { mode = MODE_THUMBS; tns_init(&tns, filecnt); - win_clear(&win); - win_draw(&win); + while (!tns_load(&tns, 0, filenames[0], 0)) + remove_file(0, 0); + tns.cnt = 1; } else { mode = MODE_NORMAL; tns.thumbs = NULL; load_image(fileidx); - img_render(&img, &win); } - update_title(); + win_open(&win); + run(); cleanup(); @@ -292,42 +326,9 @@ int run_command(const char *cline, Bool reload) { } #endif /* EXT_COMMANDS */ -void remove_file(int n) { - if (n < 0 || n >= filecnt) - return; - - if (filecnt == 1) { - cleanup(); - exit(0); - } - - if (n + 1 < filecnt) - memmove(filenames + n, filenames + n + 1, (filecnt - n - 1) * - sizeof(const char*)); - if (n + 1 < tns.cnt) { - memmove(tns.thumbs + n, tns.thumbs + n + 1, (tns.cnt - n - 1) * - sizeof(thumb_t)); - memset(tns.thumbs + tns.cnt - 1, 0, sizeof(thumb_t)); - } - - --filecnt; - if (n < tns.cnt) - --tns.cnt; -} - /* event handling */ -#define TO_WIN_RESIZE 75000; -#define TO_IMAGE_DRAG 1000; -#define TO_CURSOR_HIDE 1500000; -#define TO_THUMBS_LOAD 75000; -int timo_cursor; -int timo_redraw; - -unsigned char drag; -int mox, moy; - void redraw() { if (mode == MODE_NORMAL) { img_render(&img, &win); @@ -363,16 +364,24 @@ void on_keypress(XKeyEvent *kev) { win_set_cursor(&win, CURSOR_WATCH); if (run_command(commands[x].cmdline, commands[x].reload)) { if (mode == MODE_NORMAL) { + if (fileidx < tns.cnt) + tns_load(&tns, fileidx, filenames[fileidx], 1); img_close(&img, 1); load_image(fileidx); - tns_load(&tns, &win, fileidx, filenames[fileidx]); } else { - tns_load(&tns, &win, tns.sel, filenames[tns.sel]); + if (!tns_load(&tns, tns.sel, filenames[tns.sel], 0)) { + remove_file(tns.sel, 0); + tns.dirty = 1; + if (tns.sel >= tns.cnt) + tns.sel = tns.cnt - 1; + } } redraw(); } if (mode == MODE_THUMBS) win_set_cursor(&win, CURSOR_ARROW); + else if (!timo_cursor) + win_set_cursor(&win, CURSOR_NONE); return; } } @@ -487,7 +496,7 @@ void on_keypress(XKeyEvent *kev) { changed = 1; break; case XK_D: - remove_file(fileidx); + remove_file(fileidx, 1); changed = load_image(fileidx >= filecnt ? filecnt - 1 : fileidx); break; case XK_r: @@ -532,11 +541,12 @@ void on_keypress(XKeyEvent *kev) { tns.sel = tns.cnt - 1; changed = tns.dirty = 1; } + break; /* miscellaneous */ case XK_D: if (tns.sel < tns.cnt) { - remove_file(tns.sel); + remove_file(tns.sel, 1); changed = tns.dirty = 1; if (tns.sel >= tns.cnt) tns.sel = tns.cnt - 1; @@ -663,17 +673,21 @@ void run() { struct timeval tt, t0, t1; XEvent ev; - timo_cursor = timo_redraw = 0; drag = 0; + timo_cursor = mode == MODE_NORMAL ? TO_CURSOR_HIDE : 0; + + redraw(); while (1) { if (mode == MODE_THUMBS && tns.cnt < filecnt) { win_set_cursor(&win, CURSOR_WATCH); gettimeofday(&t0, 0); - while (!XPending(win.env.dpy) && tns.cnt < filecnt) { - /* tns.cnt is increased inside tns_load */ - tns_load(&tns, &win, tns.cnt, filenames[tns.cnt]); + while (tns.cnt < filecnt && !XPending(win.env.dpy)) { + if (tns_load(&tns, tns.cnt, filenames[tns.cnt], 0)) + ++tns.cnt; + else + remove_file(tns.cnt, 0); gettimeofday(&t1, 0); if (TV_TO_DOUBLE(t1) - TV_TO_DOUBLE(t0) >= 0.25) break; diff --git a/thumbs.c b/thumbs.c index 74ed708..4501161 100644 --- a/thumbs.c +++ b/thumbs.c @@ -27,8 +27,6 @@ #include "thumbs.h" #include "util.h" -extern Imlib_Image *im_invalid; - const int thumb_dim = THUMB_SIZE + 10; char *cache_dir = NULL; @@ -131,7 +129,7 @@ void tns_cache_write(thumb_t *t, Bool force) { } } -void tns_clear_cache(tns_t *tns) { +void tns_clean_cache(tns_t *tns) { int dirlen, delete; char *cfile, *filename, *tpos; r_dir_t dir; @@ -195,7 +193,7 @@ void tns_init(tns_t *tns, int cnt) { } } -void tns_free(tns_t *tns, win_t *win) { +void tns_free(tns_t *tns) { int i; if (!tns) @@ -218,22 +216,21 @@ void tns_free(tns_t *tns, win_t *win) { } } -void tns_load(tns_t *tns, win_t *win, int n, const char *filename) { +int tns_load(tns_t *tns, int n, const char *filename, unsigned char silent) { int w, h; int use_cache, cached = 0; float z, zw, zh; thumb_t *t; Imlib_Image *im; - if (!tns || !tns->thumbs || !win || !filename) - return; + if (!tns || !tns->thumbs || !filename) + return 0; - if (n >= tns->cap) - return; - else if (n >= tns->cnt) - tns->cnt = n + 1; + if (n < 0 || n >= tns->cap) + return 0; t = &tns->thumbs[n]; + t->filename = filename; if (t->im) { imlib_context_set_image(t->im); @@ -245,36 +242,35 @@ void tns_load(tns_t *tns, win_t *win, int n, const char *filename) { cached = 1; } - if (cached || (im = imlib_load_image(filename))) - imlib_context_set_image(im); - else - imlib_context_set_image(im_invalid); + if (!cached && + (access(filename, R_OK) || !(im = imlib_load_image(filename)))) + { + if (!silent) + warn("could not open image: %s", filename); + return 0; + } + + imlib_context_set_image(im); + imlib_context_set_anti_alias(1); w = imlib_image_get_width(); h = imlib_image_get_height(); - - if (im) { - t->filename = filename; - zw = (float) THUMB_SIZE / (float) w; - zh = (float) THUMB_SIZE / (float) h; - z = MIN(zw, zh); - } else { - t->filename = NULL; - z = 1.0; - } - + zw = (float) THUMB_SIZE / (float) w; + zh = (float) THUMB_SIZE / (float) h; + z = MIN(zw, zh); t->w = z * w; t->h = z * h; - imlib_context_set_anti_alias(1); if (!(t->im = imlib_create_cropped_scaled_image(0, 0, w, h, t->w, t->h))) die("could not allocate memory"); - if (im) - imlib_free_image_and_decache(); + + imlib_free_image_and_decache(); + if (use_cache && !cached) tns_cache_write(t, False); tns->dirty = 1; + return 1; } void tns_check_view(tns_t *tns, Bool scrolled) { diff --git a/thumbs.h b/thumbs.h index 4a8af09..a81287b 100644 --- a/thumbs.h +++ b/thumbs.h @@ -52,12 +52,12 @@ typedef struct { unsigned char dirty; } tns_t; -void tns_clear_cache(tns_t*); +void tns_clean_cache(tns_t*); void tns_init(tns_t*, int); -void tns_free(tns_t*, win_t*); +void tns_free(tns_t*); -void tns_load(tns_t*, win_t*, int, const char*); +int tns_load(tns_t*, int, const char*, unsigned char); void tns_render(tns_t*, win_t*); void tns_highlight(tns_t*, win_t*, int, Bool); diff --git a/window.c b/window.c index 7e29176..1e98a81 100644 --- a/window.c +++ b/window.c @@ -34,10 +34,52 @@ static GC gc; Atom wm_delete_win; +void win_init(win_t *win) { + win_env_t *e; + XColor col; + + if (!win) + return; + + e = &win->env; + if (!(e->dpy = XOpenDisplay(NULL))) + die("could not open display"); + + e->scr = DefaultScreen(e->dpy); + e->scrw = DisplayWidth(e->dpy, e->scr); + e->scrh = DisplayHeight(e->dpy, e->scr); + e->vis = DefaultVisual(e->dpy, e->scr); + e->cmap = DefaultColormap(e->dpy, e->scr); + e->depth = DefaultDepth(e->dpy, e->scr); + + win->black = BlackPixel(e->dpy, e->scr); + win->white = WhitePixel(e->dpy, e->scr); + + if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), BG_COLOR, + &col, &col)) + { + win->bgcol = col.pixel; + } else { + die("could not allocate color: %s", BG_COLOR); + } + + if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), SEL_COLOR, + &col, &col)) + { + win->selcol = col.pixel; + } else { + die("could not allocate color: %s", SEL_COLOR); + } + + win->xwin = 0; + win->pm = 0; + win->fullscreen = 0; +} + void win_set_sizehints(win_t *win) { XSizeHints sizehints; - if (!win) + if (!win || !win->xwin) return; sizehints.flags = PMinSize | PMaxSize; @@ -60,33 +102,7 @@ void win_open(win_t *win) { return; e = &win->env; - if (!(e->dpy = XOpenDisplay(NULL))) - die("could not open display"); - e->scr = DefaultScreen(e->dpy); - e->scrw = DisplayWidth(e->dpy, e->scr); - e->scrh = DisplayHeight(e->dpy, e->scr); - e->vis = DefaultVisual(e->dpy, e->scr); - e->cmap = DefaultColormap(e->dpy, e->scr); - e->depth = DefaultDepth(e->dpy, e->scr); - - win->black = BlackPixel(e->dpy, e->scr); - win->white = WhitePixel(e->dpy, e->scr); - - if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), BG_COLOR, - &col, &col)) - win->bgcol = col.pixel; - else - die("could not allocate color: %s", BG_COLOR); - if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), SEL_COLOR, - &col, &col)) - win->selcol = col.pixel; - else - die("could not allocate color: %s", BG_COLOR); - - win->pm = 0; - win->fullscreen = 0; - /* determine window offsets, width & height */ if (!options->geometry) gmask = 0; @@ -125,7 +141,9 @@ void win_open(win_t *win) { if (!XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), "black", &col, &col)) + { die("could not allocate color: black"); + } none = XCreateBitmapFromData(e->dpy, win->xwin, none_data, 8, 8); cnone = XCreatePixmapCursor(e->dpy, none, none, &col, &col, 0, 0); @@ -151,7 +169,7 @@ void win_open(win_t *win) { } void win_close(win_t *win) { - if (!win) + if (!win || !win->xwin) return; XFreeCursor(win->env.dpy, carrow); @@ -183,7 +201,7 @@ int win_configure(win_t *win, XConfigureEvent *c) { } int win_moveresize(win_t *win, int x, int y, unsigned int w, unsigned int h) { - if (!win) + if (!win || !win->xwin) return 0; x = MAX(0, x); @@ -211,7 +229,7 @@ void win_toggle_fullscreen(win_t *win) { XEvent ev; XClientMessageEvent *cm; - if (!win) + if (!win || !win->xwin) return; win->fullscreen ^= 1; @@ -236,7 +254,7 @@ void win_clear(win_t *win) { win_env_t *e; XGCValues gcval; - if (!win) + if (!win || !win->xwin) return; e = &win->env; @@ -251,7 +269,7 @@ void win_clear(win_t *win) { } void win_draw(win_t *win) { - if (!win) + if (!win || !win->xwin) return; XSetWindowBackgroundPixmap(win->env.dpy, win->xwin, win->pm); @@ -276,7 +294,7 @@ void win_draw_rect(win_t *win, Pixmap pm, int x, int y, int w, int h, } void win_set_title(win_t *win, const char *title) { - if (!win) + if (!win || !win->xwin) return; if (!title) @@ -296,7 +314,7 @@ void win_set_title(win_t *win, const char *title) { } void win_set_cursor(win_t *win, win_cur_t cursor) { - if (!win) + if (!win || !win->xwin) return; switch (cursor) { diff --git a/window.h b/window.h index b4b23c3..74e3102 100644 --- a/window.h +++ b/window.h @@ -60,6 +60,7 @@ typedef struct { extern Atom wm_delete_win; +void win_init(win_t*); void win_open(win_t*); void win_close(win_t*);