diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | commands.c | 21 | ||||
-rw-r--r-- | config.def.h | 2 | ||||
-rw-r--r-- | sxiv.h | 5 |
4 files changed, 22 insertions, 8 deletions
@@ -1,4 +1,4 @@ -VERSION = git-20180109 +VERSION = git-20180122 srcdir = . VPATH = $(srcdir) @@ -321,9 +321,9 @@ bool ci_scroll_to_edge(arg_t dir) return img_pan_edge(&img, dir); } -bool ci_drag(arg_t _) +bool ci_drag(arg_t mode) { - int x, y; + int x, y, ox, oy; float px, py; XEvent e; @@ -333,12 +333,19 @@ bool ci_drag(arg_t _) win_set_cursor(&win, CURSOR_DRAG); win_cursor_pos(&win, &x, &y); + ox = x; + oy = y; for (;;) { - px = MIN(MAX(0.0, x - win.w*0.1), win.w*0.8) / (win.w*0.8) - * (win.w - img.w * img.zoom); - py = MIN(MAX(0.0, y - win.h*0.1), win.h*0.8) / (win.h*0.8) - * (win.h - img.h * img.zoom); + if (mode == DRAG_ABSOLUTE) { + px = MIN(MAX(0.0, x - win.w*0.1), win.w*0.8) / (win.w*0.8) + * (win.w - img.w * img.zoom); + py = MIN(MAX(0.0, y - win.h*0.1), win.h*0.8) / (win.h*0.8) + * (win.h - img.h * img.zoom); + } else { + px = img.x + x - ox; + py = img.y + y - oy; + } if (img_pos(&img, px, py)) { img_render(&img); @@ -349,6 +356,8 @@ bool ci_drag(arg_t _) if (e.type == ButtonPress || e.type == ButtonRelease) break; while (XCheckTypedEvent(win.env.dpy, MotionNotify, &e)); + ox = x; + oy = y; x = e.xmotion.x; y = e.xmotion.y; } diff --git a/config.def.h b/config.def.h index 5af745d..de9ca51 100644 --- a/config.def.h +++ b/config.def.h @@ -151,7 +151,7 @@ static const keymap_t keys[] = { static const button_t buttons[] = { /* modifiers button function argument */ { 0, 1, i_cursor_navigate, None }, - { 0, 2, i_drag, None }, + { 0, 2, i_drag, DRAG_ABSOLUTE }, { 0, 3, g_switch_mode, None }, { 0, 4, g_zoom, +1 }, { 0, 5, g_zoom, -1 }, @@ -94,6 +94,11 @@ typedef enum { } scalemode_t; typedef enum { + DRAG_RELATIVE, + DRAG_ABSOLUTE +} dragmode_t; + +typedef enum { CURSOR_ARROW, CURSOR_DRAG, CURSOR_WATCH, |