New option: -C, clean thumbnail cache
This commit is contained in:
		
							parent
							
								
									eee921efe0
								
							
						
					
					
						commit
						dc54981a68
					
				
							
								
								
									
										6
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								main.c
									
									
									
									
									
								
							| @ -104,6 +104,12 @@ int main(int argc, char **argv) { | |||||||
| 
 | 
 | ||||||
| 	parse_options(argc, argv); | 	parse_options(argc, argv); | ||||||
| 
 | 
 | ||||||
|  | 	if (options->clean_cache) { | ||||||
|  | 		tns_init(&tns, 0); | ||||||
|  | 		tns_clear_cache(&tns); | ||||||
|  | 		exit(0); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if (!options->filecnt) { | 	if (!options->filecnt) { | ||||||
| 		print_usage(); | 		print_usage(); | ||||||
| 		exit(1); | 		exit(1); | ||||||
|  | |||||||
| @ -31,7 +31,7 @@ options_t _options; | |||||||
| const options_t *options = (const options_t*) &_options; | const options_t *options = (const options_t*) &_options; | ||||||
| 
 | 
 | ||||||
| void print_usage() { | void print_usage() { | ||||||
| 	printf("usage: sxiv [-adFfhpqrstvZ] [-g GEOMETRY] [-z ZOOM] FILES...\n"); | 	printf("usage: sxiv [-aCdFfhpqrstvZ] [-g GEOMETRY] [-z ZOOM] FILES...\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void print_version() { | void print_version() { | ||||||
| @ -53,9 +53,10 @@ void parse_options(int argc, char **argv) { | |||||||
| 
 | 
 | ||||||
| 	_options.all = 0; | 	_options.all = 0; | ||||||
| 	_options.quiet = 0; | 	_options.quiet = 0; | ||||||
|  | 	_options.clean_cache = 0; | ||||||
| 	_options.recursive = 0; | 	_options.recursive = 0; | ||||||
| 
 | 
 | ||||||
| 	while ((opt = getopt(argc, argv, "adFfg:hpqrstvZz:")) != -1) { | 	while ((opt = getopt(argc, argv, "aCdFfg:hpqrstvZz:")) != -1) { | ||||||
| 		switch (opt) { | 		switch (opt) { | ||||||
| 			case '?': | 			case '?': | ||||||
| 				print_usage(); | 				print_usage(); | ||||||
| @ -63,6 +64,9 @@ void parse_options(int argc, char **argv) { | |||||||
| 			case 'a': | 			case 'a': | ||||||
| 				_options.all = 1; | 				_options.all = 1; | ||||||
| 				break; | 				break; | ||||||
|  | 			case 'C': | ||||||
|  | 				_options.clean_cache = 1; | ||||||
|  | 				break; | ||||||
| 			case 'd': | 			case 'd': | ||||||
| 				_options.scalemode = SCALE_DOWN; | 				_options.scalemode = SCALE_DOWN; | ||||||
| 				break; | 				break; | ||||||
|  | |||||||
| @ -37,6 +37,7 @@ typedef struct { | |||||||
| 
 | 
 | ||||||
| 	unsigned char all; | 	unsigned char all; | ||||||
| 	unsigned char quiet; | 	unsigned char quiet; | ||||||
|  | 	unsigned char clean_cache; | ||||||
| 	unsigned char recursive; | 	unsigned char recursive; | ||||||
| } options_t; | } options_t; | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										70
									
								
								thumbs.c
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								thumbs.c
									
									
									
									
									
								
							| @ -71,7 +71,10 @@ Imlib_Image* tns_cache_load(const char *filename) { | |||||||
| 	struct stat cstats, fstats; | 	struct stat cstats, fstats; | ||||||
| 	Imlib_Image *im = NULL; | 	Imlib_Image *im = NULL; | ||||||
| 
 | 
 | ||||||
| 	if (!filename || stat(filename, &fstats)) | 	if (!filename) | ||||||
|  | 		return NULL; | ||||||
|  | 
 | ||||||
|  | 	if (stat(filename, &fstats)) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 
 | 
 | ||||||
| 	if ((cfile = tns_cache_filename(filename))) { | 	if ((cfile = tns_cache_filename(filename))) { | ||||||
| @ -97,6 +100,7 @@ void tns_cache_write(thumb_t *t, Bool force) { | |||||||
| 
 | 
 | ||||||
| 	if (!t || !t->im || !t->filename) | 	if (!t || !t->im || !t->filename) | ||||||
| 		return; | 		return; | ||||||
|  | 
 | ||||||
| 	if (stat(t->filename, &fstats)) | 	if (stat(t->filename, &fstats)) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| @ -130,6 +134,40 @@ void tns_cache_write(thumb_t *t, Bool force) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void tns_clear_cache(tns_t *tns) { | ||||||
|  | 	int dirlen, delete; | ||||||
|  | 	char *cfile, *filename, *tpos; | ||||||
|  | 	r_dir_t dir; | ||||||
|  | 
 | ||||||
|  | 	if (!cache_dir) | ||||||
|  | 		return; | ||||||
|  | 	 | ||||||
|  | 	if (r_opendir(&dir, cache_dir)) { | ||||||
|  | 		warn("could not open thumbnail cache directory: %s", cache_dir); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	dirlen = strlen(cache_dir); | ||||||
|  | 
 | ||||||
|  | 	while ((cfile = r_readdir(&dir))) { | ||||||
|  | 		filename = cfile + dirlen; | ||||||
|  | 		delete = 0; | ||||||
|  | 
 | ||||||
|  | 		if ((tpos = strrchr(filename, '.'))) { | ||||||
|  | 			*tpos = '\0'; | ||||||
|  | 			delete = access(filename, F_OK); | ||||||
|  | 			*tpos = '.'; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (delete && unlink(cfile)) | ||||||
|  | 			warn("could not delete cache file: %s", cfile); | ||||||
|  | 
 | ||||||
|  | 		free(cfile); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	r_closedir(&dir); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| void tns_init(tns_t *tns, int cnt) { | void tns_init(tns_t *tns, int cnt) { | ||||||
| 	int len; | 	int len; | ||||||
| @ -138,9 +176,14 @@ void tns_init(tns_t *tns, int cnt) { | |||||||
| 	if (!tns) | 	if (!tns) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	tns->cnt = tns->first = tns->sel = 0; | 	if (cnt) { | ||||||
| 		tns->thumbs = (thumb_t*) s_malloc(cnt * sizeof(thumb_t)); | 		tns->thumbs = (thumb_t*) s_malloc(cnt * sizeof(thumb_t)); | ||||||
| 		memset(tns->thumbs, 0, cnt * sizeof(thumb_t)); | 		memset(tns->thumbs, 0, cnt * sizeof(thumb_t)); | ||||||
|  | 	} else { | ||||||
|  | 		tns->thumbs = NULL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	tns->cnt = tns->first = tns->sel = 0; | ||||||
| 	tns->cap = cnt; | 	tns->cap = cnt; | ||||||
| 	tns->dirty = 0; | 	tns->dirty = 0; | ||||||
| 
 | 
 | ||||||
| @ -150,24 +193,27 @@ void tns_init(tns_t *tns, int cnt) { | |||||||
| 		len = strlen(homedir) + 10; | 		len = strlen(homedir) + 10; | ||||||
| 		cache_dir = (char*) s_malloc(len * sizeof(char)); | 		cache_dir = (char*) s_malloc(len * sizeof(char)); | ||||||
| 		snprintf(cache_dir, len, "%s/.sxiv", homedir); | 		snprintf(cache_dir, len, "%s/.sxiv", homedir); | ||||||
|  | 	} else { | ||||||
|  | 		warn("could not locate thumbnail cache directory"); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void tns_free(tns_t *tns, win_t *win) { | void tns_free(tns_t *tns, win_t *win) { | ||||||
| 	int i; | 	int i; | ||||||
| 
 | 
 | ||||||
| 	if (!tns || !tns->thumbs) | 	if (!tns) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
|  | 	if (tns->thumbs) { | ||||||
| 		for (i = 0; i < tns->cnt; ++i) { | 		for (i = 0; i < tns->cnt; ++i) { | ||||||
| 			if (tns->thumbs[i].im) { | 			if (tns->thumbs[i].im) { | ||||||
| 				imlib_context_set_image(tns->thumbs[i].im); | 				imlib_context_set_image(tns->thumbs[i].im); | ||||||
| 				imlib_free_image(); | 				imlib_free_image(); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		free(tns->thumbs); | 		free(tns->thumbs); | ||||||
| 		tns->thumbs = NULL; | 		tns->thumbs = NULL; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if (cache_dir) { | 	if (cache_dir) { | ||||||
| 		free(cache_dir); | 		free(cache_dir); | ||||||
| @ -182,7 +228,7 @@ void tns_load(tns_t *tns, win_t *win, int n, const char *filename) { | |||||||
| 	thumb_t *t; | 	thumb_t *t; | ||||||
| 	Imlib_Image *im; | 	Imlib_Image *im; | ||||||
| 
 | 
 | ||||||
| 	if (!tns || !win || !filename) | 	if (!tns || !tns->thumbs || !win || !filename) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (n >= tns->cap) | 	if (n >= tns->cap) | ||||||
| @ -265,7 +311,10 @@ void tns_render(tns_t *tns, win_t *win) { | |||||||
| 	int i, cnt, r, x, y; | 	int i, cnt, r, x, y; | ||||||
| 	thumb_t *t; | 	thumb_t *t; | ||||||
| 
 | 
 | ||||||
| 	if (!tns || !tns->dirty || !win) | 	if (!tns || !tns->thumbs || !win) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	if (!tns->dirty) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	win_clear(win); | 	win_clear(win); | ||||||
| @ -313,7 +362,7 @@ void tns_highlight(tns_t *tns, win_t *win, int n, Bool hl) { | |||||||
| 	thumb_t *t; | 	thumb_t *t; | ||||||
| 	unsigned long col; | 	unsigned long col; | ||||||
| 
 | 
 | ||||||
| 	if (!tns || !win) | 	if (!tns || !tns->thumbs || !win) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (n >= 0 && n < tns->cnt) { | 	if (n >= 0 && n < tns->cnt) { | ||||||
| @ -336,7 +385,7 @@ void tns_highlight(tns_t *tns, win_t *win, int n, Bool hl) { | |||||||
| int tns_move_selection(tns_t *tns, win_t *win, tnsdir_t dir) { | int tns_move_selection(tns_t *tns, win_t *win, tnsdir_t dir) { | ||||||
| 	int old; | 	int old; | ||||||
| 
 | 
 | ||||||
| 	if (!tns || !win) | 	if (!tns || !tns->thumbs || !win) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	old = tns->sel; | 	old = tns->sel; | ||||||
| @ -395,7 +444,10 @@ int tns_translate(tns_t *tns, int x, int y) { | |||||||
| 	int n; | 	int n; | ||||||
| 	thumb_t *t; | 	thumb_t *t; | ||||||
| 
 | 
 | ||||||
| 	if (!tns || x < tns->x || y < tns->y) | 	if (!tns || !tns->thumbs) | ||||||
|  | 		return -1; | ||||||
|  | 
 | ||||||
|  | 	if (x < tns->x || y < tns->y) | ||||||
| 		return -1; | 		return -1; | ||||||
| 
 | 
 | ||||||
| 	n = tns->first + (y - tns->y) / thumb_dim * tns->cols + | 	n = tns->first + (y - tns->y) / thumb_dim * tns->cols + | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Bert
						Bert