# HG changeset patch # User Stefan Monnier # Date 1085777525 0 # Node ID 1e94f291a19c90df5cac6c083d87bfb44a574c6d # Parent 4cceb6e8bee63745adc00e9293bea04056d26b8a (run_exit_minibuf_hook): New function. (read_minibuf_unwind): Don't run exit-minibuffer-hook any more. (read_minibuf): Use separate unwind handler to run exit-minibuf-hook. diff -r 4cceb6e8bee6 -r 1e94f291a19c src/minibuf.c --- a/src/minibuf.c Fri May 28 19:59:23 2004 +0000 +++ b/src/minibuf.c Fri May 28 20:52:05 2004 +0000 @@ -1,5 +1,5 @@ /* Minibuffer input and completion. - Copyright (C) 1985,86,93,94,95,96,97,98,99,2000,01,03 + Copyright (C) 1985,86,93,94,95,96,97,98,99,2000,01,03,04 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -209,6 +209,7 @@ /* Actual minibuffer invocation. */ static Lisp_Object read_minibuf_unwind P_ ((Lisp_Object)); +static Lisp_Object run_exit_minibuf_hook P_ ((Lisp_Object)); static Lisp_Object read_minibuf P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, int, Lisp_Object, @@ -563,6 +564,12 @@ record_unwind_protect (read_minibuf_unwind, Qnil); minibuf_level++; + /* We are exiting the minibuffer one way or the other, so run the hook. + It should be run before unwinding the minibuf settings. Do it + separately from read_minibuf_unwind because we need to make sure that + read_minibuf_unwind is fully executed even if exit-minibuffer-hook + signals an error. --Stef */ + record_unwind_protect (run_exit_minibuf_hook, Qnil); /* Now that we can restore all those variables, start changing them. */ @@ -822,6 +829,17 @@ return buf; } +static Lisp_Object +run_exit_minibuf_hook (data) + Lisp_Object data; +{ + if (!NILP (Vminibuffer_exit_hook) && !EQ (Vminibuffer_exit_hook, Qunbound) + && !NILP (Vrun_hooks)) + safe_run_hooks (Qminibuffer_exit_hook); + + return Qnil; +} + /* This function is called on exiting minibuffer, whether normally or not, and it restores the current window, buffer, etc. */ @@ -832,12 +850,6 @@ Lisp_Object old_deactivate_mark; Lisp_Object window; - /* We are exiting the minibuffer one way or the other, - so run the hook. */ - if (!NILP (Vminibuffer_exit_hook) && !EQ (Vminibuffer_exit_hook, Qunbound) - && !NILP (Vrun_hooks)) - safe_run_hooks (Qminibuffer_exit_hook); - /* If this was a recursive minibuffer, tie the minibuffer window back to the outer level minibuffer buffer. */ minibuf_level--;