summaryrefslogtreecommitdiffstats
path: root/commands.c
diff options
context:
space:
mode:
authorBert Münnich <ber.t@posteo.de>2017-10-04 18:12:27 +0200
committerBert Münnich <ber.t@posteo.de>2017-10-04 18:22:43 +0200
commite310136e02ada4862c250280034d36fbfa24fc61 (patch)
tree496db891475c1b9670ab49e5f025012d05f4b37a /commands.c
parent9b6acc781e3fc2994bde60db397cfd82e2e050d1 (diff)
downloadnsxiv-e310136e02ada4862c250280034d36fbfa24fc61.tar.zst
Mouse drag translates pointer position to image area
This makes mouse panning more direct and faster.
Diffstat (limited to 'commands.c')
-rw-r--r--commands.c77
1 files changed, 23 insertions, 54 deletions
diff --git a/commands.c b/commands.c
index 44a6cf5..2e1d66c 100644
--- a/commands.c
+++ b/commands.c
@@ -320,72 +320,41 @@ bool ci_scroll_to_edge(arg_t dir)
return img_pan_edge(&img, dir);
}
-/* Xlib helper function for i_drag() */
-Bool is_motionnotify(Display *d, XEvent *e, XPointer a)
-{
- return e != NULL && e->type == MotionNotify;
-}
-
-#define WARP(x,y) \
- XWarpPointer(win.env.dpy, None, win.xwin, 0, 0, 0, 0, x, y); \
- ox = x, oy = y; \
- break
-
bool ci_drag(arg_t _)
{
- int dx = 0, dy = 0, i, ox, oy, x, y;
+ int i, x, y;
+ float px, py;
unsigned int ui;
- bool dragging = true, next = false;
XEvent e;
Window w;
- if (!XQueryPointer(win.env.dpy, win.xwin, &w, &w, &i, &i, &ox, &oy, &ui))
+ if ((int)(img.w * img.zoom) < win.w && (int)(img.h * img.zoom) < win.h)
+ return false;
+ if (!XQueryPointer(win.env.dpy, win.xwin, &w, &w, &i, &i, &x, &y, &ui))
return false;
- win_set_cursor(&win, CURSOR_HAND);
-
- while (dragging) {
- if (!next)
- XMaskEvent(win.env.dpy,
- ButtonPressMask | ButtonReleaseMask | PointerMotionMask, &e);
- switch (e.type) {
- case ButtonPress:
- case ButtonRelease:
- dragging = false;
- break;
- case MotionNotify:
- x = e.xmotion.x;
- y = e.xmotion.y;
-
- /* wrap the mouse around */
- if (x <= 0) {
- WARP(win.w - 2, y);
- } else if (x >= win.w - 1) {
- WARP(1, y);
- } else if (y <= 0) {
- WARP(x, win.h - 2);
- } else if (y >= win.h - 1) {
- WARP(x, 1);
- }
- dx += x - ox;
- dy += y - oy;
- ox = x;
- oy = y;
- break;
- }
- if (dragging)
- next = XCheckIfEvent(win.env.dpy, &e, is_motionnotify, None);
- if ((!dragging || !next) && (dx != 0 || dy != 0)) {
- if (img_move(&img, dx, dy)) {
- img_render(&img);
- win_draw(&win);
- }
- dx = dy = 0;
+ win_set_cursor(&win, CURSOR_DRAG);
+
+ 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 (img_pos(&img, px, py)) {
+ img_render(&img);
+ win_draw(&win);
}
+ XMaskEvent(win.env.dpy,
+ ButtonPressMask | ButtonReleaseMask | PointerMotionMask, &e);
+ if (e.type == ButtonPress || e.type == ButtonRelease)
+ break;
+ while (XCheckTypedEvent(win.env.dpy, MotionNotify, &e));
+ x = e.xmotion.x;
+ y = e.xmotion.y;
}
win_set_cursor(&win, CURSOR_ARROW);
set_timeout(reset_cursor, TO_CURSOR_HIDE, true);
- reset_timeout(redraw);
return true;
}