]> git.eshelyaron.com Git - emacs.git/commitdiff
* image-mode.el (image-mode-fit-frame): Add a frame argument.
authorChong Yidong <cyd@gnu.org>
Sat, 19 Jan 2013 10:34:07 +0000 (18:34 +0800)
committerChong Yidong <cyd@gnu.org>
Sat, 19 Jan 2013 10:34:07 +0000 (18:34 +0800)
Suggested by Drew Adams.  Handle window decorations;
save and restore the old window configuration.

Fixes: debbugs:7730
etc/NEWS
lisp/ChangeLog
lisp/image-mode.el

index 0471683fa9be411092306fdf26f01b1f37f6e349..4cba17573b38ee3ab59b9be176df00ab165c04cc 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -109,6 +109,13 @@ amounts of data into the ERC input.
 *** The icomplete-separator is customizable, and its default has changed.
 *** Removed icomplete-show-key-bindings.
 
+** Image mode
+---
+*** The command `image-mode-fit-frame' deletes other windows.
+When toggling, it restores the frame's previous window configuration.
+It also has an optional frame argument, which can be used by Lisp
+callers to fit the image to a frame other than the selected frame.
+
 ** Isearch
 
 *** `C-x 8 RET' in Isearch mode reads a character by its Unicode name
index 0905c20381ab4fdbb68836bc0c3dd88b7ef84c34..f63e9ecafe8f8886e93d655c41d6396c798435bb 100644 (file)
@@ -1,3 +1,9 @@
+2013-01-19  Chong Yidong  <cyd@gnu.org>
+
+       * image-mode.el (image-mode-fit-frame): Add a frame argument.
+       Suggested by Drew Adams (Bug#7730).  Handle window decorations;
+       save and restore the old window configuration.
+
 2013-01-18  Leo Liu  <sdl.web@gmail.com>
 
        * progmodes/js.el: Tweak autoload cookie for alias.
index a95dde1d999cb13175d649b6a1f20ab802b57d0a..bbb72335aa3424941314761bc46c1157a1d6de31 100644 (file)
@@ -278,28 +278,50 @@ stopping if the top or bottom edge of the image is reached."
 
 ;; Adjust frame and image size.
 
-(defun image-mode-fit-frame ()
-  "Toggle whether to fit the frame to the current image.
-This function assumes the current frame has only one window."
-  ;; FIXME: This does not take into account decorations like mode-line,
-  ;; minibuffer, header-line, ...
-  (interactive)
-  (let* ((saved (frame-parameter nil 'image-mode-saved-size))
+(defun image-mode-fit-frame (&optional frame toggle)
+  "Fit FRAME to the current image.
+If FRAME is omitted or nil, it defaults to the selected frame.
+All other windows on the frame are deleted.
+
+If called interactively, or if TOGGLE is non-nil, toggle between
+fitting FRAME to the current image and restoring the size and
+window configuration prior to the last `image-mode-fit-frame'
+call."
+  (interactive (list nil t))
+  (let* ((buffer (current-buffer))
          (display (image-get-display-property))
-         (size (image-display-size display)))
-    (if (and saved
-             (eq (caar saved) (frame-width))
-             (eq (cdar saved) (frame-height)))
-        (progn ;; Toggle back to previous non-fitted size.
-          (set-frame-parameter nil 'image-mode-saved-size nil)
-          (setq size (cdr saved)))
-      ;; Round up size, and save current size so we can toggle back to it.
-      (setcar size (ceiling (car size)))
-      (setcdr size (ceiling (cdr size)))
-      (set-frame-parameter nil 'image-mode-saved-size
-                           (cons size (cons (frame-width) (frame-height)))))
-    (set-frame-width  (selected-frame) (car size))
-    (set-frame-height (selected-frame) (cdr size))))
+         (size (image-display-size display))
+        (saved (frame-parameter frame 'image-mode-saved-params))
+        (window-configuration (current-window-configuration frame))
+        (width  (frame-width  frame))
+        (height (frame-height frame)))
+    (with-selected-frame (or frame (selected-frame))
+      (if (and toggle saved
+              (= (caar saved) width)
+              (= (cdar saved) height))
+         (progn
+           (set-frame-width  frame (car (nth 1 saved)))
+           (set-frame-height frame (cdr (nth 1 saved)))
+           (set-window-configuration (nth 2 saved))
+           (set-frame-parameter frame 'image-mode-saved-params nil))
+       (delete-other-windows)
+       (switch-to-buffer buffer t t)
+       (let* ((edges (window-inside-edges))
+              (inner-width  (- (nth 2 edges) (nth 0 edges)))
+              (inner-height (- (nth 3 edges) (nth 1 edges))))
+         (set-frame-width  frame (+ (ceiling (car size))
+                                    width (- inner-width)))
+         (set-frame-height frame (+ (ceiling (cdr size))
+                                    height (- inner-height)))
+         ;; The frame size after the above `set-frame-*' calls may
+         ;; differ from what we specified, due to window manager
+         ;; interference.  We have to call `frame-width' and
+         ;; `frame-height' to get the actual results.
+         (set-frame-parameter frame 'image-mode-saved-params
+                              (list (cons (frame-width)
+                                          (frame-height))
+                                    (cons width height)
+                                    window-configuration)))))))
 
 ;;; Image Mode setup