diff options
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | commands.c | 3 | ||||
-rw-r--r-- | config.def.h | 4 | ||||
-rw-r--r-- | image.c | 17 | ||||
-rw-r--r-- | image.h | 2 | ||||
-rw-r--r-- | sxiv.1 | 6 | ||||
-rw-r--r-- | types.h | 2 |
7 files changed, 30 insertions, 6 deletions
@@ -115,6 +115,8 @@ The following additional key commands are available in *image mode*: - Zoom out = Set zoom level to 100%, or [count]% w Fit image into window + e Fit image to window's width + E Fit image to window's height h,j,k,l Pan image 1/5 of window width/height or [count] pixels left/down/up/right (also with arrow keys) @@ -310,9 +310,10 @@ bool i_set_zoom(arg_t a) { bool i_fit_to_win(arg_t a) { bool ret = false; + scalemode_t sm = (scalemode_t) a; if (mode == MODE_IMAGE) { - if ((ret = img_fit_win(&img))) + if ((ret = img_fit_win(&img, sm))) img_center(&img); } return ret; diff --git a/config.def.h b/config.def.h index 1116602..49dac49 100644 --- a/config.def.h +++ b/config.def.h @@ -108,7 +108,9 @@ static const keymap_t keys[] = { { false, XK_minus, i_zoom, (arg_t) -1 }, { false, XK_KP_Subtract, i_zoom, (arg_t) -1 }, { false, XK_equal, i_set_zoom, (arg_t) 100 }, - { false, XK_w, i_fit_to_win, (arg_t) None }, + { false, XK_w, i_fit_to_win, (arg_t) SCALE_FIT }, + { false, XK_e, i_fit_to_win, (arg_t) SCALE_WIDTH }, + { false, XK_E, i_fit_to_win, (arg_t) SCALE_HEIGHT }, { false, XK_W, i_fit_to_img, (arg_t) None }, { false, XK_less, i_rotate, (arg_t) DIR_LEFT }, @@ -365,7 +365,18 @@ bool img_fit(img_t *img) { zw = (float) img->win->w / (float) img->w; zh = (float) img->win->h / (float) img->h; - z = MIN(zw, zh); + switch (img->scalemode) { + case SCALE_WIDTH: + z = zw; + break; + case SCALE_HEIGHT: + z = zh; + break; + default: + z = MIN(zw, zh); + break; + } + z = MAX(z, zoom_min); z = MIN(z, zmax); @@ -448,11 +459,11 @@ void img_render(img_t *img) { img->dirty = false; } -bool img_fit_win(img_t *img) { +bool img_fit_win(img_t *img, scalemode_t sm) { if (img == NULL || img->im == NULL) return false; - img->scalemode = SCALE_FIT; + img->scalemode = sm; return img_fit(img); } @@ -65,7 +65,7 @@ void img_close(img_t*, bool); void img_render(img_t*); -bool img_fit_win(img_t*); +bool img_fit_win(img_t*, scalemode_t); bool img_center(img_t*); bool img_zoom(img_t*, float); @@ -197,6 +197,12 @@ Set zoom level to 100%, or .TP .B w Set zoom level to fit image into window. +.TP +.B e +Set zoom level to fit image into the window's width. +.TP +.B E +Set zoom level to fit image into the window's height. .SS Panning .TP .BR h ", " Left @@ -31,6 +31,8 @@ typedef enum { typedef enum { SCALE_DOWN, SCALE_FIT, + SCALE_WIDTH, + SCALE_HEIGHT, SCALE_ZOOM } scalemode_t; |