aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaroly Lorentey2005-07-06 01:41:56 +0000
committerKaroly Lorentey2005-07-06 01:41:56 +0000
commite519a50bf7b0d7074f07ce492abb3cd544f79f59 (patch)
tree7efd8903ced9bdd6829caf0c3ef45d0ce46d5af5
parent626ea340bcdbe7ea4ea17b67ead430f2037ac69c (diff)
downloademacs-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.el3
-rw-r--r--lisp/server.el7
-rw-r--r--src/frame.c9
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.
4328The functions are run with one arg, the frame to be deleted. 4328The functions are run with one arg, the frame to be deleted.
4329See `delete-frame'. */); 4329See `delete-frame'.
4330
4331Note that functions in this list may be called twice on the same
4332frame. In the second invocation, the frame is already deleted, and
4333the function should do nothing. (You can use `frame-live-p' to check
4334for this.) This wrinkle happens when an earlier function in
4335`delete-frame-functions' (indirectly) calls delete-frame
4336recursively. */);
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,