Commit | Line | Data |
---|---|---|
551c8f1a | 1 | ;;; cal-x.el --- calendar windows in dedicated frames |
38e3261c | 2 | |
acaf905b | 3 | ;; Copyright (C) 1994-1995, 2001-2012 Free Software Foundation, Inc. |
38e3261c ER |
4 | |
5 | ;; Author: Michael Kifer <kifer@cs.sunysb.edu> | |
71ea27ee | 6 | ;; Edward M. Reingold <reingold@cs.uiuc.edu> |
aff88519 | 7 | ;; Maintainer: Glenn Morris <rgm@gnu.org> |
38e3261c | 8 | ;; Keywords: calendar |
551c8f1a | 9 | ;; Human-Keywords: calendar, dedicated frames |
bd78fa1d | 10 | ;; Package: calendar |
38e3261c ER |
11 | |
12 | ;; This file is part of GNU Emacs. | |
13 | ||
2ed66575 | 14 | ;; GNU Emacs is free software: you can redistribute it and/or modify |
38e3261c | 15 | ;; it under the terms of the GNU General Public License as published by |
2ed66575 GM |
16 | ;; the Free Software Foundation, either version 3 of the License, or |
17 | ;; (at your option) any later version. | |
38e3261c ER |
18 | |
19 | ;; GNU Emacs is distributed in the hope that it will be useful, | |
20 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
21 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
22 | ;; GNU General Public License for more details. | |
23 | ||
24 | ;; You should have received a copy of the GNU General Public License | |
2ed66575 | 25 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
38e3261c ER |
26 | |
27 | ;;; Commentary: | |
28 | ||
551c8f1a | 29 | ;; See calendar.el. |
38e3261c | 30 | |
38e3261c ER |
31 | ;;; Code: |
32 | ||
10dbf039 RS |
33 | (require 'calendar) |
34 | ||
5fc5b6e1 | 35 | (defcustom diary-frame-parameters |
4a7cd65c ER |
36 | '((name . "Diary") (title . "Diary") (height . 10) (width . 80) |
37 | (unsplittable . t) (minibuffer . nil)) | |
38e3261c | 38 | "Parameters of the diary frame, if the diary is in its own frame. |
4ec69ba5 | 39 | Relevant if `calendar-setup' has the value `two-frames'." |
2c080040 GM |
40 | :type 'alist |
41 | :options '((name string) (title string) (height integer) (width integer) | |
42 | (unsplittable boolean) (minibuffer boolean) | |
43 | (vertical-scroll-bars boolean)) | |
5fc5b6e1 | 44 | :group 'calendar) |
a1506d29 | 45 | |
734254f9 | 46 | (defcustom calendar-frame-parameters |
2c080040 GM |
47 | '((name . "Calendar") (title . "Calendar") (height . 10) (width . 80) |
48 | (unsplittable . t) (minibuffer . nil) (vertical-scroll-bars . nil)) | |
38e3261c | 49 | "Parameters of the calendar frame, if the calendar is in a separate frame. |
4ec69ba5 | 50 | Relevant if `calendar-setup' has the value `calendar-only' or `two-frames'." |
2c080040 GM |
51 | :type 'alist |
52 | :options '((name string) (title string) (height integer) (width integer) | |
53 | (unsplittable boolean) (minibuffer boolean) | |
54 | (vertical-scroll-bars boolean)) | |
5fc5b6e1 | 55 | :group 'calendar) |
38e3261c | 56 | |
734254f9 | 57 | (defcustom calendar-and-diary-frame-parameters |
4a7cd65c ER |
58 | '((name . "Calendar") (title . "Calendar") (height . 28) (width . 80) |
59 | (minibuffer . nil)) | |
38e3261c | 60 | "Parameters of the frame that displays both the calendar and the diary. |
4ec69ba5 | 61 | Relevant if `calendar-setup' has the value `one-frame'." |
2c080040 GM |
62 | :type 'alist |
63 | :options '((name string) (title string) (height integer) (width integer) | |
64 | (unsplittable boolean) (minibuffer boolean) | |
65 | (vertical-scroll-bars boolean)) | |
5fc5b6e1 | 66 | :group 'calendar) |
a1506d29 | 67 | |
1a9f2b77 GM |
68 | (define-obsolete-variable-alias 'calendar-after-frame-setup-hooks |
69 | 'calendar-after-frame-setup-hook "23.1") | |
70 | ||
d2e00929 GM |
71 | (defcustom calendar-after-frame-setup-hook nil |
72 | "List of functions to be run after creating a calendar and/or diary frame." | |
5fc5b6e1 GM |
73 | :type 'hook |
74 | :group 'calendar-hooks) | |
75 | ||
76 | ;;; End of user options. | |
77 | ||
78 | (defvar calendar-frame nil | |
2c080040 | 79 | "Frame in which the calendar was last displayed.") |
5fc5b6e1 GM |
80 | |
81 | (defvar diary-frame nil | |
2c080040 GM |
82 | "Frame in which the diary was last displayed.") |
83 | ||
84 | (defun calendar-frame-1 (frame) | |
d2e00929 GM |
85 | "Subroutine used by `calendar-frame-setup'. |
86 | Runs `calendar-after-frame-setup-hook', selects frame, iconifies if needed." | |
87 | (run-hooks 'calendar-after-frame-setup-hook) | |
2c080040 GM |
88 | (select-frame frame) |
89 | (if (eq 'icon (cdr (assoc 'visibility (frame-parameters frame)))) | |
90 | (iconify-or-deiconify-frame))) | |
a1506d29 | 91 | |
724a25b2 | 92 | ;; c-d-d is only called after (diary) has been run. |
f082900a | 93 | (defvar diary-display-function) |
724a25b2 | 94 | |
2c080040 | 95 | (defun calendar-dedicate-diary () |
4ec69ba5 | 96 | "Display and dedicate the window associated with the diary buffer." |
2c080040 GM |
97 | (set-window-dedicated-p |
98 | (display-buffer | |
f082900a GM |
99 | (if (if (listp diary-display-function) |
100 | (or (memq 'diary-fancy-display diary-display-function) | |
101 | (memq 'fancy-diary-display diary-display-function)) | |
102 | (memq diary-display-function '(diary-fancy-display | |
103 | fancy-diary-display))) | |
104 | (progn | |
105 | ;; If there are no diary entries, there won't be a fancy-diary | |
106 | ;; to dedicate, so make a basic one. | |
107 | (or (get-buffer diary-fancy-buffer) | |
108 | (calendar-in-read-only-buffer diary-fancy-buffer | |
109 | (calendar-set-mode-line "Diary Entries"))) | |
110 | diary-fancy-buffer) | |
111 | (get-file-buffer diary-file))) | |
2c080040 GM |
112 | t)) |
113 | ||
93695e74 | 114 | ;;;###cal-autoload |
4ec69ba5 GM |
115 | (defun calendar-frame-setup (config &optional prompt) |
116 | "Display the calendar, and optionally the diary, in a separate frame. | |
117 | CONFIG should be one of: | |
118 | `calendar-only' - just the calendar, no diary | |
119 | `one-frame' - calendar and diary in a single frame | |
120 | `two-frames' - calendar and diary each in a separate frame | |
121 | ||
122 | If CONFIG has any other value, or if the display is not capable of | |
123 | multiple frames, then `calendar-basic-setup' is called. | |
124 | ||
125 | If PROMPT is non-nil, prompt for the month and year to use." | |
126 | (if (not (and (display-multi-frame-p) | |
127 | (memq config '(calendar-only one-frame two-frames)))) | |
128 | (calendar-basic-setup prompt) | |
38e3261c | 129 | (if (frame-live-p calendar-frame) (delete-frame calendar-frame)) |
4ec69ba5 | 130 | (unless (eq config 'calendar-only) |
2c080040 | 131 | (if (frame-live-p diary-frame) (delete-frame diary-frame))) |
e803eab7 | 132 | (let ((calendar-view-diary-initially-flag (eq config 'one-frame)) |
97bef88e | 133 | ;; For calendar-dedicate-diary in two-frames case. |
4ec69ba5 | 134 | (pop-up-windows nil)) |
38e3261c | 135 | (save-window-excursion |
4ec69ba5 GM |
136 | ;; Do diary first so that calendar is always left current. |
137 | (when (eq config 'two-frames) | |
2c080040 | 138 | (calendar-frame-1 |
4ec69ba5 GM |
139 | (setq diary-frame (make-frame diary-frame-parameters))) |
140 | (diary) | |
141 | (calendar-dedicate-diary)) | |
142 | (calendar-frame-1 | |
143 | (setq calendar-frame | |
144 | (make-frame (if (eq config 'one-frame) | |
145 | calendar-and-diary-frame-parameters | |
146 | calendar-frame-parameters)))) | |
147 | (calendar-basic-setup prompt (not (eq config 'one-frame))) | |
148 | (set-window-buffer (selected-window) calendar-buffer) | |
149 | (set-window-dedicated-p (selected-window) t) | |
150 | (if (eq config 'one-frame) | |
151 | (calendar-dedicate-diary)))))) | |
152 | ||
77a7efce | 153 | |
93695e74 | 154 | ;;;###cal-autoload |
4ec69ba5 GM |
155 | (defun calendar-one-frame-setup (&optional prompt) |
156 | "Display calendar and diary in a single dedicated frame. | |
157 | See `calendar-frame-setup' for more information." | |
158 | (calendar-frame-setup 'one-frame prompt)) | |
159 | ||
160 | (make-obsolete 'calendar-one-frame-setup 'calendar-frame-setup "23.1") | |
161 | ||
0f12fdab | 162 | |
93695e74 | 163 | ;;;###cal-autoload |
4ec69ba5 GM |
164 | (defun calendar-only-one-frame-setup (&optional prompt) |
165 | "Display calendar in a dedicated frame. | |
166 | See `calendar-frame-setup' for more information." | |
167 | (calendar-frame-setup 'calendar-only prompt)) | |
168 | ||
4ec69ba5 GM |
169 | (make-obsolete 'calendar-only-one-frame-setup 'calendar-frame-setup "23.1") |
170 | ||
97bef88e | 171 | |
4ec69ba5 GM |
172 | ;;;###cal-autoload |
173 | (defun calendar-two-frame-setup (&optional prompt) | |
174 | "Display calendar and diary in separate, dedicated frames. | |
175 | See `calendar-frame-setup' for more information." | |
176 | (calendar-frame-setup 'two-frames prompt)) | |
177 | ||
178 | (make-obsolete 'calendar-two-frame-setup 'calendar-frame-setup "23.1") | |
179 | ||
180 | ||
181 | ;; Undocumented and probably useless. | |
182 | (defvar cal-x-load-hook nil | |
183 | "Hook run on loading of the `cal-x' package.") | |
184 | (make-obsolete-variable 'cal-x-load-hook "it will be removed in future." "23.1") | |
38e3261c ER |
185 | |
186 | (run-hooks 'cal-x-load-hook) | |
187 | ||
4ec69ba5 | 188 | |
38e3261c ER |
189 | (provide 'cal-x) |
190 | ||
191 | ;;; cal-x.el ends here |