diff options
| -rw-r--r-- | src/minibuf.c | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/src/minibuf.c b/src/minibuf.c index bab116f4ba7..2abb46710e5 100644 --- a/src/minibuf.c +++ b/src/minibuf.c | |||
| @@ -279,7 +279,13 @@ read_minibuf (map, initial, prompt, backup_n, expflag, histvar, histpos) | |||
| 279 | Fselect_window (minibuf_window); | 279 | Fselect_window (minibuf_window); |
| 280 | XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0); | 280 | XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0); |
| 281 | 281 | ||
| 282 | Ferase_buffer (); | 282 | { |
| 283 | int count1 = specpdl_ptr - specpdl; | ||
| 284 | specbind (Qinhibit_read_only, Qt); | ||
| 285 | Ferase_buffer (); | ||
| 286 | unbind_to (count1, Qnil); | ||
| 287 | } | ||
| 288 | |||
| 283 | minibuf_level++; | 289 | minibuf_level++; |
| 284 | 290 | ||
| 285 | if (!NILP (initial)) | 291 | if (!NILP (initial)) |
| @@ -416,6 +422,7 @@ read_minibuf_unwind (data) | |||
| 416 | Lisp_Object data; | 422 | Lisp_Object data; |
| 417 | { | 423 | { |
| 418 | Lisp_Object old_deactivate_mark; | 424 | Lisp_Object old_deactivate_mark; |
| 425 | Lisp_Object window; | ||
| 419 | 426 | ||
| 420 | /* We are exiting the minibuffer one way or the other, | 427 | /* We are exiting the minibuffer one way or the other, |
| 421 | so run the hook. */ | 428 | so run the hook. */ |
| @@ -423,24 +430,16 @@ read_minibuf_unwind (data) | |||
| 423 | && !NILP (Vrun_hooks)) | 430 | && !NILP (Vrun_hooks)) |
| 424 | safe_run_hooks (Qminibuffer_exit_hook); | 431 | safe_run_hooks (Qminibuffer_exit_hook); |
| 425 | 432 | ||
| 426 | /* Erase the minibuffer we were using at this level. */ | ||
| 427 | Fset_buffer (XWINDOW (minibuf_window)->buffer); | ||
| 428 | |||
| 429 | /* Prevent error in erase-buffer. */ | ||
| 430 | current_buffer->read_only = Qnil; | ||
| 431 | |||
| 432 | old_deactivate_mark = Vdeactivate_mark; | ||
| 433 | Ferase_buffer (); | ||
| 434 | Vdeactivate_mark = old_deactivate_mark; | ||
| 435 | |||
| 436 | /* If this was a recursive minibuffer, | 433 | /* If this was a recursive minibuffer, |
| 437 | tie the minibuffer window back to the outer level minibuffer buffer */ | 434 | tie the minibuffer window back to the outer level minibuffer buffer. */ |
| 438 | minibuf_level--; | 435 | minibuf_level--; |
| 439 | /* Make sure minibuffer window is erased, not ignored */ | ||
| 440 | windows_or_buffers_changed++; | ||
| 441 | XSETFASTINT (XWINDOW (minibuf_window)->last_modified, 0); | ||
| 442 | 436 | ||
| 443 | /* Restore prompt, etc from outer minibuffer */ | 437 | window = minibuf_window; |
| 438 | /* To keep things predictable, in case it matters, let's be in the minibuffer | ||
| 439 | when we reset the relevant variables. */ | ||
| 440 | Fset_buffer (XWINDOW (window)->buffer); | ||
| 441 | |||
| 442 | /* Restore prompt, etc, from outer minibuffer level. */ | ||
| 444 | minibuf_prompt = Fcar (minibuf_save_list); | 443 | minibuf_prompt = Fcar (minibuf_save_list); |
| 445 | minibuf_save_list = Fcdr (minibuf_save_list); | 444 | minibuf_save_list = Fcdr (minibuf_save_list); |
| 446 | minibuf_prompt_width = XFASTINT (Fcar (minibuf_save_list)); | 445 | minibuf_prompt_width = XFASTINT (Fcar (minibuf_save_list)); |
| @@ -457,6 +456,21 @@ read_minibuf_unwind (data) | |||
| 457 | minibuf_save_list = Fcdr (minibuf_save_list); | 456 | minibuf_save_list = Fcdr (minibuf_save_list); |
| 458 | minibuf_window = Fcar (minibuf_save_list); | 457 | minibuf_window = Fcar (minibuf_save_list); |
| 459 | minibuf_save_list = Fcdr (minibuf_save_list); | 458 | minibuf_save_list = Fcdr (minibuf_save_list); |
| 459 | |||
| 460 | /* Erase the minibuffer we were using at this level. */ | ||
| 461 | { | ||
| 462 | int count = specpdl_ptr - specpdl; | ||
| 463 | /* Prevent error in erase-buffer. */ | ||
| 464 | specbind (Qinhibit_read_only, Qt); | ||
| 465 | old_deactivate_mark = Vdeactivate_mark; | ||
| 466 | Ferase_buffer (); | ||
| 467 | Vdeactivate_mark = old_deactivate_mark; | ||
| 468 | unbind_to (count, Qnil); | ||
| 469 | } | ||
| 470 | |||
| 471 | /* Make sure minibuffer window is erased, not ignored. */ | ||
| 472 | windows_or_buffers_changed++; | ||
| 473 | XSETFASTINT (XWINDOW (window)->last_modified, 0); | ||
| 460 | } | 474 | } |
| 461 | 475 | ||
| 462 | 476 | ||