From 23170c89bb32325ed9d64ba21dcf5e265e93e8f9 Mon Sep 17 00:00:00 2001 From: cashmere Date: Thu, 26 Feb 2026 10:22:06 +0100 Subject: feat: add image-mode centering and zoom controls Images in image-mode now display centered in the window with +/-/0 keybindings for zoom in/out/reset. - Add kitty-gfx--image-scale buffer-local variable - Add kitty-gfx--image-mode-render for centered display at scale - Add kitty-gfx-image-increase-size (1.25x per press) - Add kitty-gfx-image-decrease-size (0.8x per press) - Add kitty-gfx-image-reset-size (back to 1.0) - Bind +/-/0 in the image-mode keymap --- kitty-graphics.el | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/kitty-graphics.el b/kitty-graphics.el index 96a3171..cd68992 100644 --- a/kitty-graphics.el +++ b/kitty-graphics.el @@ -863,6 +863,45 @@ image via Kitty graphics instead of an Emacs image spec." ;;;; image-mode integration +(defvar-local kitty-gfx--image-scale 1.0 + "Zoom scale factor for image-mode display. +Values > 1.0 zoom in, < 1.0 zoom out.") + +(defun kitty-gfx--image-mode-render () + "Render the current image file centered at current scale." + (when-let ((file (buffer-file-name))) + (when (kitty-gfx--image-file-p file) + (let* ((inhibit-read-only t) + (win-w (- (window-body-width) 2)) + (win-h (- (window-body-height) 2)) + (max-cols (min win-w kitty-gfx-max-width)) + (max-rows (min win-h kitty-gfx-max-height))) + ;; Remove existing images and clear buffer + (kitty-gfx-remove-images) + (erase-buffer) + (kitty-gfx--display-image-centered + file max-cols max-rows win-w win-h + kitty-gfx--image-scale) + (goto-char (point-min)))))) + +(defun kitty-gfx-image-increase-size () + "Zoom in on the image in image-mode." + (interactive) + (setq kitty-gfx--image-scale (* kitty-gfx--image-scale 1.25)) + (kitty-gfx--image-mode-render)) + +(defun kitty-gfx-image-decrease-size () + "Zoom out on the image in image-mode." + (interactive) + (setq kitty-gfx--image-scale (max 0.1 (* kitty-gfx--image-scale 0.8))) + (kitty-gfx--image-mode-render)) + +(defun kitty-gfx-image-reset-size () + "Reset image zoom to default in image-mode." + (interactive) + (setq kitty-gfx--image-scale 1.0) + (kitty-gfx--image-mode-render)) + (defun kitty-gfx--image-mode-advice (orig-fn &rest args) "Around advice for `image-mode'." (if (and kitty-graphics-mode (not (display-graphic-p))) @@ -874,14 +913,12 @@ image via Kitty graphics instead of an Emacs image spec." (set-keymap-parent map (if (boundp 'image-mode-map) image-mode-map special-mode-map)) (define-key map (kbd "q") #'kill-current-buffer) + (define-key map (kbd "+") #'kitty-gfx-image-increase-size) + (define-key map (kbd "-") #'kitty-gfx-image-decrease-size) + (define-key map (kbd "0") #'kitty-gfx-image-reset-size) (use-local-map map)) (setq-local buffer-read-only t) - (when-let ((file (buffer-file-name))) - (when (kitty-gfx--image-file-p file) - (kitty-gfx-display-image - file (point-min) (point-max) - (min (- (window-body-width) 2) kitty-gfx-max-width) - (min (- (window-body-height) 2) kitty-gfx-max-height)))) + (kitty-gfx--image-mode-render) (run-mode-hooks 'image-mode-hook)) (apply orig-fn args))) -- cgit v1.3.1