summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--examples/buttons4
-rw-r--r--man/feh.pre9
-rw-r--r--src/events.c60
-rw-r--r--src/options.h2
5 files changed, 76 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index f4abf3c..fbb1aac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,7 @@ git HEAD
* Use "feh -" to read image from stdin
* Fix Imlib2 and X11 warnings when opening a URL that returned an HTTP
error
+ * Add button bindings to zoom in / out (patch by sdaau)
Mon, 24 Dec 2012 15:45:54 +0100 Daniel Friesel <derf+feh@finalrewind.org>
diff --git a/examples/buttons b/examples/buttons
index e625f9e..3c79413 100644
--- a/examples/buttons
+++ b/examples/buttons
@@ -11,3 +11,7 @@
# Switch menu and zoom keys, useful for two-button touchpads
menu 2
zoom 3
+
+# make scroll wheel (mousewheel up and down) zoom, instead of flipping images
+zoom_in 4
+zoom_out 5 \ No newline at end of file
diff --git a/man/feh.pre b/man/feh.pre
index 706146f..14dfdc9 100644
--- a/man/feh.pre
+++ b/man/feh.pre
@@ -1376,6 +1376,15 @@ Blur current image
.
Rotate current image
.
+.It unbound Bq zoom_in
+.
+Zoom in
+.
+.It unbound Bq zoom_out
+.
+Zoom out
+.
+.
.El
.
.
diff --git a/src/events.c b/src/events.c
index dcd1aa1..fadae9b 100644
--- a/src/events.c
+++ b/src/events.c
@@ -152,6 +152,10 @@ void init_buttonbindings(void)
cur_bb = &buttons.blur;
else if (!strcmp(action, "rotate"))
cur_bb = &buttons.rotate;
+ else if (!strcmp(action, "zoom_in"))
+ cur_bb = &buttons.zoom_in;
+ else if (!strcmp(action, "zoom_out"))
+ cur_bb = &buttons.zoom_out;
else
weprintf("buttons: Invalid action: %s", action);
@@ -246,6 +250,62 @@ static void feh_event_handle_ButtonPress(XEvent * ev)
winwid->im_click_offset_y = (winwid->click_offset_y
- winwid->im_y) / winwid->old_zoom;
+ } else if (feh_is_bb(&buttons.zoom_in, button, state)) {
+ D(("Zoom_In Button Press event\n"));
+ D(("click offset is %d,%d\n", ev->xbutton.x, ev->xbutton.y));
+ winwid->click_offset_x = ev->xbutton.x;
+ winwid->click_offset_y = ev->xbutton.y;
+ winwid->old_zoom = winwid->zoom;
+
+ /* required to adjust the image position in zoom mode */
+ winwid->im_click_offset_x = (winwid->click_offset_x
+ - winwid->im_x) / winwid->old_zoom;
+ winwid->im_click_offset_y = (winwid->click_offset_y
+ - winwid->im_y) / winwid->old_zoom;
+
+ /* copied from zoom_in, keyevents.c */
+ winwid->zoom = winwid->zoom * 1.25;
+
+ if (winwid->zoom > ZOOM_MAX)
+ winwid->zoom = ZOOM_MAX;
+
+ /* copied from below (ZOOM, feh_event_handle_MotionNotify) */
+ winwid->im_x = winwid->click_offset_x
+ - (winwid->im_click_offset_x * winwid->zoom);
+ winwid->im_y = winwid->click_offset_y
+ - (winwid->im_click_offset_y * winwid->zoom);
+
+ winwidget_sanitise_offsets(winwid);
+ winwidget_render_image(winwid, 0, 0);
+
+ } else if (feh_is_bb(&buttons.zoom_out, button, state)) {
+ D(("Zoom_Out Button Press event\n"));
+ D(("click offset is %d,%d\n", ev->xbutton.x, ev->xbutton.y));
+ winwid->click_offset_x = ev->xbutton.x;
+ winwid->click_offset_y = ev->xbutton.y;
+ winwid->old_zoom = winwid->zoom;
+
+ /* required to adjust the image position in zoom mode */
+ winwid->im_click_offset_x = (winwid->click_offset_x
+ - winwid->im_x) / winwid->old_zoom;
+ winwid->im_click_offset_y = (winwid->click_offset_y
+ - winwid->im_y) / winwid->old_zoom;
+
+ /* copied from zoom_out, keyevents.c */
+ winwid->zoom = winwid->zoom * 0.80;
+
+ if (winwid->zoom < ZOOM_MIN)
+ winwid->zoom = ZOOM_MIN;
+
+ /* copied from below (ZOOM, feh_event_handle_MotionNotify) */
+ winwid->im_x = winwid->click_offset_x
+ - (winwid->im_click_offset_x * winwid->zoom);
+ winwid->im_y = winwid->click_offset_y
+ - (winwid->im_click_offset_y * winwid->zoom);
+
+ winwidget_sanitise_offsets(winwid);
+ winwidget_render_image(winwid, 0, 0);
+
} else if (feh_is_bb(&buttons.reload, button, state)) {
D(("Reload Button Press event\n"));
feh_reload_image(winwid, 0, 1);
diff --git a/src/options.h b/src/options.h
index f3f49eb..27d3d38 100644
--- a/src/options.h
+++ b/src/options.h
@@ -207,6 +207,8 @@ struct __fehbb {
struct __fehbutton menu;
struct __fehbutton blur;
struct __fehbutton rotate;
+ struct __fehbutton zoom_in;
+ struct __fehbutton zoom_out;
};
void init_parse_options(int argc, char **argv);