]> git.eshelyaron.com Git - emacs.git/commitdiff
Restore the point after aborting an image crop
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 18 Sep 2022 11:10:02 +0000 (13:10 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 18 Sep 2022 11:10:02 +0000 (13:10 +0200)
* lisp/image/image-crop.el (image-crop): Restore point after
aborted cropping (bug#57874).

lisp/image/image-crop.el

index 8b6694f22314bd58658b7ee1db96cd3b2e07a8c0..39c575763624af1224363b26b510e0d45287d630 100644 (file)
@@ -29,6 +29,7 @@
 
 (require 'svg)
 (require 'text-property-search)
+(eval-when-compile (require 'subr-x))
 
 (defgroup image-crop ()
   "Image cropping."
@@ -149,6 +150,7 @@ After cropping an image, you can save it by `M-x image-save' or
                  (data
                   (image-crop--content-type data))))
           (image-scaling-factor 1)
+           (orig-point (point))
           (size (image-size image t))
           (svg (svg-create (car size) (cdr size)
                            :xmlns:xlink "http://www.w3.org/1999/xlink"
@@ -186,25 +188,27 @@ After cropping an image, you can save it by `M-x image-save' or
       (svg-embed svg data type t
                 :width (car size)
                 :height (cdr size))
-      (delete-region image-start image-end)
-      (svg-insert-image svg)
-      (let ((area (condition-case _
-                     (save-excursion
-                       (forward-line 1)
-                       (image-crop--crop-image-1
-                         svg (if cut "cut" "crop")))
-                    (quit nil))))
-        (message (substitute-command-keys
-                  "Type \\[image-save] to save %s image to file")
-                 (if cut "cut" "cropped"))
-       (delete-region (pos-bol) (pos-eol))
-       (if area
-           (image-crop--crop-image-update
-             area orig-data size type cut text)
-         ;; If the user didn't complete the crop, re-insert the
-         ;; original image (and text).
-         (insert text))
-       (undo-amalgamate-change-group undo-handle)))))
+      (with-buffer-unmodified-if-unchanged
+        (delete-region image-start image-end)
+        (svg-insert-image svg)
+        (let ((area (condition-case _
+                       (save-excursion
+                         (forward-line 1)
+                         (image-crop--crop-image-1
+                           svg (if cut "cut" "crop")))
+                      (quit nil))))
+          (message (substitute-command-keys
+                    "Type \\[image-save] to save %s image to file")
+                   (if cut "cut" "cropped"))
+         (delete-region (pos-bol) (pos-eol))
+         (if area
+             (image-crop--crop-image-update
+               area orig-data size type cut text)
+           ;; If the user didn't complete the crop, re-insert the
+           ;; original image (and text).
+           (insert text)
+            (goto-char orig-point))
+         (undo-amalgamate-change-group undo-handle))))))
 
 (defun image-crop--crop-image-update (area data size type cut text)
   (let* ((image-scaling-factor 1)