diff options
| author | Karoly Lorentey | 2005-12-30 05:28:31 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2005-12-30 05:28:31 +0000 |
| commit | ea161626590293c1128cb327f1111a3c1500fe65 (patch) | |
| tree | f310e6bea1c22e517c2eb0ba88c9e48d8b0683e0 /src | |
| parent | 27d8b4bf36cd29b138d2263594e4cd2311104b12 (diff) | |
| download | emacs-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.c | 18 |
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'. */ | ||
| 1328 | static Lisp_Object | ||
| 1329 | delete_frame_handler (Lisp_Object arg) | ||
| 1330 | { | ||
| 1331 | add_to_log ("Error during `delete-frame': %s", arg, Qnil); | ||
| 1332 | return Qnil; | ||
| 1333 | } | ||
| 1334 | |||
| 1327 | DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "", | 1335 | DEFUN ("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. |
| 1329 | If omitted, FRAME defaults to the selected frame. | 1337 | If 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. */ |