summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@derf.homelinux.org>2010-04-22 12:45:50 +0200
committerDaniel Friesel <derf@derf.homelinux.org>2010-04-22 12:45:50 +0200
commit8821ce80b1139b0104439a9e87d8d8e6e3b0b595 (patch)
tree16f615b82047cb0493162966caf7a92931552b28
parentab40571115f0a3badc2cd268a93ef981ec2af638 (diff)
Partially fix zoom mode
Does not yet work with initial zoom value != 100%
-rw-r--r--src/events.c53
-rw-r--r--src/winwidget.c10
-rw-r--r--src/winwidget.h25
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;
};