X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/686ea556eb13d889d1b7ecb0aae005315ea7e128..5df4f04cd32af723742c81095b38ae83b3c2b462:/lisp/calendar/calendar.el diff --git a/lisp/calendar/calendar.el b/lisp/calendar/calendar.el index 4c033dd891..0a5373b8a5 100644 --- a/lisp/calendar/calendar.el +++ b/lisp/calendar/calendar.el @@ -1,7 +1,7 @@ ;;; calendar.el --- calendar functions ;; Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1997, -;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 ;; Free Software Foundation, Inc. ;; Author: Edward M. Reingold @@ -114,7 +114,7 @@ ;;; Code: -(require 'cal-loaddefs) +(load "cal-loaddefs" nil t) ;; Avoid recursive load of calendar when loading cal-menu. Yuck. (provide 'calendar) @@ -163,6 +163,16 @@ three options overrides the value of `calendar-view-diary-initially-flag'." :version "22.1" :group 'calendar) +;; See discussion in bug#1806. +(defcustom calendar-split-width-threshold nil + "Value to use for `split-width-threshold' when creating a calendar. +This only affects frames wider than the default value of +`split-width-threshold'." + :type '(choice (const nil) + (integer)) + :version "23.2" + :group 'calendar) + (defcustom calendar-week-start-day 0 "The day of the week on which a week in the calendar begins. 0 means Sunday (default), 1 means Monday, and so on. @@ -726,14 +736,16 @@ calendar package is already loaded). Rather, use either (defcustom diary-iso-date-forms '((month "[-/]" day "[^-/0-9]") (year "[-/]" month "[-/]" day "[^0-9]") - (monthname "-" day "[^-0-9]") - (year "-" monthname "-" day "[^0-9]") + ;; Cannot allow [-/] as separators here, since it would also match + ;; the first element (bug#7377). + (monthname " *" day "[^-0-9]") + (year " *" monthname " *" day "[^0-9]") (dayname "\\W")) "List of pseudo-patterns describing the ISO style of dates. -The defaults are: MONTH[-/]DAY; YEAR[-/]MONTH[-/]DAY; MONTHNAME-DAY; -YEAR-MONTHNAME-DAY; DAYNAME. Normally you should not customize this, +The defaults are: MONTH[-/]DAY; YEAR[-/]MONTH[-/]DAY; MONTHNAME DAY; +YEAR MONTHNAME DAY; DAYNAME. Normally you should not customize this, but `diary-date-forms' (which see)." - :version "23.1" + :version "23.3" ; bug#7377 :type '(repeat (choice (cons :tag "Backup" :value (backup . nil) (const backup) @@ -1280,57 +1292,61 @@ If optional prefix argument ARG is non-nil, prompts for the month and year, else uses the current date. If NODISPLAY is non-nil, don't display the generated calendar." (interactive "P") - (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))) - (month (calendar-extract-month date)) - (year (calendar-extract-year date))) - (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. - (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)) - (diary-view-entries))) + (let ((buff (current-buffer))) + (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) + (split-width-threshold calendar-split-width-threshold) + (date (if arg (calendar-read-date t) + (calendar-current-date))) + (month (calendar-extract-month date)) + (year (calendar-extract-year date))) + (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. + (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? + (when (and (not (window-dedicated-p)) + (window-full-height-p)) + (let ((win (split-window-vertically))) + ;; In the upper window, show whatever was visible before. + ;; This looks better than using other-buffer. + (switch-to-buffer buff) + ;; 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)) + (diary-view-entries)))) (if calendar-view-holidays-initially-flag (let* ((diary-buffer (get-file-buffer diary-file)) (diary-window (if diary-buffer (get-buffer-window diary-buffer))) @@ -2212,6 +2228,10 @@ DATE is a list of the form (month day year). A negative year is interpreted as BC; -1 being 1 BC, and so on." (mod (calendar-absolute-from-gregorian date) 7)) +(defun calendar-week-end-day () + "Return the index (0 for Sunday, etc.) of the last day of the week." + (mod (+ calendar-week-start-day 6) 7)) + (defun calendar-unmark () "Delete all diary/holiday marks/highlighting from the calendar." (interactive) @@ -2496,7 +2516,7 @@ DATE is (month day year). Calendars that do not apply are omitted." (format "Mayan date: %s" (calendar-mayan-date-string date)))))) -(declare-function x-popup-menu "xmenu.c" (position menu)) +(declare-function x-popup-menu "menu.c" (position menu)) (defun calendar-print-other-dates (&optional event) "Show dates on other calendars for date under the cursor. @@ -2552,5 +2572,4 @@ If called by a mouse-event, pops up a menu with the result." ;; byte-compile-dynamic: t ;; End: -;; arch-tag: 19c61596-c8fb-4c69-bcf1-7dd739919cd8 ;;; calendar.el ends here