diff options
| author | Daniel Friesel <derf@derf.homelinux.org> | 2010-04-22 12:45:50 +0200 | 
|---|---|---|
| committer | Daniel Friesel <derf@derf.homelinux.org> | 2010-04-22 12:45:50 +0200 | 
| commit | 8821ce80b1139b0104439a9e87d8d8e6e3b0b595 (patch) | |
| tree | 16f615b82047cb0493162966caf7a92931552b28 | |
| parent | ab40571115f0a3badc2cd268a93ef981ec2af638 (diff) | |
Partially fix zoom mode
Does not yet work with initial zoom value != 100%
| -rw-r--r-- | src/events.c | 53 | ||||
| -rw-r--r-- | src/winwidget.c | 10 | ||||
| -rw-r--r-- | src/winwidget.h | 25 | 
3 files changed, 48 insertions, 40 deletions
| diff --git a/src/events.c b/src/events.c index a5af3f2..7f477a2 100644 --- a/src/events.c +++ b/src/events.c @@ -126,11 +126,16 @@ static void feh_event_handle_ButtonPress(XEvent * ev)  			opt.mode = MODE_ZOOM;  			winwid->mode = MODE_ZOOM;  			D(3, ("click offset is %d,%d\n", ev->xbutton.x, ev->xbutton.y)); -			winwid->click_offset_x = ev->xbutton.x - winwid->im_x; -			winwid->click_offset_y = ev->xbutton.y - winwid->im_y; -			winwid->im_click_offset_x = winwid->click_offset_x / winwid->zoom; -			winwid->im_click_offset_y = winwid->click_offset_y / winwid->zoom; +			winwid->click_offset_x = ev->xbutton.x; +			winwid->click_offset_y = ev->xbutton.y; +			winwid->old_zoom = winwid->zoom;  			winwid->zoom = 1.0; + +			/* required to adjust the image position in zoom mode */ +			winwid->orig_im_x = winwid->im_x; +			winwid->orig_im_y = winwid->im_y; + +			/* center the image */  			if (winwid->full_screen) {  				winwid->im_x = (scr_width - winwid->im_w) >> 1;  				winwid->im_y = (scr_height - winwid->im_h) >> 1; @@ -146,17 +151,9 @@ static void feh_event_handle_ButtonPress(XEvent * ev)  					winwid->im_y = 0;  				}  			} -			if (winwid->im_click_offset_x < 30) -				winwid->im_click_offset_x = 30; -			if (winwid->im_click_offset_y < 0) -				winwid->im_click_offset_y = 0; -			if (winwid->im_click_offset_x > winwid->im_w) -				winwid->im_click_offset_x = winwid->im_w; -			if (winwid->im_click_offset_y > winwid->im_h) -				winwid->im_click_offset_y = winwid->im_h; - -			if (winwid->click_offset_x < 30) -				winwid->click_offset_x = 30; + +			if (winwid->click_offset_x < 0) +				winwid->click_offset_x = 0;  			if (winwid->click_offset_y < 0)  				winwid->click_offset_y = 0;  			if (winwid->click_offset_x > winwid->w) @@ -425,21 +422,27 @@ static void feh_event_handle_MotionNotify(XEvent * ev)  		winwid = winwidget_get_from_window(ev->xmotion.window);  		if (winwid) { -			winwid->zoom = ((double) ev->xmotion.x - (double) winwid->click_offset_x) / 64.0; -			if (winwid->zoom < 0) -				winwid->zoom = 1.0 + ((winwid->zoom * 64.0) / ((double) -									       (winwid->click_offset_x + 1))); +			if (ev->xmotion.x > winwid->click_offset_x) +				winwid->zoom = winwid->old_zoom + ( +						((double) ev->xmotion.x - (double) winwid->click_offset_x) +						/ 128.0); +						/*/ ((double) (winwid->click_offset_x + 1)));*/  			else -				winwid->zoom += 1.0; +				winwid->zoom = winwid->old_zoom - ( +						((double) winwid->click_offset_x - (double) ev->xmotion.x) +						/ 128.0); +						/*/ ((double) (winwid->click_offset_x + 1)));*/  			if (winwid->zoom < 0.01)  				winwid->zoom = 0.01; -			/* calculate change in zoom and move im_x and im_y respectively to -			   enable zooming to the clicked spot... */ -			/* for now, center around im_click_offset_x and im_click_offset_y */ -			winwid->im_x = (winwid->w / 2) - (winwid->im_click_offset_x * winwid->zoom); -			winwid->im_y = (winwid->h / 2) - (winwid->im_click_offset_y * winwid->zoom); +			/* center around click_offset */ +			winwid->im_x = winwid->click_offset_x +					- (winwid->click_offset_x * winwid->zoom); +					/*+ (winwid->orig_im_x * winwid->zoom);*/ +			winwid->im_y = winwid->click_offset_y +					- (winwid->click_offset_y * winwid->zoom); +					/*+ (winwid->orig_im_y * winwid->zoom);*/  			winwidget_render_image(winwid, 0, 0);  		} diff --git a/src/winwidget.c b/src/winwidget.c index 5ee7ace..4a649bd 100644 --- a/src/winwidget.c +++ b/src/winwidget.c @@ -69,11 +69,10 @@ static winwidget winwidget_allocate(void)  	ret->im_x = 0;  	ret->im_y = 0;  	ret->zoom = 1.0; +	ret->old_zoom = 1.0;  	ret->click_offset_x = 0;  	ret->click_offset_y = 0; -	ret->im_click_offset_x = 0; -	ret->im_click_offset_y = 0;  	ret->has_rotated = 0;  	D_RETURN(4, ret); @@ -911,14 +910,13 @@ void feh_debug_print_winwid(winwidget w)  	       "h = %d\n" "im_w = %d\n" "im_h = %d\n" "im_angle = %f\n"  	       "type = %d\n" "had_resize = %d\n" "im = %p\n" "GC = %p\n"  	       "pixmap = %ld\n" "name = %s\n" "file = %p\n" "mode = %d\n" -	       "im_x = %d\n" "im_y = %d\n" "zoom = %f\n" +	       "im_x = %d\n" "im_y = %d\n" "zoom = %f\n" "old_zoom = %f\n"  	       "click_offset_x = %d\n" "click_offset_y = %d\n" -	       "im_click_offset_x = %d\n" "im_click_offset_y = %d\n"  	       "has_rotated = %d\n", (void *)w, w->win, w->w, w->h, w->im_w,  	       w->im_h, w->im_angle, w->type, w->had_resize, w->im, (void *)w->gc,  	       w->bg_pmap, w->name, (void *)w->file, w->mode, w->im_x, w->im_y, -	       w->zoom, w->click_offset_x, w->click_offset_y, -	       w->im_click_offset_x, w->im_click_offset_y, w->has_rotated); +	       w->zoom, w->old_zoom, w->click_offset_x, w->click_offset_y, +	       w->has_rotated);  }  void winwidget_reset_image(winwidget winwid) diff --git a/src/winwidget.h b/src/winwidget.h index dd24f8f..8f03323 100644 --- a/src/winwidget.h +++ b/src/winwidget.h @@ -92,20 +92,27 @@ struct __winwidget {  	gib_list *file;  	unsigned char visible; -	/* Stuff for zooming */ +	/* panning, zooming, etc. */  	unsigned char mode; -	unsigned char caption_entry;	/* are we in caption entry mode? */ +	unsigned char caption_entry; + +	/* image offset from window top left */ +	int im_x; +	int im_y; + +	/* same, as cache for zoom mode */ +	int orig_im_x; +	int orig_im_y; + +	/* From 0 (not visible) to 1.00 (actual size) +	 * all the way up to INT_MAX (eww) +	 */ +	double zoom; +	double old_zoom; -	/* New stuff */ -	int im_x;		/* image offset from window top left */ -	int im_y;		/* image offset from window top left */ -	double zoom;		/* From 0 (not visible) to 1.00 (actual size) -				   all the way up to INT_MAX (ouch) */  	int click_offset_x;  	int click_offset_y; -	int im_click_offset_x; -	int im_click_offset_y;  	unsigned char has_rotated;  }; | 
