From 867940ea85495ac4e8e23efbb574fd9d86bccf42 Mon Sep 17 00:00:00 2001 From: Bert Münnich Date: Sun, 16 Oct 2011 17:39:22 +0200 Subject: Pan by pixel count, if number prefix given --- commands.c | 4 ++-- image.c | 23 ++++++++++++++++++----- image.h | 2 +- main.c | 6 ++++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/commands.c b/commands.c index 6d9ff38..db0a808 100644 --- a/commands.c +++ b/commands.c @@ -184,7 +184,7 @@ bool it_move(arg_t a) { direction_t dir = (direction_t) a; if (mode == MODE_IMAGE) - return img_pan(&img, dir, false); + return img_pan(&img, dir, prefix); else return tns_move_selection(&tns, dir); } @@ -193,7 +193,7 @@ bool i_pan_screen(arg_t a) { direction_t dir = (direction_t) a; if (mode == MODE_IMAGE) - return img_pan(&img, dir, true); + return img_pan(&img, dir, -1); else return false; } diff --git a/image.c b/image.c index 5510f09..ffed8f4 100644 --- a/image.c +++ b/image.c @@ -576,19 +576,32 @@ bool img_move(img_t *img, int dx, int dy) { } } -bool img_pan(img_t *img, direction_t dir, bool screen) { +bool img_pan(img_t *img, direction_t dir, int d) { + /* d < 0: screen-wise + * d = 0: 1/5 of screen + * d > 0: num of pixels + */ + int x, y; + if (img == NULL || img->im == NULL || img->win == NULL) return false; + if (d > 0) { + x = y = MAX(1, d * img->zoom); + } else { + x = img->win->w / (d < 0 ? 1 : 5); + y = img->win->h / (d < 0 ? 1 : 5); + } + switch (dir) { case DIR_LEFT: - return img_move(img, img->win->w / (screen ? 1 : 5), 0); + return img_move(img, x, 0); case DIR_RIGHT: - return img_move(img, img->win->w / (screen ? 1 : 5) * -1, 0); + return img_move(img, -x, 0); case DIR_UP: - return img_move(img, 0, img->win->h / (screen ? 1 : 5)); + return img_move(img, 0, y); case DIR_DOWN: - return img_move(img, 0, img->win->h / (screen ? 1 : 5) * -1); + return img_move(img, 0, -y); } return false; } diff --git a/image.h b/image.h index 4f2d688..19ee37f 100644 --- a/image.h +++ b/image.h @@ -76,7 +76,7 @@ bool img_zoom_in(img_t*); bool img_zoom_out(img_t*); bool img_move(img_t*, int, int); -bool img_pan(img_t*, direction_t, bool); +bool img_pan(img_t*, direction_t, int); bool img_pan_edge(img_t*, direction_t); void img_rotate_left(img_t*); diff --git a/main.c b/main.c index 1d73283..97dd2db 100644 --- a/main.c +++ b/main.c @@ -337,9 +337,11 @@ void on_keypress(XKeyEvent *kev) { XLookupString(kev, &key, 1, &ksym, NULL); - if (key >= '0' && key <= '9' && (kev->state & ControlMask) == 0) { + if ((ksym == XK_Escape || (key >= '0' && key <= '9')) && + (kev->state & ControlMask) == 0) + { /* number prefix for commands */ - prefix = prefix * 10 + (int) (key - '0'); + prefix = ksym == XK_Escape ? 0 : prefix * 10 + (int) (key - '0'); return; } -- cgit v1.2.3-54-g00ecf