diff options
Diffstat (limited to 'commands.c')
-rw-r--r-- | commands.c | 77 |
1 files changed, 23 insertions, 54 deletions
@@ -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; } |