diff options
| author | Karoly Lorentey | 2005-07-06 01:41:56 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2005-07-06 01:41:56 +0000 |
| commit | e519a50bf7b0d7074f07ce492abb3cd544f79f59 (patch) | |
| tree | 7efd8903ced9bdd6829caf0c3ef45d0ce46d5af5 | |
| parent | 626ea340bcdbe7ea4ea17b67ead430f2037ac69c (diff) | |
| download | emacs-e519a50bf7b0d7074f07ce492abb3cd544f79f59.tar.gz emacs-e519a50bf7b0d7074f07ce492abb3cd544f79f59.zip | |
Handle and document that `delete-frame' may call functions in `delete-frame-functions' twice.
* src/frame.c (syms_of_frame): Add warning to `delete-frame-functions' description.
* lisp/frame.el (terminal-handle-delete-frame): Check that the frame is alive.
* lisp/server.el (server-handle-delete-frame): Ditto. Remove bogus comment.
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-375
| -rw-r--r-- | lisp/frame.el | 3 | ||||
| -rw-r--r-- | lisp/server.el | 7 | ||||
| -rw-r--r-- | src/frame.c | 9 |
3 files changed, 12 insertions, 7 deletions
diff --git a/lisp/frame.el b/lisp/frame.el index 5bb58c5344b..b034f9a9162 100644 --- a/lisp/frame.el +++ b/lisp/frame.el | |||
| @@ -1484,7 +1484,8 @@ selected frame's terminal)." | |||
| 1484 | ;; XXX We assume that the display is closed immediately after the | 1484 | ;; XXX We assume that the display is closed immediately after the |
| 1485 | ;; last frame is deleted on it. It would be better to create a hook | 1485 | ;; last frame is deleted on it. It would be better to create a hook |
| 1486 | ;; called `delete-display-functions', and use it instead. | 1486 | ;; called `delete-display-functions', and use it instead. |
| 1487 | (when (= 1 (length (frames-on-display-list (frame-display frame)))) | 1487 | (when (and (frame-live-p frame) |
| 1488 | (= 1 (length (frames-on-display-list (frame-display frame))))) | ||
| 1488 | (setq terminal-parameter-alist | 1489 | (setq terminal-parameter-alist |
| 1489 | (assq-delete-all (frame-display frame) terminal-parameter-alist)))) | 1490 | (assq-delete-all (frame-display frame) terminal-parameter-alist)))) |
| 1490 | 1491 | ||
diff --git a/lisp/server.el b/lisp/server.el index 91a74d6408d..dab3cde8268 100644 --- a/lisp/server.el +++ b/lisp/server.el | |||
| @@ -314,7 +314,8 @@ message." | |||
| 314 | (defun server-handle-delete-frame (frame) | 314 | (defun server-handle-delete-frame (frame) |
| 315 | "Delete the client connection when the emacsclient frame is deleted." | 315 | "Delete the client connection when the emacsclient frame is deleted." |
| 316 | (let ((proc (frame-parameter frame 'client))) | 316 | (let ((proc (frame-parameter frame 'client))) |
| 317 | (when (and proc | 317 | (when (and (frame-live-p frame) |
| 318 | proc | ||
| 318 | (or (window-system frame) | 319 | (or (window-system frame) |
| 319 | ;; A terminal display must not yet be deleted if | 320 | ;; A terminal display must not yet be deleted if |
| 320 | ;; there are other frames on it. | 321 | ;; there are other frames on it. |
| @@ -326,10 +327,6 @@ message." | |||
| 326 | (frame-list)) | 327 | (frame-list)) |
| 327 | frame-num)))) | 328 | frame-num)))) |
| 328 | (server-log (format "server-handle-delete-frame, frame %s" frame) proc) | 329 | (server-log (format "server-handle-delete-frame, frame %s" frame) proc) |
| 329 | ;; XXX Deleting the process causes emacsclient to exit | ||
| 330 | ;; immediately, which might happen before Emacs closes the | ||
| 331 | ;; display. I think we need a `delete-frame-after-functions' | ||
| 332 | ;; hook here. | ||
| 333 | (server-delete-client proc 'noframe)))) ; Let delete-frame delete the frame later. | 330 | (server-delete-client proc 'noframe)))) ; Let delete-frame delete the frame later. |
| 334 | 331 | ||
| 335 | (defun server-handle-suspend-tty (display) | 332 | (defun server-handle-suspend-tty (display) |
diff --git a/src/frame.c b/src/frame.c index f32ad7a9363..8ebcbc90b15 100644 --- a/src/frame.c +++ b/src/frame.c | |||
| @@ -4326,7 +4326,14 @@ when the mouse is over clickable text. */); | |||
| 4326 | DEFVAR_LISP ("delete-frame-functions", &Vdelete_frame_functions, | 4326 | DEFVAR_LISP ("delete-frame-functions", &Vdelete_frame_functions, |
| 4327 | doc: /* Functions to be run before deleting a frame. | 4327 | doc: /* Functions to be run before deleting a frame. |
| 4328 | The functions are run with one arg, the frame to be deleted. | 4328 | The functions are run with one arg, the frame to be deleted. |
| 4329 | See `delete-frame'. */); | 4329 | See `delete-frame'. |
| 4330 | |||
| 4331 | Note that functions in this list may be called twice on the same | ||
| 4332 | frame. In the second invocation, the frame is already deleted, and | ||
| 4333 | the function should do nothing. (You can use `frame-live-p' to check | ||
| 4334 | for this.) This wrinkle happens when an earlier function in | ||
| 4335 | `delete-frame-functions' (indirectly) calls delete-frame | ||
| 4336 | recursively. */); | ||
| 4330 | Vdelete_frame_functions = Qnil; | 4337 | Vdelete_frame_functions = Qnil; |
| 4331 | 4338 | ||
| 4332 | DEFVAR_KBOARD ("default-minibuffer-frame", Vdefault_minibuffer_frame, | 4339 | DEFVAR_KBOARD ("default-minibuffer-frame", Vdefault_minibuffer_frame, |