changeset 105398:3fec4318d760

(calendar-basic-setup): Handle the case where the frame is wide. (calendar-generate-window): Test for shrinkability rather than width.
author Glenn Morris <rgm@gnu.org>
date Sat, 03 Oct 2009 02:19:22 +0000
parents 31fd98c59048
children 2f74d2880f10
files lisp/ChangeLog lisp/calendar/calendar.el
diffstat 2 files changed, 46 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sat Oct 03 02:11:59 2009 +0000
+++ b/lisp/ChangeLog	Sat Oct 03 02:19:22 2009 +0000
@@ -1,5 +1,9 @@
 2009-10-03  Glenn Morris  <rgm@gnu.org>
 
+	* calendar/calendar.el (calendar-basic-setup): Handle the case where
+	the frame is wide.
+	(calendar-generate-window): Test for shrinkability rather than width.
+
 	* cedet/semantic/db-find.el (data-debug-insert-tag-list): Comment out
 	declaration, currently false.
 
--- a/lisp/calendar/calendar.el	Sat Oct 03 02:11:59 2009 +0000
+++ b/lisp/calendar/calendar.el	Sat Oct 03 02:19:22 2009 +0000
@@ -1283,6 +1283,8 @@
   (set-buffer (get-buffer-create calendar-buffer))
   (calendar-mode)
   (let* ((pop-up-windows t)
+         ;; Not really needed now, but means we use exactly the same
+         ;; behavior as before in the non-wide case (see below).
          (split-height-threshold 1000)
          (date (if arg (calendar-read-date t)
                  (calendar-current-date)))
@@ -1291,7 +1293,40 @@
     (calendar-increment-month month year (- calendar-offset))
     ;; Display the buffer before calling calendar-generate-window so that it
     ;; can get a chance to adjust the window sizes to the frame size.
-    (or nodisplay (pop-to-buffer calendar-buffer))
+    (unless nodisplay
+      ;; We want a window configuration that looks something like
+      ;; X        X | Y
+      ;; -        -----
+      ;; C        Z | C
+      ;; where C is the calendar, and the LHS is the traditional,
+      ;; non-wide frame, and the RHS is the wide frame case.
+      ;; We should end up in the same state regardless of whether the
+      ;; windows were initially split or not.
+      ;; Previously, we only thought about the non-wide case.
+      ;; We could just set split-height-threshold to 1000, relying on
+      ;; the fact that the window splitting treated a single window as
+      ;; a special case and would always split it (vertically).  The
+      ;; same thing does not work in the wide-frame case, so now we do
+      ;; the splitting by hand.
+      ;; See discussion in bug#1806.
+      ;; Actually, this still does not do quite the right thing in the
+      ;; wide frame case if started from a configuration like the LHS.
+      ;; Eg if you start with a non-wide frame, call calendar, then
+      ;; make the frame wider.  This one is problematic because you
+      ;; might need to split a totally unrelated window.  Oh well, it
+      ;; seems unlikely, and perhaps respecting the original layout is
+      ;; the right thing in that case.
+      ;;
+      ;; Is this a wide frame?  If so, split it horizontally.
+      (if (window-splittable-p t) (split-window-horizontally))
+      (pop-to-buffer calendar-buffer)
+      ;; Has the window already been split vertically?  (See bug#4543)
+      (when (= (window-height) (window-height (frame-root-window)))
+        (let ((win (split-window-vertically)))
+          ;; Show something else in the upper window.
+          (switch-to-buffer (other-buffer))
+          ;; Switch to the lower window with the calendar buffer.
+          (select-window win))))
     (calendar-generate-window month year)
     (if (and calendar-view-diary-initially-flag
              (calendar-date-is-visible-p date))
@@ -1325,7 +1360,12 @@
     ;; Don't do any window-related stuff if we weren't called from a
     ;; window displaying the calendar.
     (when in-calendar-window
-      (if (or (one-window-p t) (not (window-full-width-p)))
+      ;; The second test used to be window-full-width-p.
+      ;; Not sure what it was/is for, except perhaps some way of saying
+      ;; "try not to mess with existing configurations".
+      ;; If did the wrong thing on wide frames, where we have done a
+      ;; horizontal split in calendar-basic-setup.
+      (if (or (one-window-p t) (not (window-safely-shrinkable-p)))
           ;; Don't mess with the window size, but ensure that the first
           ;; line is fully visible.
           (set-window-vscroll nil 0)