diff options
-rw-r--r-- | icon.h | 180 | ||||
-rw-r--r-- | image.c | 57 | ||||
-rw-r--r-- | image.h | 2 | ||||
-rw-r--r-- | main.c | 154 | ||||
-rw-r--r-- | thumbs.c | 54 | ||||
-rw-r--r-- | thumbs.h | 6 | ||||
-rw-r--r-- | window.c | 78 | ||||
-rw-r--r-- | window.h | 1 |
8 files changed, 175 insertions, 357 deletions
@@ -1,180 +0,0 @@ -#ifndef ICON_H -#define ICON_H - -#include <Imlib2.h> - -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 */ @@ -16,8 +16,9 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <unistd.h> + #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); @@ -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); @@ -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; @@ -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) { @@ -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); @@ -34,27 +34,9 @@ static GC gc; Atom wm_delete_win; -void win_set_sizehints(win_t *win) { - XSizeHints sizehints; - - if (!win) - return; - - sizehints.flags = PMinSize | PMaxSize; - sizehints.min_width = win->w; - sizehints.max_width = win->w; - sizehints.min_height = win->h; - sizehints.max_height = win->h; - XSetWMNormalHints(win->env.dpy, win->xwin, &sizehints); -} - -void win_open(win_t *win) { +void win_init(win_t *win) { win_env_t *e; - XClassHint classhint; XColor col; - char none_data[] = {0, 0, 0, 0, 0, 0, 0, 0}; - Pixmap none; - int gmask; if (!win) return; @@ -75,18 +57,52 @@ void win_open(win_t *win) { if (XAllocNamedColor(e->dpy, DefaultColormap(e->dpy, e->scr), BG_COLOR, &col, &col)) + { win->bgcol = col.pixel; - else + } 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); + } 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 || !win->xwin) + return; + + sizehints.flags = PMinSize | PMaxSize; + sizehints.min_width = win->w; + sizehints.max_width = win->w; + sizehints.min_height = win->h; + sizehints.max_height = win->h; + XSetWMNormalHints(win->env.dpy, win->xwin, &sizehints); +} + +void win_open(win_t *win) { + win_env_t *e; + XClassHint classhint; + XColor col; + char none_data[] = {0, 0, 0, 0, 0, 0, 0, 0}; + Pixmap none; + int gmask; + + if (!win) + return; + + e = &win->env; + /* 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) { @@ -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*); |