X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/559836fbccf9c79c621da96fe8ca0080b980b14c..74fde0f44f68a14d920db4d24626984e2964368d:/src/keyboard.c diff --git a/src/keyboard.c b/src/keyboard.c index 87a2f91a17..26afc02ec2 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -20,6 +20,7 @@ along with GNU Emacs. If not, see . */ #include #include "sysstdio.h" +#include #include "lisp.h" #include "termchar.h" @@ -227,7 +228,7 @@ static Lisp_Object Qbackward_char; Lisp_Object Qundefined; static Lisp_Object Qtimer_event_handler; -/* read_key_sequence stores here the command definition of the +/* `read_key_sequence' stores here the command definition of the key sequence that it reads. */ static Lisp_Object read_key_sequence_cmd; static Lisp_Object read_key_sequence_remapped; @@ -824,22 +825,25 @@ This function is called by the editor initialization to begin editing. */) if (input_blocked_p ()) return Qnil; - command_loop_level++; - update_mode_lines = 17; - - if (command_loop_level + if (command_loop_level >= 0 && current_buffer != XBUFFER (XWINDOW (selected_window)->contents)) buffer = Fcurrent_buffer (); else buffer = Qnil; + /* Don't do anything interesting between the increment and the + record_unwind_protect! Otherwise, we could get distracted and + never decrement the counter again. */ + command_loop_level++; + update_mode_lines = 17; + record_unwind_protect (recursive_edit_unwind, buffer); + /* If we leave recursive_edit_1 below with a `throw' for instance, like it is done in the splash screen display, we have to make sure that we restore single_kboard as command_loop_1 would have done if it were left normally. */ if (command_loop_level > 0) temporarily_switch_to_single_kboard (SELECTED_FRAME ()); - record_unwind_protect (recursive_edit_unwind, buffer); recursive_edit_1 (); return unbind_to (count, Qnil); @@ -7116,7 +7120,12 @@ unblock_input_to (int level) /* End critical section. If doing signal-driven input, and a signal came in when input was - blocked, reinvoke the signal handler now to deal with it. */ + blocked, reinvoke the signal handler now to deal with it. + + It will also process queued input, if it was not read before. + When a longer code sequence does not use block/unblock input + at all, the whole input gathered up to the next call to + unblock_input will be processed inside that call. */ void unblock_input (void) @@ -10082,8 +10091,15 @@ This may include sensitive information such as passwords. */) } if (!NILP (file)) { + int fd; + Lisp_Object encfile; + file = Fexpand_file_name (file, Qnil); - dribble = emacs_fopen (SSDATA (file), "w"); + encfile = ENCODE_FILE (file); + fd = emacs_open (SSDATA (encfile), O_WRONLY | O_CREAT | O_EXCL, 0600); + if (fd < 0 && errno == EEXIST && unlink (SSDATA (encfile)) == 0) + fd = emacs_open (SSDATA (encfile), O_WRONLY | O_CREAT | O_EXCL, 0600); + dribble = fd < 0 ? 0 : fdopen (fd, "w"); if (dribble == 0) report_file_error ("Opening dribble", file); } @@ -11381,6 +11397,7 @@ and tests the value when the command returns. Buffer modification stores t in this variable. */); Vdeactivate_mark = Qnil; DEFSYM (Qdeactivate_mark, "deactivate-mark"); + Fmake_variable_buffer_local (Qdeactivate_mark); DEFVAR_LISP ("pre-command-hook", Vpre_command_hook, doc: /* Normal hook run before each command is executed.