nsxivba293b0
Center zoomed area
+19 −19
4 files changed
| @@ -1,6 +1,6 @@ | |||
| 1 | 1 | all: sxiv | |
| 2 | 2 | ||
| 3 | − | VERSION=git-20110415 | |
| 3 | + | VERSION=git-20110419 | |
| 4 | 4 | ||
| 5 | 5 | CC?=gcc | |
| 6 | 6 | PREFIX?=/usr/local | |
| @@ -212,8 +212,8 @@ int img_center(img_t *img, win_t *win) { | |||
| 212 | 212 | return ox != img->x || oy != img->y; | |
| 213 | 213 | } | |
| 214 | 214 | ||
| 215 | − | int img_zoom(img_t *img, float z) { | |
| 216 | − | if (!img || !img->im) | |
| 215 | + | int img_zoom(img_t *img, win_t *win, float z) { | |
| 216 | + | if (!img || !img->im || !win) | |
| 217 | 217 | return 0; | |
| 218 | 218 | ||
| 219 | 219 | z = MAX(z, zoom_min); | |
| @@ -222,8 +222,8 @@ int img_zoom(img_t *img, float z) { | |||
| 222 | 222 | img->scalemode = SCALE_ZOOM; | |
| 223 | 223 | ||
| 224 | 224 | if (z != img->zoom) { | |
| 225 | − | img->x -= (img->w * z - img->w * img->zoom) / 2; | |
| 226 | − | img->y -= (img->h * z - img->h * img->zoom) / 2; | |
| 225 | + | img->x = win->w / 2 - (win->w / 2 - img->x) * z / img->zoom; | |
| 226 | + | img->y = win->h / 2 - (win->h / 2 - img->y) * z / img->zoom; | |
| 227 | 227 | img->zoom = z; | |
| 228 | 228 | img->checkpan = 1; | |
| 229 | 229 | return 1; | |
| @@ -232,28 +232,28 @@ int img_zoom(img_t *img, float z) { | |||
| 232 | 232 | } | |
| 233 | 233 | } | |
| 234 | 234 | ||
| 235 | − | int img_zoom_in(img_t *img) { | |
| 235 | + | int img_zoom_in(img_t *img, win_t *win) { | |
| 236 | 236 | int i; | |
| 237 | 237 | ||
| 238 | − | if (!img || !img->im) | |
| 238 | + | if (!img || !img->im || !win) | |
| 239 | 239 | return 0; | |
| 240 | 240 | ||
| 241 | 241 | for (i = 1; i < zl_cnt; ++i) { | |
| 242 | 242 | if (zoom_levels[i] > img->zoom * 100.0) | |
| 243 | − | return img_zoom(img, zoom_levels[i] / 100.0); | |
| 243 | + | return img_zoom(img, win, zoom_levels[i] / 100.0); | |
| 244 | 244 | } | |
| 245 | 245 | return 0; | |
| 246 | 246 | } | |
| 247 | 247 | ||
| 248 | − | int img_zoom_out(img_t *img) { | |
| 248 | + | int img_zoom_out(img_t *img, win_t *win) { | |
| 249 | 249 | int i; | |
| 250 | 250 | ||
| 251 | − | if (!img || !img->im) | |
| 251 | + | if (!img || !img->im || !win) | |
| 252 | 252 | return 0; | |
| 253 | 253 | ||
| 254 | 254 | for (i = zl_cnt - 2; i >= 0; --i) { | |
| 255 | 255 | if (zoom_levels[i] < img->zoom * 100.0) | |
| 256 | − | return img_zoom(img, zoom_levels[i] / 100.0); | |
| 256 | + | return img_zoom(img, win, zoom_levels[i] / 100.0); | |
| 257 | 257 | } | |
| 258 | 258 | return 0; | |
| 259 | 259 | } | |
| @@ -63,9 +63,9 @@ void img_render(img_t*, win_t*); | |||
| 63 | 63 | int img_fit_win(img_t*, win_t*); | |
| 64 | 64 | int img_center(img_t*, win_t*); | |
| 65 | 65 | ||
| 66 | − | int img_zoom(img_t*, float); | |
| 67 | − | int img_zoom_in(img_t*); | |
| 68 | − | int img_zoom_out(img_t*); | |
| 66 | + | int img_zoom(img_t*, win_t*, float); | |
| 67 | + | int img_zoom_in(img_t*, win_t*); | |
| 68 | + | int img_zoom_out(img_t*, win_t*); | |
| 69 | 69 | ||
| 70 | 70 | int img_move(img_t*, win_t*, int, int); | |
| 71 | 71 | int img_pan(img_t*, win_t*, pandir_t); | |
| @@ -424,13 +424,13 @@ void on_keypress(XKeyEvent *kev) { | |||
| 424 | 424 | /* zooming */ | |
| 425 | 425 | case XK_plus: | |
| 426 | 426 | case XK_equal: | |
| 427 | − | changed = img_zoom_in(&img); | |
| 427 | + | changed = img_zoom_in(&img, &win); | |
| 428 | 428 | break; | |
| 429 | 429 | case XK_minus: | |
| 430 | − | changed = img_zoom_out(&img); | |
| 430 | + | changed = img_zoom_out(&img, &win); | |
| 431 | 431 | break; | |
| 432 | 432 | case XK_0: | |
| 433 | − | changed = img_zoom(&img, 1.0); | |
| 433 | + | changed = img_zoom(&img, &win, 1.0); | |
| 434 | 434 | break; | |
| 435 | 435 | case XK_w: | |
| 436 | 436 | if ((changed = img_fit_win(&img, &win))) | |
| @@ -607,7 +607,7 @@ void on_buttonpress(XButtonEvent *bev) { | |||
| 607 | 607 | break; | |
| 608 | 608 | case Button4: | |
| 609 | 609 | if (mask == ControlMask) | |
| 610 | − | changed = img_zoom_in(&img); | |
| 610 | + | changed = img_zoom_in(&img, &win); | |
| 611 | 611 | else if (mask == ShiftMask) | |
| 612 | 612 | changed = img_pan(&img, &win, PAN_LEFT); | |
| 613 | 613 | else | |
| @@ -615,7 +615,7 @@ void on_buttonpress(XButtonEvent *bev) { | |||
| 615 | 615 | break; | |
| 616 | 616 | case Button5: | |
| 617 | 617 | if (mask == ControlMask) | |
| 618 | − | changed = img_zoom_out(&img); | |
| 618 | + | changed = img_zoom_out(&img, &win); | |
| 619 | 619 | else if (mask == ShiftMask) | |
| 620 | 620 | changed = img_pan(&img, &win, PAN_RIGHT); | |
| 621 | 621 | else | |