emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r116504: Fix handling of window-min-height/-width (B


From: Martin Rudalics
Subject: [Emacs-diffs] trunk r116504: Fix handling of window-min-height/-width (Bug#16738).
Date: Fri, 21 Feb 2014 08:02:49 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 116504
revision-id: address@hidden
parent: address@hidden
committer: martin rudalics <address@hidden>
branch nick: trunk
timestamp: Fri 2014-02-21 09:02:05 +0100
message:
  Fix handling of window-min-height/-width (Bug#16738).
  
  * window.el (window--dump-window, window--dump-frame): New
  functions.
  (window--min-size-1): Account for window dividers.  When
  window-resize-pixelwise is nil, delay rounding till after the
  sum of the window components has been calculated.
  (window--min-delta-1, window--max-delta-1): When PIXELWISE is
  nil make sure at least one text line and two text columns remain
  fully visible.
  (window-resize): Signal an error when window-resize-apply fails.
  (window--resize-child-windows): Fix calculation of by how many
  pixels a window can still be shrunk via window-new-normal.
  (adjust-window-trailing-edge): Call window--resizable with
  correct TRAIL argument.
modified:
  lisp/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-1432
  lisp/window.el                 window.el-20091113204419-o5vbwnq5f7feedwu-94
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/window.c                   window.c-20091113204419-o5vbwnq5f7feedwu-231
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2014-02-21 07:56:52 +0000
+++ b/lisp/ChangeLog    2014-02-21 08:02:05 +0000
@@ -1,3 +1,20 @@
+2014-02-21  Martin Rudalics  <address@hidden>
+
+       Fix handling of window-min-height/-width (Bug#16738).
+       * window.el (window--dump-window, window--dump-frame): New
+       functions.
+       (window--min-size-1): Account for window dividers.  When
+       window-resize-pixelwise is nil, delay rounding till after the
+       sum of the window components has been calculated.
+       (window--min-delta-1, window--max-delta-1): When PIXELWISE is
+       nil make sure at least one text line and two text columns remain
+       fully visible.
+       (window-resize): Signal an error when window-resize-apply fails.
+       (window--resize-child-windows): Fix calculation of by how many
+       pixels a window can still be shrunk via window-new-normal.
+       (adjust-window-trailing-edge): Call window--resizable with
+       correct TRAIL argument.
+
 2014-02-21  Michael Albinus  <address@hidden>
 
        * net/tramp.el (tramp-check-cached-permissions):

=== modified file 'lisp/window.el'
--- a/lisp/window.el    2014-02-19 09:54:35 +0000
+++ b/lisp/window.el    2014-02-21 08:02:05 +0000
@@ -1012,6 +1012,84 @@
   (window--side-check frame)
   (window--atom-check frame))
 
+;; Dumping frame/window contents.
+(defun window--dump-window (&optional window erase)
+  "Dump WINDOW to buffer *window-frame-dump*.
+WINDOW must be a valid window and defaults to the selected one.
+Optional argument ERASE non-nil means erase *window-frame-dump*
+before writing to it."
+  (setq window (window-normalize-window window))
+  (with-current-buffer (get-buffer-create "*window-frame-dump*")
+    (when erase (erase-buffer))
+    (insert
+     (format "%s   parent: %s\n" window (window-parent window))
+     (format "pixel left: %s   top: %s   size: %s x %s   new: %s\n"
+            (window-pixel-left window) (window-pixel-top window)
+            (window-size window t t) (window-size window nil t)
+            (window-new-pixel window))
+     (format "char left: %s   top: %s   size: %s x %s   new: %s\n"
+            (window-left-column window) (window-top-line window)
+            (window-total-size window t) (window-total-size window)
+            (window-new-total window))
+     (format "normal: %s x %s   new: %s\n"
+            (window-normal-size window t) (window-normal-size window)
+            (window-new-normal window)))
+    (when (window-live-p window)
+      (let ((fringes (window-fringes window))
+           (margins (window-margins window)))
+       (insert
+        (format "body pixel: %s x %s   char: %s x %s\n"
+                (window-body-width window t) (window-body-height window t)
+                (window-body-width window) (window-body-height window))
+        (format "width left fringe: %s  left margin: %s  right margin: %s\n"
+                (car fringes) (or (car margins) 0) (or (cdr margins) 0))
+        (format "width right fringe: %s  scroll-bar: %s  divider: %s\n"
+                (cadr fringes)
+                (window-scroll-bar-width window)
+                (window-right-divider-width window))
+        (format "height header-line: %s  mode-line: %s  divider: %s\n"
+                (window-header-line-height window)
+                (window-mode-line-height window)
+                (window-bottom-divider-width window)))))
+    (insert "\n")))
+
+(defun window--dump-frame (&optional window-or-frame)
+  "Dump WINDOW-OR-FRAME to buffer *window-frame-dump*.
+WINDOW-OR-FRAME can be a frame or a window and defaults to the
+selected frame.  When WINDOW-OR-FRAME is a window, dump that
+window's frame.  The buffer *window-frame-dump* is erased before
+dumping to it."
+  (interactive)
+  (let* ((window
+         (cond
+          ((or (not window-or-frame)
+               (frame-live-p window-or-frame))
+           (frame-root-window window-or-frame))
+          ((or (window-live-p window-or-frame)
+               (window-child window-or-frame))
+           window-or-frame)
+          (t
+           (frame-root-window))))
+        (frame (window-frame window)))
+    (with-current-buffer (get-buffer-create "*window-frame-dump*")
+      (erase-buffer)
+      (insert
+       (format "frame pixel: %s x %s   cols/lines: %s x %s   units: %s x %s\n"
+              (frame-pixel-width frame) (frame-pixel-height frame)
+              (frame-total-cols frame) (frame-text-lines frame) ; 
(frame-total-lines frame)
+              (frame-char-width frame) (frame-char-height frame))
+       (format "frame text pixel: %s x %s   cols/lines: %s x %s\n"
+              (frame-text-width frame) (frame-text-height frame)
+              (frame-text-cols frame) (frame-text-lines frame))
+       (format "tool: %s  scroll: %s  fringe: %s  border: %s  right: %s  
bottom: %s\n\n"
+              (tool-bar-height frame t)
+              (frame-scroll-bar-width frame)
+              (frame-fringe-width frame)
+              (frame-border-width frame)
+              (frame-right-divider-width frame)
+              (frame-bottom-divider-width frame)))
+      (walk-window-tree 'window--dump-window frame t t))))
+
 ;;; Window sizes.
 (defun window-total-size (&optional window horizontal round)
   "Return the total height or width of WINDOW.
@@ -1140,55 +1218,46 @@
          ;; windows such that the new (or resized) windows can get a
          ;; size less than the user-specified `window-min-height' and
          ;; `window-min-width'.
-         (let ((frame (window-frame window))
-               (fringes (window-fringes window))
-               (scroll-bars (window-scroll-bars window)))
+         (let* ((char-size (frame-char-size window t))
+                (fringes (window-fringes window))
+                (pixel-width
+                 (+ (window-safe-min-size window t t)
+                    (car fringes) (cadr fringes)
+                    (window-scroll-bar-width window)
+                    (window-right-divider-width window))))
            (if pixelwise
                (max
-                (+ (window-safe-min-size window t t)
-                   (car fringes) (cadr fringes)
-                   (cond
-                    ((memq (nth 2 scroll-bars) '(left right))
-                     (nth 1 scroll-bars))
-                    ((memq (frame-parameter frame 'vertical-scroll-bars)
-                           '(left right))
-                     (frame-parameter frame 'scroll-bar-width))
-                    (t 0)))
+                (if window-resize-pixelwise
+                    pixel-width
+                  ;; Round up to next integral of columns.
+                  (* (ceiling pixel-width char-size) char-size))
                 (if (window--size-ignore-p window ignore)
                     0
                   (window-min-pixel-width)))
              (max
-              (+ window-safe-min-width
-                 (ceiling (car fringes) (frame-char-width frame))
-                 (ceiling (cadr fringes) (frame-char-width frame))
-                 (cond
-                  ((memq (nth 2 scroll-bars) '(left right))
-                   (nth 1 scroll-bars))
-                ((memq (frame-parameter frame 'vertical-scroll-bars)
-                       '(left right))
-                 (ceiling (or (frame-parameter frame 'scroll-bar-width) 14)
-                          (frame-char-width)))
-                (t 0)))
+              (ceiling pixel-width char-size)
               (if (window--size-ignore-p window ignore)
                   0
                 window-min-width)))))
-        (pixelwise
-         (max
-          (+ (window-safe-min-size window nil t)
-             (window-header-line-height window)
-             (window-mode-line-height window))
-          (if (window--size-ignore-p window ignore)
-              0
-            (window-min-pixel-height))))
-        (t
-         ;; For the minimum height of a window take any mode- or
-         ;; header-line into account.
-         (max (+ window-safe-min-height
-                 (if header-line-format 1 0)
-                 (if mode-line-format 1 0))
-              (if (window--size-ignore-p window ignore)
-                  0
-                window-min-height))))))))
+        ((let ((char-size (frame-char-size window))
+               (pixel-height
+                (+ (window-safe-min-size window nil t)
+                   (window-header-line-height window)
+                   (window-mode-line-height window)
+                   (window-bottom-divider-width window))))
+           (if pixelwise
+               (max
+                (if window-resize-pixelwise
+                    pixel-height
+                  ;; Round up to next integral of lines.
+                  (* (ceiling pixel-height char-size) char-size))
+                (if (window--size-ignore-p window ignore)
+                    0
+                  (window-min-pixel-height)))
+             (max (ceiling pixel-height char-size)
+                  (if (window--size-ignore-p window ignore)
+                      0
+                    window-min-height))))))))))
 
 (defun window-sizable (window delta &optional horizontal ignore pixelwise)
   "Return DELTA if DELTA lines can be added to WINDOW.
@@ -1323,9 +1392,10 @@
            (unless (eq sub window)
              (setq delta
                    (min delta
-                        (- (window-size sub horizontal pixelwise 'floor)
-                           (window-min-size
-                            sub horizontal ignore pixelwise)))))
+                        (max (- (window-size sub horizontal pixelwise 'ceiling)
+                                (window-min-size
+                                 sub horizontal ignore pixelwise))
+                             0))))
            (setq sub (window-right sub))))
        (if noup
            delta
@@ -1400,9 +1470,11 @@
                 (t
                  (setq delta
                        (+ delta
-                          (- (window-size sub horizontal pixelwise 'floor)
-                             (window-min-size
-                              sub horizontal ignore pixelwise))))))
+                          (max
+                           (- (window-size sub horizontal pixelwise 'ceiling)
+                              (window-min-size
+                               sub horizontal ignore pixelwise))
+                           0)))))
                (setq sub (window-right sub))))
          ;; For an ortho-combination throw DELTA when at least one
          ;; child window is fixed-size.
@@ -2317,9 +2389,11 @@
        ;; Otherwise, resize all other windows in the same combination.
        (window--resize-siblings window delta horizontal ignore))
       (when (window--resize-apply-p frame horizontal)
-       (window-resize-apply frame horizontal)
-       (window--pixel-to-total frame horizontal)
-       (run-window-configuration-change-hook frame)))
+       (if (window-resize-apply frame horizontal)
+           (progn
+             (window--pixel-to-total frame horizontal)
+             (run-window-configuration-change-hook frame))
+         (error "Failed to apply resizing %s" window))))
      (t
       (error "Cannot resize window %s" window)))))
 
@@ -2560,7 +2634,7 @@
          (setq best-value most-negative-fixnum)
          (while sub
            (when (and (consp (window-new-normal sub))
-                      (not (zerop (car (window-new-normal sub))))
+                      (not (<= (car (window-new-normal sub)) 0))
                       (> (cdr (window-new-normal sub)) best-value))
              (setq best-window sub)
              (setq best-value (cdr (window-new-normal sub))))
@@ -2576,7 +2650,7 @@
             best-window
             (if (= (car (window-new-normal best-window)) best-delta)
                 'skip      ; We can't shrink best-window any further.
-              (cons (1- (car (window-new-normal best-window)))
+              (cons (- (car (window-new-normal best-window)) best-delta)
                     (- (/ (float (window-new-pixel best-window))
                           parent-total)
                        (window-normal-size best-window horizontal))))))))
@@ -2941,7 +3015,7 @@
          (window--resize-reset frame horizontal)
          ;; Try to enlarge LEFT first.
          (setq this-delta (window--resizable
-                           left delta horizontal nil nil nil nil pixelwise))
+                           left delta horizontal nil 'after nil nil pixelwise))
          (unless (zerop this-delta)
            (window--resize-this-window
             left this-delta horizontal nil t 'before
@@ -2970,7 +3044,7 @@
          ;; Try to enlarge RIGHT.
          (setq this-delta
                (window--resizable
-                right (- delta) horizontal nil nil nil nil pixelwise))
+                right (- delta) horizontal nil 'before nil nil pixelwise))
          (unless (zerop this-delta)
            (window--resize-this-window
             right this-delta horizontal nil t 'after

=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2014-02-21 07:42:42 +0000
+++ b/src/ChangeLog     2014-02-21 08:02:05 +0000
@@ -1,3 +1,7 @@
+2014-02-21  Martin Rudalics  <address@hidden>
+
+       * window.c (Fwindow_scroll_bar_width): New function.
+
 2014-02-21  Paul Eggert  <address@hidden>
 
        Pacify GCC when configuring with --enable-gcc-warnings.

=== modified file 'src/window.c'
--- a/src/window.c      2014-02-07 10:55:28 +0000
+++ b/src/window.c      2014-02-21 08:02:05 +0000
@@ -974,6 +974,15 @@
   return (make_number (WINDOW_BOTTOM_DIVIDER_WIDTH (decode_live_window 
(window))));
 }
 
+DEFUN ("window-scroll-bar-width", Fwindow_scroll_bar_width,
+       Swindow_scroll_bar_width, 0, 1, 0,
+       doc: /* Return the width in pixels of WINDOW's vertical scrollbar.
+WINDOW must be a live window and defaults to the selected one.  */)
+  (Lisp_Object window)
+{
+  return (make_number (WINDOW_SCROLL_BAR_AREA_WIDTH (decode_live_window 
(window))));
+}
+
 DEFUN ("window-hscroll", Fwindow_hscroll, Swindow_hscroll, 0, 1, 0,
        doc: /* Return the number of columns by which WINDOW is scrolled from 
left margin.
 WINDOW must be a live window and defaults to the selected one.  */)
@@ -7363,6 +7372,7 @@
   defsubr (&Swindow_header_line_height);
   defsubr (&Swindow_right_divider_width);
   defsubr (&Swindow_bottom_divider_width);
+  defsubr (&Swindow_scroll_bar_width);
   defsubr (&Swindow_inside_edges);
   defsubr (&Swindow_inside_pixel_edges);
   defsubr (&Swindow_inside_absolute_pixel_edges);


reply via email to

[Prev in Thread] Current Thread [Next in Thread]