aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKaroly Lorentey2005-12-30 05:28:31 +0000
committerKaroly Lorentey2005-12-30 05:28:31 +0000
commitea161626590293c1128cb327f1111a3c1500fe65 (patch)
treef310e6bea1c22e517c2eb0ba88c9e48d8b0683e0 /src
parent27d8b4bf36cd29b138d2263594e4cd2311104b12 (diff)
downloademacs-ea161626590293c1128cb327f1111a3c1500fe65.tar.gz
emacs-ea161626590293c1128cb327f1111a3c1500fe65.zip
Make sure `delete-frame-functions' can not prevent the frame from being deleted.
* frame.c (delete_frame_handler): New function. (Fdelete_frame): Use it to invoke `delete-frame-functions' safely. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-475
Diffstat (limited to 'src')
-rw-r--r--src/frame.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/frame.c b/src/frame.c
index bc358c702b3..f573ef02b57 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -1324,6 +1324,14 @@ other_visible_frames (f)
1324 return 1; 1324 return 1;
1325} 1325}
1326 1326
1327/* Error handler for `delete-frame-functions'. */
1328static Lisp_Object
1329delete_frame_handler (Lisp_Object arg)
1330{
1331 add_to_log ("Error during `delete-frame': %s", arg, Qnil);
1332 return Qnil;
1333}
1334
1327DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "", 1335DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "",
1328 doc: /* Delete FRAME, permanently eliminating it from use. 1336 doc: /* Delete FRAME, permanently eliminating it from use.
1329If omitted, FRAME defaults to the selected frame. 1337If omitted, FRAME defaults to the selected frame.
@@ -1398,10 +1406,18 @@ The functions are run with one arg, the frame to be deleted. */)
1398 if (!NILP (Vrun_hooks) 1406 if (!NILP (Vrun_hooks)
1399 && NILP (Fframe_parameter (frame, intern ("tooltip")))) 1407 && NILP (Fframe_parameter (frame, intern ("tooltip"))))
1400 { 1408 {
1409 int count = SPECPDL_INDEX ();
1401 Lisp_Object args[2]; 1410 Lisp_Object args[2];
1411 struct gcpro gcpro1, gcpro2;
1412
1413 /* Don't let a rogue function in `delete-frame-functions'
1414 prevent the frame deletion. */
1415 GCPRO2 (args[0], args[1]);
1402 args[0] = intern ("delete-frame-functions"); 1416 args[0] = intern ("delete-frame-functions");
1403 args[1] = frame; 1417 args[1] = frame;
1404 Frun_hook_with_args (2, args); 1418 internal_condition_case_2 (Frun_hook_with_args, 2, args,
1419 Qt, delete_frame_handler);
1420 UNGCPRO;
1405 } 1421 }
1406 1422
1407 /* The hook may sometimes (indirectly) cause the frame to be deleted. */ 1423 /* The hook may sometimes (indirectly) cause the frame to be deleted. */