Refactored main.c
This commit is contained in:
		
							parent
							
								
									bac610ddc4
								
							
						
					
					
						commit
						5cb6d12a94
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | ||||
| all: sxiv | ||||
| 
 | ||||
| VERSION=git-20110408 | ||||
| VERSION=git-20110411 | ||||
| 
 | ||||
| CC?=gcc | ||||
| PREFIX?=/usr/local | ||||
|  | ||||
							
								
								
									
										182
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										182
									
								
								main.c
									
									
									
									
									
								
							| @ -45,8 +45,6 @@ typedef enum { | ||||
| 	MODE_THUMBS | ||||
| } appmode_t; | ||||
| 
 | ||||
| void update_title(); | ||||
| int check_append(const char*); | ||||
| void run(); | ||||
| 
 | ||||
| appmode_t mode; | ||||
| @ -92,6 +90,57 @@ int load_image(int new) { | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| void update_title() { | ||||
| 	int n; | ||||
| 	float size; | ||||
| 	const char *unit; | ||||
| 
 | ||||
| 	if (mode == MODE_THUMBS) { | ||||
| 		n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] %s", | ||||
| 		             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]); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (n >= TITLE_LEN) { | ||||
| 		win_title[TITLE_LEN - 2] = '.'; | ||||
| 		win_title[TITLE_LEN - 3] = '.'; | ||||
| 		win_title[TITLE_LEN - 4] = '.'; | ||||
| 	} | ||||
| 
 | ||||
| 	win_set_title(&win, win_title); | ||||
| } | ||||
| 
 | ||||
| int check_append(const char *filename) { | ||||
| 	if (!filename) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (access(filename, R_OK)) { | ||||
| 		warn("could not open file: %s", filename); | ||||
| 		return 0; | ||||
| 	} else if (options->all || img_check(filename)) { | ||||
| 		if (fileidx == filecnt) { | ||||
| 			filecnt *= 2; | ||||
| 			filenames = (const char**) s_realloc(filenames, | ||||
| 			                                     filecnt * sizeof(const char*)); | ||||
| 		} | ||||
| 		filenames[fileidx++] = filename; | ||||
| 		return 1; | ||||
| 	} else { | ||||
| 		return 0; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| int fncmp(const void *a, const void *b) { | ||||
| 	return strcoll(*((char* const*) a), *((char* const*) b)); | ||||
| } | ||||
| @ -185,57 +234,6 @@ int main(int argc, char **argv) { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void update_title() { | ||||
| 	int n; | ||||
| 	float size; | ||||
| 	const char *unit; | ||||
| 
 | ||||
| 	if (mode == MODE_THUMBS) { | ||||
| 		n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] %s", | ||||
| 		             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]); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (n >= TITLE_LEN) { | ||||
| 		win_title[TITLE_LEN - 2] = '.'; | ||||
| 		win_title[TITLE_LEN - 3] = '.'; | ||||
| 		win_title[TITLE_LEN - 4] = '.'; | ||||
| 	} | ||||
| 
 | ||||
| 	win_set_title(&win, win_title); | ||||
| } | ||||
| 
 | ||||
| int check_append(const char *filename) { | ||||
| 	if (!filename) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (access(filename, R_OK)) { | ||||
| 		warn("could not open file: %s", filename); | ||||
| 		return 0; | ||||
| 	} else if (options->all || img_check(filename)) { | ||||
| 		if (fileidx == filecnt) { | ||||
| 			filecnt *= 2; | ||||
| 			filenames = (const char**) s_realloc(filenames, | ||||
| 			                                     filecnt * sizeof(const char*)); | ||||
| 		} | ||||
| 		filenames[fileidx++] = filename; | ||||
| 		return 1; | ||||
| 	} else { | ||||
| 		return 0; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| #if EXT_COMMANDS | ||||
| int run_command(const char *cline, Bool reload) { | ||||
| 	int fncnt, fnlen; | ||||
| @ -294,6 +292,29 @@ 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 */ | ||||
| 
 | ||||
| @ -322,7 +343,7 @@ void redraw() { | ||||
| } | ||||
| 
 | ||||
| void on_keypress(XKeyEvent *kev) { | ||||
| 	int i, x, y; | ||||
| 	int x, y; | ||||
| 	unsigned int w, h; | ||||
| 	char key; | ||||
| 	KeySym ksym; | ||||
| @ -337,10 +358,10 @@ void on_keypress(XKeyEvent *kev) { | ||||
| #if EXT_COMMANDS | ||||
| 	/* external commands from commands.h */ | ||||
| 	if (CLEANMASK(kev->state) & ControlMask) { | ||||
| 		for (i = 0; i < LEN(commands); ++i) { | ||||
| 			if (commands[i].ksym == ksym) { | ||||
| 		for (x = 0; x < LEN(commands); ++x) { | ||||
| 			if (commands[x].ksym == ksym) { | ||||
| 				win_set_cursor(&win, CURSOR_WATCH); | ||||
| 				if (run_command(commands[i].cmdline, commands[i].reload)) { | ||||
| 				if (run_command(commands[x].cmdline, commands[x].reload)) { | ||||
| 					if (mode == MODE_NORMAL) { | ||||
| 						img_close(&img, 1); | ||||
| 						load_image(fileidx); | ||||
| @ -465,6 +486,10 @@ void on_keypress(XKeyEvent *kev) { | ||||
| 				img.alpha ^= 1; | ||||
| 				changed = 1; | ||||
| 				break; | ||||
| 			case XK_D: | ||||
| 				remove_file(fileidx); | ||||
| 				changed = load_image(fileidx >= filecnt ? filecnt - 1 : fileidx); | ||||
| 				break; | ||||
| 			case XK_r: | ||||
| 				changed = load_image(fileidx); | ||||
| 				break; | ||||
| @ -507,6 +532,16 @@ void on_keypress(XKeyEvent *kev) { | ||||
| 					tns.sel = tns.cnt - 1; | ||||
| 					changed = tns.dirty = 1; | ||||
| 				} | ||||
| 
 | ||||
| 			/* miscellaneous */ | ||||
| 			case XK_D: | ||||
| 				if (tns.sel < tns.cnt) { | ||||
| 					remove_file(tns.sel); | ||||
| 					changed = tns.dirty = 1; | ||||
| 					if (tns.sel >= tns.cnt) | ||||
| 						tns.sel = tns.cnt - 1; | ||||
| 				} | ||||
| 				break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -515,43 +550,10 @@ void on_keypress(XKeyEvent *kev) { | ||||
| 		case XK_q: | ||||
| 			cleanup(); | ||||
| 			exit(0); | ||||
| 
 | ||||
| 		case XK_f: | ||||
| 			win_toggle_fullscreen(&win); | ||||
| 			/* render on next configurenotify */ | ||||
| 			break; | ||||
| 
 | ||||
| 		case XK_D: | ||||
| 			if (mode == MODE_THUMBS) { | ||||
| 				if (tns.sel >= tns.cnt) | ||||
| 					break; | ||||
| 				i = tns.sel; | ||||
| 			} else { | ||||
| 				i = fileidx; | ||||
| 			} | ||||
| 			if (filecnt == 1) { | ||||
| 				cleanup(); | ||||
| 				exit(0); | ||||
| 			} | ||||
| 			if (i + 1 < filecnt) | ||||
| 				memmove(filenames + i, filenames + i + 1, (filecnt - i - 1) * | ||||
| 				        sizeof(const char*)); | ||||
| 			else if (fileidx) | ||||
| 				fileidx--; | ||||
| 			if (i + 1 < tns.cnt) { | ||||
| 				memmove(tns.thumbs + i, tns.thumbs + i + 1, (tns.cnt - i - 1) * | ||||
| 				        sizeof(thumb_t)); | ||||
| 				memset(tns.thumbs + tns.cnt - 1, 0, sizeof(thumb_t)); | ||||
| 			} else if (tns.sel) { | ||||
| 				tns.sel--; | ||||
| 			} | ||||
| 			filecnt--; | ||||
| 			if (mode == MODE_NORMAL) | ||||
| 				load_image(fileidx); | ||||
| 			if (i < tns.cnt) | ||||
| 				tns.cnt--; | ||||
| 			changed = tns.dirty = 1; | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	if (changed) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Bert
						Bert