Save rotated png-files with S-key
This commit is contained in:
		
							parent
							
								
									dc68127ae5
								
							
						
					
					
						commit
						090ee5405b
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | ||||
| all: sxiv | ||||
| 
 | ||||
| VERSION=0.7 | ||||
| VERSION=git-20110227 | ||||
| 
 | ||||
| CC?=gcc | ||||
| PREFIX?=/usr/local | ||||
|  | ||||
							
								
								
									
										33
									
								
								image.c
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								image.c
									
									
									
									
									
								
							| @ -16,6 +16,7 @@ | ||||
|  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
|  */ | ||||
| 
 | ||||
| #include <string.h> | ||||
| #include <unistd.h> | ||||
| 
 | ||||
| #include "config.h" | ||||
| @ -28,6 +29,9 @@ int zl_cnt; | ||||
| float zoom_min; | ||||
| float zoom_max; | ||||
| 
 | ||||
| const short ori_left[8] = { 8, 7, 6, 5, 2, 1, 4, 3 }; | ||||
| const short ori_right[8] = { 6, 5, 8, 7, 4, 3, 2, 1 }; | ||||
| 
 | ||||
| Imlib_Image *im_broken; | ||||
| 
 | ||||
| void img_init(img_t *img, win_t *win) { | ||||
| @ -90,8 +94,8 @@ int img_load(img_t *img, const char *filename) { | ||||
| 		img->scalemode = SCALE_DOWN; | ||||
| 	} | ||||
| 
 | ||||
| 	img->re = 0; | ||||
| 	img->checkpan = 0; | ||||
| 	img->ori = img->o_ori = 1; | ||||
| 	img->re = img->checkpan = 0; | ||||
| 
 | ||||
| 	img->w = imlib_image_get_width(); | ||||
| 	img->h = imlib_image_get_height(); | ||||
| @ -99,6 +103,25 @@ int img_load(img_t *img, const char *filename) { | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| int img_save(img_t *img) { | ||||
| 	const char *fmt; | ||||
| 
 | ||||
| 	if (!img || !img->im) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	imlib_context_set_image(img->im); | ||||
| 
 | ||||
| 	if (img->ori != img->o_ori) { | ||||
| 		fmt = imlib_image_format(); | ||||
| 		if (strcmp(fmt, "png") == 0) { | ||||
| 			imlib_save_image(imlib_image_get_filename()); | ||||
| 			return 1; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void img_close(img_t *img) { | ||||
| 	if (img && img->im) { | ||||
| 		imlib_context_set_image(img->im); | ||||
| @ -341,11 +364,17 @@ void img_rotate(img_t *img, win_t *win, int d) { | ||||
| } | ||||
| 
 | ||||
| void img_rotate_left(img_t *img, win_t *win) { | ||||
| 	if (img) { | ||||
| 		img_rotate(img, win, 3); | ||||
| 		img->ori = ori_left[img->ori]; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void img_rotate_right(img_t *img, win_t *win) { | ||||
| 	if (img) { | ||||
| 		img_rotate(img, win, 1); | ||||
| 		img->ori = ori_right[img->ori]; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void img_toggle_antialias(img_t *img) { | ||||
|  | ||||
							
								
								
									
										3
									
								
								image.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								image.h
									
									
									
									
									
								
							| @ -41,6 +41,8 @@ typedef struct img_s { | ||||
| 
 | ||||
| 	float zoom; | ||||
| 	scalemode_t scalemode; | ||||
| 	short ori; | ||||
| 	short o_ori; | ||||
| 
 | ||||
| 	unsigned char re; | ||||
| 	unsigned char checkpan; | ||||
| @ -57,6 +59,7 @@ void img_free(img_t*); | ||||
| 
 | ||||
| int img_check(const char*); | ||||
| int img_load(img_t*, const char*); | ||||
| int img_save(img_t*); | ||||
| void img_close(img_t*); | ||||
| 
 | ||||
| void img_render(img_t*, win_t*); | ||||
|  | ||||
							
								
								
									
										68
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								main.c
									
									
									
									
									
								
							| @ -69,10 +69,11 @@ void cleanup() { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| int load_image() { | ||||
| int load_image(int new) { | ||||
| 	struct stat fstats; | ||||
| 
 | ||||
| 	img_close(&img); | ||||
| 	fileidx = new; | ||||
| 
 | ||||
| 	if (!stat(filenames[fileidx], &fstats)) | ||||
| 		filesize = fstats.st_size; | ||||
| @ -140,7 +141,7 @@ int main(int argc, char **argv) { | ||||
| 	} else { | ||||
| 		mode = MODE_NORMAL; | ||||
| 		tns.thumbs = NULL; | ||||
| 		load_image(); | ||||
| 		load_image(fileidx); | ||||
| 		img_render(&img, &win); | ||||
| 	} | ||||
| 
 | ||||
| @ -307,41 +308,29 @@ void on_keypress(XKeyEvent *kev) { | ||||
| 			/* navigate image list */ | ||||
| 			case XK_n: | ||||
| 			case XK_space: | ||||
| 				if (fileidx + 1 < filecnt) { | ||||
| 					++fileidx; | ||||
| 					changed = load_image(); | ||||
| 				} | ||||
| 				if (fileidx + 1 < filecnt) | ||||
| 					changed = load_image(fileidx + 1); | ||||
| 				break; | ||||
| 			case XK_p: | ||||
| 			case XK_BackSpace: | ||||
| 				if (fileidx > 0) { | ||||
| 					--fileidx; | ||||
| 					changed = load_image(); | ||||
| 				} | ||||
| 				if (fileidx > 0) | ||||
| 					changed = load_image(fileidx - 1); | ||||
| 				break; | ||||
| 			case XK_bracketleft: | ||||
| 				if (fileidx != 0) { | ||||
| 					fileidx = MAX(0, fileidx - 10); | ||||
| 					changed = load_image(); | ||||
| 				} | ||||
| 				if (fileidx != 0) | ||||
| 					changed = load_image(MAX(0, fileidx - 10)); | ||||
| 				break; | ||||
| 			case XK_bracketright: | ||||
| 				if (fileidx != filecnt - 1) { | ||||
| 					fileidx = MIN(fileidx + 10, filecnt - 1); | ||||
| 					changed = load_image(); | ||||
| 				} | ||||
| 				if (fileidx != filecnt - 1) | ||||
| 					changed = load_image(MIN(fileidx + 10, filecnt - 1)); | ||||
| 				break; | ||||
| 			case XK_g: | ||||
| 				if (fileidx != 0) { | ||||
| 					fileidx = 0; | ||||
| 					changed = load_image(); | ||||
| 				} | ||||
| 				if (fileidx != 0) | ||||
| 					changed = load_image(0); | ||||
| 				break; | ||||
| 			case XK_G: | ||||
| 				if (fileidx != filecnt - 1) { | ||||
| 					fileidx = filecnt - 1; | ||||
| 					changed = load_image(); | ||||
| 				} | ||||
| 				if (fileidx != filecnt - 1) | ||||
| 					changed = load_image(filecnt - 1); | ||||
| 				break; | ||||
| 
 | ||||
| 			/* zooming */ | ||||
| @ -418,7 +407,11 @@ void on_keypress(XKeyEvent *kev) { | ||||
| 				changed = 1; | ||||
| 				break; | ||||
| 			case XK_r: | ||||
| 				changed = load_image(); | ||||
| 				changed = load_image(fileidx); | ||||
| 				break; | ||||
| 			case XK_S: | ||||
| 			  if (img_save(&img)) | ||||
| 					tns_load(&tns, &win, fileidx, filenames[fileidx]); | ||||
| 				break; | ||||
| 		} | ||||
| 	} else { | ||||
| @ -426,8 +419,7 @@ void on_keypress(XKeyEvent *kev) { | ||||
| 		switch (ksym) { | ||||
| 			/* open selected image */ | ||||
| 			case XK_Return: | ||||
| 				fileidx = tns.sel; | ||||
| 				load_image(); | ||||
| 				load_image(tns.sel); | ||||
| 				mode = MODE_NORMAL; | ||||
| 				win_set_cursor(&win, CURSOR_NONE); | ||||
| 				changed = 1; | ||||
| @ -496,10 +488,8 @@ void on_buttonpress(XButtonEvent *bev) { | ||||
| 	if (mode == MODE_NORMAL) { | ||||
| 		switch (bev->button) { | ||||
| 			case Button1: | ||||
| 				if (fileidx + 1 < filecnt) { | ||||
| 					++fileidx; | ||||
| 					changed = load_image(); | ||||
| 				} | ||||
| 				if (fileidx + 1 < filecnt) | ||||
| 					changed = load_image(fileidx + 1); | ||||
| 				break; | ||||
| 			case Button2: | ||||
| 				mox = bev->x; | ||||
| @ -509,10 +499,8 @@ void on_buttonpress(XButtonEvent *bev) { | ||||
| 				drag = 1; | ||||
| 				break; | ||||
| 			case Button3: | ||||
| 				if (fileidx > 0) { | ||||
| 					--fileidx; | ||||
| 					changed = load_image(); | ||||
| 				} | ||||
| 				if (fileidx > 0) | ||||
| 					changed = load_image(fileidx - 1); | ||||
| 				break; | ||||
| 			case Button4: | ||||
| 				if (mask == ControlMask) | ||||
| @ -543,8 +531,7 @@ void on_buttonpress(XButtonEvent *bev) { | ||||
| 			case Button1: | ||||
| 				if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) { | ||||
| 					if (sel == tns.sel) { | ||||
| 						fileidx = tns.sel; | ||||
| 						load_image(); | ||||
| 						load_image(tns.sel); | ||||
| 						mode = MODE_NORMAL; | ||||
| 						timo_cursor = TO_CURSOR_HIDE; | ||||
| 					} else { | ||||
| @ -600,7 +587,8 @@ void run() { | ||||
| 			gettimeofday(&t0, 0); | ||||
| 
 | ||||
| 			while (!XPending(win.env.dpy) && tns.cnt < filecnt) { | ||||
| 				tns_load(&tns, &win, filenames[tns.cnt]); | ||||
| 				/* tns.cnt is increased inside tns_load */ | ||||
| 				tns_load(&tns, &win, tns.cnt, filenames[tns.cnt]); | ||||
| 				gettimeofday(&t1, 0); | ||||
| 				if (TV_TO_DOUBLE(t1) - TV_TO_DOUBLE(t0) >= 0.25) | ||||
| 					break; | ||||
|  | ||||
							
								
								
									
										18
									
								
								thumbs.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								thumbs.c
									
									
									
									
									
								
							| @ -35,6 +35,7 @@ void tns_init(tns_t *tns, int cnt) { | ||||
| 	tns->cnt = tns->first = tns->sel = 0; | ||||
| 	tns->thumbs = (thumb_t*) s_malloc(cnt * sizeof(thumb_t)); | ||||
| 	memset(tns->thumbs, 0, cnt * sizeof(thumb_t)); | ||||
| 	tns->cap = cnt; | ||||
| 	tns->dirty = 0; | ||||
| } | ||||
| 
 | ||||
| @ -51,7 +52,7 @@ void tns_free(tns_t *tns, win_t *win) { | ||||
| 	tns->thumbs = NULL; | ||||
| } | ||||
| 
 | ||||
| void tns_load(tns_t *tns, win_t *win, const char *filename) { | ||||
| void tns_load(tns_t *tns, win_t *win, int n, const char *filename) { | ||||
| 	int w, h; | ||||
| 	float z, zw, zh; | ||||
| 	thumb_t *t; | ||||
| @ -60,10 +61,17 @@ void tns_load(tns_t *tns, win_t *win, const char *filename) { | ||||
| 	if (!tns || !win || !filename) | ||||
| 		return; | ||||
| 
 | ||||
| 	if ((im = imlib_load_image(filename))) | ||||
| 	if (n >= tns->cap) | ||||
| 		return; | ||||
| 	else if (n >= tns->cnt) | ||||
| 		tns->cnt = n + 1; | ||||
| 
 | ||||
| 	if ((im = imlib_load_image(filename))) { | ||||
| 		imlib_context_set_image(im); | ||||
| 	else | ||||
| 		imlib_image_set_changes_on_disk(); | ||||
| 	} else { | ||||
| 		imlib_context_set_image(im_broken); | ||||
| 	} | ||||
| 
 | ||||
| 	w = imlib_image_get_width(); | ||||
| 	h = imlib_image_get_height(); | ||||
| @ -73,10 +81,12 @@ void tns_load(tns_t *tns, win_t *win, const char *filename) { | ||||
| 	if (!im && z > 1.0) | ||||
| 		z = 1.0; | ||||
| 
 | ||||
| 	t = &tns->thumbs[tns->cnt++]; | ||||
| 	t = &tns->thumbs[n]; | ||||
| 	t->w = z * w; | ||||
| 	t->h = z * h; | ||||
| 
 | ||||
| 	if (t->pm) | ||||
| 		win_free_pixmap(win, t->pm); | ||||
| 	t->pm = win_create_pixmap(win, t->w, t->h); | ||||
| 	imlib_context_set_drawable(t->pm); | ||||
| 	imlib_context_set_anti_alias(1); | ||||
|  | ||||
							
								
								
									
										3
									
								
								thumbs.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								thumbs.h
									
									
									
									
									
								
							| @ -38,6 +38,7 @@ typedef struct thumb_s { | ||||
| 
 | ||||
| typedef struct tns_s { | ||||
| 	thumb_t *thumbs; | ||||
| 	int cap; | ||||
| 	int cnt; | ||||
| 	int x; | ||||
| 	int y; | ||||
| @ -51,7 +52,7 @@ typedef struct tns_s { | ||||
| void tns_init(tns_t*, int); | ||||
| void tns_free(tns_t*, win_t*); | ||||
| 
 | ||||
| void tns_load(tns_t*, win_t*, const char*); | ||||
| void tns_load(tns_t*, win_t*, int, const char*); | ||||
| 
 | ||||
| void tns_render(tns_t*, win_t*); | ||||
| void tns_highlight(tns_t*, win_t*, int, Bool); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Bert
						Bert