Always support thumbs; start thumb-mode with single -t
This commit is contained in:
		
							parent
							
								
									72e8baf13e
								
							
						
					
					
						commit
						f2b8a75f6c
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | |||||||
| all: sxiv | all: sxiv | ||||||
| 
 | 
 | ||||||
| VERSION=git-20110220 | VERSION=git-20110221 | ||||||
| 
 | 
 | ||||||
| CC?=gcc | CC?=gcc | ||||||
| PREFIX?=/usr/local | PREFIX?=/usr/local | ||||||
|  | |||||||
							
								
								
									
										75
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								main.c
									
									
									
									
									
								
							| @ -129,15 +129,14 @@ int main(int argc, char **argv) { | |||||||
| 	win_open(&win); | 	win_open(&win); | ||||||
| 	img_init(&img, &win); | 	img_init(&img, &win); | ||||||
| 
 | 
 | ||||||
| 	if (options->thumbnails) | 	if (options->thumbnails) { | ||||||
| 		tns_init(&tns, filecnt); |  | ||||||
| 
 |  | ||||||
| 	if (options->thumbnails == 2) { |  | ||||||
| 		mode = MODE_THUMBS; | 		mode = MODE_THUMBS; | ||||||
|  | 		tns_init(&tns, filecnt); | ||||||
| 		win_clear(&win); | 		win_clear(&win); | ||||||
| 		win_draw(&win); | 		win_draw(&win); | ||||||
| 	} else { | 	} else { | ||||||
| 		mode = MODE_NORMAL; | 		mode = MODE_NORMAL; | ||||||
|  | 		tns.thumbs = NULL; | ||||||
| 		load_image(); | 		load_image(); | ||||||
| 		img_render(&img, &win); | 		img_render(&img, &win); | ||||||
| 	} | 	} | ||||||
| @ -163,11 +162,11 @@ void update_title() { | |||||||
| 			size = filesize; | 			size = filesize; | ||||||
| 			size_readable(&size, &unit); | 			size_readable(&size, &unit); | ||||||
| 			n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] <%d%%> (%.2f%s) %s", | 			n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] <%d%%> (%.2f%s) %s", | ||||||
| 									 fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, | 			             fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, | ||||||
| 									 filenames[fileidx]); | 			             filenames[fileidx]); | ||||||
| 		} else { | 		} else { | ||||||
| 			n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] broken: %s", | 			n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] broken: %s", | ||||||
| 									 fileidx + 1, filecnt, filenames[fileidx]); | 			             fileidx + 1, filecnt, filenames[fileidx]); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -309,6 +308,18 @@ void on_keypress(XKeyEvent *kev) { | |||||||
| 					changed = load_image(); | 					changed = load_image(); | ||||||
| 				} | 				} | ||||||
| 				break; | 				break; | ||||||
|  | 			case XK_g: | ||||||
|  | 				if (fileidx != 0) { | ||||||
|  | 					fileidx = 0; | ||||||
|  | 					changed = load_image(); | ||||||
|  | 				} | ||||||
|  | 				break; | ||||||
|  | 			case XK_G: | ||||||
|  | 				if (fileidx != filecnt - 1) { | ||||||
|  | 					fileidx = filecnt - 1; | ||||||
|  | 					changed = load_image(); | ||||||
|  | 				} | ||||||
|  | 				break; | ||||||
| 
 | 
 | ||||||
| 			/* zooming */ | 			/* zooming */ | ||||||
| 			case XK_plus: | 			case XK_plus: | ||||||
| @ -368,10 +379,11 @@ void on_keypress(XKeyEvent *kev) { | |||||||
| 
 | 
 | ||||||
| 			/* switch to thumnail mode */ | 			/* switch to thumnail mode */ | ||||||
| 			case XK_Return: | 			case XK_Return: | ||||||
| 				if (options->thumbnails) { | 				if (!tns.thumbs) | ||||||
| 					mode = MODE_THUMBS; | 					tns_init(&tns, filecnt); | ||||||
| 					changed = tns.dirty = 1; | 				mode = MODE_THUMBS; | ||||||
| 				} | 				tns.sel = fileidx; | ||||||
|  | 				changed = tns.dirty = 1; | ||||||
| 				break; | 				break; | ||||||
| 
 | 
 | ||||||
| 			/* miscellaneous */ | 			/* miscellaneous */ | ||||||
| @ -388,6 +400,7 @@ void on_keypress(XKeyEvent *kev) { | |||||||
| 		switch (ksym) { | 		switch (ksym) { | ||||||
| 			/* open selected image */ | 			/* open selected image */ | ||||||
| 			case XK_Return: | 			case XK_Return: | ||||||
|  | 				fileidx = tns.sel; | ||||||
| 				load_image(); | 				load_image(); | ||||||
| 				mode = MODE_NORMAL; | 				mode = MODE_NORMAL; | ||||||
| 				win_set_cursor(&win, CURSOR_ARROW); | 				win_set_cursor(&win, CURSOR_ARROW); | ||||||
| @ -411,6 +424,17 @@ void on_keypress(XKeyEvent *kev) { | |||||||
| 			case XK_Right: | 			case XK_Right: | ||||||
| 				changed = tns_move_selection(&tns, &win, TNS_RIGHT); | 				changed = tns_move_selection(&tns, &win, TNS_RIGHT); | ||||||
| 				break; | 				break; | ||||||
|  | 			case XK_g: | ||||||
|  | 				if (tns.sel != 0) { | ||||||
|  | 					tns.sel = 0; | ||||||
|  | 					changed = tns.dirty = 1; | ||||||
|  | 				} | ||||||
|  | 				break; | ||||||
|  | 			case XK_G: | ||||||
|  | 				if (tns.sel != tns.cnt - 1) { | ||||||
|  | 					tns.sel = tns.cnt - 1; | ||||||
|  | 					changed = tns.dirty = 1; | ||||||
|  | 				} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -423,27 +447,6 @@ void on_keypress(XKeyEvent *kev) { | |||||||
| 			cleanup(); | 			cleanup(); | ||||||
| 			exit(0); | 			exit(0); | ||||||
| 
 | 
 | ||||||
| 		case XK_g: |  | ||||||
| 			if (fileidx != 0) { |  | ||||||
| 				fileidx = 0; |  | ||||||
| 				changed = 1; |  | ||||||
| 				if (mode == MODE_NORMAL) |  | ||||||
| 					load_image(); |  | ||||||
| 				else |  | ||||||
| 					tns.dirty = 1; |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
| 		case XK_G: |  | ||||||
| 			if (fileidx != filecnt - 1) { |  | ||||||
| 				fileidx = filecnt - 1; |  | ||||||
| 				changed = 1; |  | ||||||
| 				if (mode == MODE_NORMAL) |  | ||||||
| 					load_image(); |  | ||||||
| 				else |  | ||||||
| 					tns.dirty = 1; |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
| 
 |  | ||||||
| 		case XK_f: | 		case XK_f: | ||||||
| 			win_toggle_fullscreen(&win); | 			win_toggle_fullscreen(&win); | ||||||
| 			/* render on next configurenotify */ | 			/* render on next configurenotify */ | ||||||
| @ -511,14 +514,15 @@ void on_buttonpress(XButtonEvent *bev) { | |||||||
| 		switch (bev->button) { | 		switch (bev->button) { | ||||||
| 			case Button1: | 			case Button1: | ||||||
| 				if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) { | 				if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) { | ||||||
| 					if (sel == fileidx) { | 					if (sel == tns.sel) { | ||||||
|  | 						fileidx = tns.sel; | ||||||
| 						load_image(); | 						load_image(); | ||||||
| 						mode = MODE_NORMAL; | 						mode = MODE_NORMAL; | ||||||
| 						win_set_cursor(&win, CURSOR_ARROW); | 						win_set_cursor(&win, CURSOR_ARROW); | ||||||
| 					} else { | 					} else { | ||||||
| 						tns_highlight(&tns, &win, fileidx, False); | 						tns_highlight(&tns, &win, tns.sel, False); | ||||||
| 						tns_highlight(&tns, &win, sel, True); | 						tns_highlight(&tns, &win, sel, True); | ||||||
| 						fileidx = sel; | 						tns.sel = sel; | ||||||
| 					} | 					} | ||||||
| 					changed = 1; | 					changed = 1; | ||||||
| 					break; | 					break; | ||||||
| @ -585,6 +589,7 @@ void run() { | |||||||
| 			FD_SET(xfd, &fds); | 			FD_SET(xfd, &fds); | ||||||
| 
 | 
 | ||||||
| 			if (!XPending(win.env.dpy) && !select(xfd + 1, &fds, 0, 0, &t)) | 			if (!XPending(win.env.dpy) && !select(xfd + 1, &fds, 0, 0, &t)) | ||||||
|  | 				/* timeout fired */ | ||||||
| 				redraw(); | 				redraw(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -87,8 +87,7 @@ void parse_options(int argc, char **argv) { | |||||||
| 				_options.scalemode = SCALE_FIT; | 				_options.scalemode = SCALE_FIT; | ||||||
| 				break; | 				break; | ||||||
| 			case 't': | 			case 't': | ||||||
| 				if (_options.thumbnails < 2) | 				_options.thumbnails = 1; | ||||||
| 					++_options.thumbnails; |  | ||||||
| 				break; | 				break; | ||||||
| 			case 'v': | 			case 'v': | ||||||
| 				print_version(); | 				print_version(); | ||||||
|  | |||||||
							
								
								
									
										50
									
								
								thumbs.c
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								thumbs.c
									
									
									
									
									
								
							| @ -25,16 +25,14 @@ | |||||||
| #include "thumbs.h" | #include "thumbs.h" | ||||||
| #include "util.h" | #include "util.h" | ||||||
| 
 | 
 | ||||||
| extern int fileidx; |  | ||||||
| extern Imlib_Image *im_broken; | extern Imlib_Image *im_broken; | ||||||
| 
 |  | ||||||
| const int thumb_dim = THUMB_SIZE + 10; | const int thumb_dim = THUMB_SIZE + 10; | ||||||
| 
 | 
 | ||||||
| void tns_init(tns_t *tns, int cnt) { | void tns_init(tns_t *tns, int cnt) { | ||||||
| 	if (!tns) | 	if (!tns) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	tns->cnt = tns->first = 0; | 	tns->cnt = tns->first = tns->sel = 0; | ||||||
| 	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)); | ||||||
| 	tns->dirty = 0; | 	tns->dirty = 0; | ||||||
| @ -43,7 +41,7 @@ void tns_init(tns_t *tns, int cnt) { | |||||||
| void tns_free(tns_t *tns, win_t *win) { | void tns_free(tns_t *tns, win_t *win) { | ||||||
| 	int i; | 	int i; | ||||||
| 
 | 
 | ||||||
| 	if (!tns) | 	if (!tns || !tns->thumbs) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < tns->cnt; ++i) | 	for (i = 0; i < tns->cnt; ++i) | ||||||
| @ -94,21 +92,21 @@ void tns_check_view(tns_t *tns, Bool scrolled) { | |||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	tns->first -= tns->first % tns->cols; | 	tns->first -= tns->first % tns->cols; | ||||||
| 	r = fileidx % tns->cols; | 	r = tns->sel % tns->cols; | ||||||
| 
 | 
 | ||||||
| 	if (scrolled) { | 	if (scrolled) { | ||||||
| 		/* move selection into visible area */ | 		/* move selection into visible area */ | ||||||
| 		if (fileidx >= tns->first + tns->cols * tns->rows) | 		if (tns->sel >= tns->first + tns->cols * tns->rows) | ||||||
| 			fileidx = tns->first + r + tns->cols * (tns->rows - 1); | 			tns->sel = tns->first + r + tns->cols * (tns->rows - 1); | ||||||
| 		else if (fileidx < tns->first) | 		else if (tns->sel < tns->first) | ||||||
| 			fileidx = tns->first + r; | 			tns->sel = tns->first + r; | ||||||
| 	} else { | 	} else { | ||||||
| 		/* scroll to selection */ | 		/* scroll to selection */ | ||||||
| 		if (tns->first + tns->cols * tns->rows <= fileidx) { | 		if (tns->first + tns->cols * tns->rows <= tns->sel) { | ||||||
| 			tns->first = fileidx - r - tns->cols * (tns->rows - 1); | 			tns->first = tns->sel - r - tns->cols * (tns->rows - 1); | ||||||
| 			tns->dirty = 1; | 			tns->dirty = 1; | ||||||
| 		} else if (tns->first > fileidx) { | 		} else if (tns->first > tns->sel) { | ||||||
| 			tns->first = fileidx - r; | 			tns->first = tns->sel - r; | ||||||
| 			tns->dirty = 1; | 			tns->dirty = 1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @ -156,7 +154,7 @@ void tns_render(tns_t *tns, win_t *win) { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	tns->dirty = 0; | 	tns->dirty = 0; | ||||||
| 	tns_highlight(tns, win, fileidx, True); | 	tns_highlight(tns, win, tns->sel, True); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void tns_highlight(tns_t *tns, win_t *win, int n, Bool hl) { | void tns_highlight(tns_t *tns, win_t *win, int n, Bool hl) { | ||||||
| @ -179,35 +177,35 @@ int tns_move_selection(tns_t *tns, win_t *win, tnsdir_t dir) { | |||||||
| 	if (!tns || !win) | 	if (!tns || !win) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	old = fileidx; | 	old = tns->sel; | ||||||
| 
 | 
 | ||||||
| 	switch (dir) { | 	switch (dir) { | ||||||
| 		case TNS_LEFT: | 		case TNS_LEFT: | ||||||
| 			if (fileidx > 0) | 			if (tns->sel > 0) | ||||||
| 				--fileidx; | 				--tns->sel; | ||||||
| 			break; | 			break; | ||||||
| 		case TNS_RIGHT: | 		case TNS_RIGHT: | ||||||
| 			if (fileidx < tns->cnt - 1) | 			if (tns->sel < tns->cnt - 1) | ||||||
| 				++fileidx; | 				++tns->sel; | ||||||
| 			break; | 			break; | ||||||
| 		case TNS_UP: | 		case TNS_UP: | ||||||
| 			if (fileidx >= tns->cols) | 			if (tns->sel >= tns->cols) | ||||||
| 				fileidx -= tns->cols; | 				tns->sel -= tns->cols; | ||||||
| 			break; | 			break; | ||||||
| 		case TNS_DOWN: | 		case TNS_DOWN: | ||||||
| 			if (fileidx + tns->cols < tns->cnt) | 			if (tns->sel + tns->cols < tns->cnt) | ||||||
| 				fileidx += tns->cols; | 				tns->sel += tns->cols; | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (fileidx != old) { | 	if (tns->sel != old) { | ||||||
| 		tns_highlight(tns, win, old, False); | 		tns_highlight(tns, win, old, False); | ||||||
| 		tns_check_view(tns, False); | 		tns_check_view(tns, False); | ||||||
| 		if (!tns->dirty) | 		if (!tns->dirty) | ||||||
| 			tns_highlight(tns, win, fileidx, True); | 			tns_highlight(tns, win, tns->sel, True); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return fileidx != old; | 	return tns->sel != old; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int tns_scroll(tns_t *tns, tnsdir_t dir) { | int tns_scroll(tns_t *tns, tnsdir_t dir) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Bert
						Bert