From d5c5708110bcaa60815d7648260f9688bbd12824 Mon Sep 17 00:00:00 2001 From: phi Date: Fri, 12 Jan 2018 20:39:46 +0800 Subject: Use argument to select between two drag methods --- Makefile | 2 +- commands.c | 21 +++++++++++++++------ config.def.h | 2 +- sxiv.h | 5 +++++ 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 3df162f..8ce289d 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION = git-20180109 +VERSION = git-20180122 srcdir = . VPATH = $(srcdir) diff --git a/commands.c b/commands.c index 966ee4c..4ad4e04 100644 --- a/commands.c +++ b/commands.c @@ -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 }, diff --git a/sxiv.h b/sxiv.h index 4e384c8..d1acb4c 100644 --- a/sxiv.h +++ b/sxiv.h @@ -93,6 +93,11 @@ typedef enum { SCALE_ZOOM } scalemode_t; +typedef enum { + DRAG_RELATIVE, + DRAG_ABSOLUTE +} dragmode_t; + typedef enum { CURSOR_ARROW, CURSOR_DRAG, -- cgit v1.2.3-54-g00ecf