diff options
Diffstat (limited to 'src/keyboard.c')
| -rw-r--r-- | src/keyboard.c | 109 |
1 files changed, 30 insertions, 79 deletions
diff --git a/src/keyboard.c b/src/keyboard.c index 6aad0acc656..a86e7c5f8e4 100644 --- a/src/keyboard.c +++ b/src/keyboard.c | |||
| @@ -87,7 +87,7 @@ char const DEV_TTY[] = "/dev/tty"; | |||
| 87 | volatile int interrupt_input_blocked; | 87 | volatile int interrupt_input_blocked; |
| 88 | 88 | ||
| 89 | /* True means an input interrupt or alarm signal has arrived. | 89 | /* True means an input interrupt or alarm signal has arrived. |
| 90 | The QUIT macro checks this. */ | 90 | The maybe_quit function checks this. */ |
| 91 | volatile bool pending_signals; | 91 | volatile bool pending_signals; |
| 92 | 92 | ||
| 93 | #define KBD_BUFFER_SIZE 4096 | 93 | #define KBD_BUFFER_SIZE 4096 |
| @@ -169,9 +169,6 @@ struct kboard *echo_kboard; | |||
| 169 | 169 | ||
| 170 | Lisp_Object echo_message_buffer; | 170 | Lisp_Object echo_message_buffer; |
| 171 | 171 | ||
| 172 | /* True means C-g should cause immediate error-signal. */ | ||
| 173 | bool immediate_quit; | ||
| 174 | |||
| 175 | /* Character that causes a quit. Normally C-g. | 172 | /* Character that causes a quit. Normally C-g. |
| 176 | 173 | ||
| 177 | If we are running on an ordinary terminal, this must be an ordinary | 174 | If we are running on an ordinary terminal, this must be an ordinary |
| @@ -1416,7 +1413,7 @@ command_loop_1 (void) | |||
| 1416 | if (!NILP (Vquit_flag)) | 1413 | if (!NILP (Vquit_flag)) |
| 1417 | { | 1414 | { |
| 1418 | Vexecuting_kbd_macro = Qt; | 1415 | Vexecuting_kbd_macro = Qt; |
| 1419 | QUIT; /* Make some noise. */ | 1416 | maybe_quit (); /* Make some noise. */ |
| 1420 | /* Will return since macro now empty. */ | 1417 | /* Will return since macro now empty. */ |
| 1421 | } | 1418 | } |
| 1422 | } | 1419 | } |
| @@ -3584,16 +3581,7 @@ kbd_buffer_store_buffered_event (union buffered_input_event *event, | |||
| 3584 | as input, set quit-flag to cause an interrupt. */ | 3581 | as input, set quit-flag to cause an interrupt. */ |
| 3585 | if (!NILP (Vthrow_on_input) | 3582 | if (!NILP (Vthrow_on_input) |
| 3586 | && NILP (Fmemq (ignore_event, Vwhile_no_input_ignore_events))) | 3583 | && NILP (Fmemq (ignore_event, Vwhile_no_input_ignore_events))) |
| 3587 | { | 3584 | Vquit_flag = Vthrow_on_input; |
| 3588 | Vquit_flag = Vthrow_on_input; | ||
| 3589 | /* If we're inside a function that wants immediate quits, | ||
| 3590 | do it now. */ | ||
| 3591 | if (immediate_quit && NILP (Vinhibit_quit)) | ||
| 3592 | { | ||
| 3593 | immediate_quit = false; | ||
| 3594 | QUIT; | ||
| 3595 | } | ||
| 3596 | } | ||
| 3597 | } | 3585 | } |
| 3598 | 3586 | ||
| 3599 | 3587 | ||
| @@ -7053,40 +7041,22 @@ tty_read_avail_input (struct terminal *terminal, | |||
| 7053 | 7041 | ||
| 7054 | /* Now read; for one reason or another, this will not block. | 7042 | /* Now read; for one reason or another, this will not block. |
| 7055 | NREAD is set to the number of chars read. */ | 7043 | NREAD is set to the number of chars read. */ |
| 7056 | do | 7044 | nread = emacs_read (fileno (tty->input), (char *) cbuf, n_to_read); |
| 7057 | { | 7045 | /* POSIX infers that processes which are not in the session leader's |
| 7058 | nread = emacs_read (fileno (tty->input), (char *) cbuf, n_to_read); | 7046 | process group won't get SIGHUPs at logout time. BSDI adheres to |
| 7059 | /* POSIX infers that processes which are not in the session leader's | 7047 | this part standard and returns -1 from read (0) with errno==EIO |
| 7060 | process group won't get SIGHUPs at logout time. BSDI adheres to | 7048 | when the control tty is taken away. |
| 7061 | this part standard and returns -1 from read (0) with errno==EIO | 7049 | Jeffrey Honig <jch@bsdi.com> says this is generally safe. */ |
| 7062 | when the control tty is taken away. | 7050 | if (nread == -1 && errno == EIO) |
| 7063 | Jeffrey Honig <jch@bsdi.com> says this is generally safe. */ | 7051 | return -2; /* Close this terminal. */ |
| 7064 | if (nread == -1 && errno == EIO) | 7052 | #if defined AIX && defined _BSD |
| 7065 | return -2; /* Close this terminal. */ | 7053 | /* The kernel sometimes fails to deliver SIGHUP for ptys. |
| 7066 | #if defined (AIX) && defined (_BSD) | 7054 | This looks incorrect, but it isn't, because _BSD causes |
| 7067 | /* The kernel sometimes fails to deliver SIGHUP for ptys. | 7055 | O_NDELAY to be defined in fcntl.h as O_NONBLOCK, |
| 7068 | This looks incorrect, but it isn't, because _BSD causes | 7056 | and that causes a value other than 0 when there is no input. */ |
| 7069 | O_NDELAY to be defined in fcntl.h as O_NONBLOCK, | 7057 | if (nread == 0) |
| 7070 | and that causes a value other than 0 when there is no input. */ | 7058 | return -2; /* Close this terminal. */ |
| 7071 | if (nread == 0) | ||
| 7072 | return -2; /* Close this terminal. */ | ||
| 7073 | #endif | ||
| 7074 | } | ||
| 7075 | while ( | ||
| 7076 | /* We used to retry the read if it was interrupted. | ||
| 7077 | But this does the wrong thing when O_NONBLOCK causes | ||
| 7078 | an EAGAIN error. Does anybody know of a situation | ||
| 7079 | where a retry is actually needed? */ | ||
| 7080 | #if 0 | ||
| 7081 | nread < 0 && (errno == EAGAIN || errno == EFAULT | ||
| 7082 | #ifdef EBADSLT | ||
| 7083 | || errno == EBADSLT | ||
| 7084 | #endif | ||
| 7085 | ) | ||
| 7086 | #else | ||
| 7087 | 0 | ||
| 7088 | #endif | 7059 | #endif |
| 7089 | ); | ||
| 7090 | 7060 | ||
| 7091 | #ifndef USABLE_FIONREAD | 7061 | #ifndef USABLE_FIONREAD |
| 7092 | #if defined (USG) || defined (CYGWIN) | 7062 | #if defined (USG) || defined (CYGWIN) |
| @@ -7426,7 +7396,7 @@ menu_bar_items (Lisp_Object old) | |||
| 7426 | USE_SAFE_ALLOCA; | 7396 | USE_SAFE_ALLOCA; |
| 7427 | 7397 | ||
| 7428 | /* In order to build the menus, we need to call the keymap | 7398 | /* In order to build the menus, we need to call the keymap |
| 7429 | accessors. They all call QUIT. But this function is called | 7399 | accessors. They all call maybe_quit. But this function is called |
| 7430 | during redisplay, during which a quit is fatal. So inhibit | 7400 | during redisplay, during which a quit is fatal. So inhibit |
| 7431 | quitting while building the menus. | 7401 | quitting while building the menus. |
| 7432 | We do this instead of specbind because (1) errors will clear it anyway | 7402 | We do this instead of specbind because (1) errors will clear it anyway |
| @@ -7987,7 +7957,7 @@ tool_bar_items (Lisp_Object reuse, int *nitems) | |||
| 7987 | *nitems = 0; | 7957 | *nitems = 0; |
| 7988 | 7958 | ||
| 7989 | /* In order to build the menus, we need to call the keymap | 7959 | /* In order to build the menus, we need to call the keymap |
| 7990 | accessors. They all call QUIT. But this function is called | 7960 | accessors. They all call maybe_quit. But this function is called |
| 7991 | during redisplay, during which a quit is fatal. So inhibit | 7961 | during redisplay, during which a quit is fatal. So inhibit |
| 7992 | quitting while building the menus. We do this instead of | 7962 | quitting while building the menus. We do this instead of |
| 7993 | specbind because (1) errors will clear it anyway and (2) this | 7963 | specbind because (1) errors will clear it anyway and (2) this |
| @@ -9806,7 +9776,7 @@ read_key_sequence_vs (Lisp_Object prompt, Lisp_Object continue_echo, | |||
| 9806 | 9776 | ||
| 9807 | if (!NILP (prompt)) | 9777 | if (!NILP (prompt)) |
| 9808 | CHECK_STRING (prompt); | 9778 | CHECK_STRING (prompt); |
| 9809 | QUIT; | 9779 | maybe_quit (); |
| 9810 | 9780 | ||
| 9811 | specbind (Qinput_method_exit_on_first_char, | 9781 | specbind (Qinput_method_exit_on_first_char, |
| 9812 | (NILP (cmd_loop) ? Qt : Qnil)); | 9782 | (NILP (cmd_loop) ? Qt : Qnil)); |
| @@ -9840,7 +9810,7 @@ read_key_sequence_vs (Lisp_Object prompt, Lisp_Object continue_echo, | |||
| 9840 | if (i == -1) | 9810 | if (i == -1) |
| 9841 | { | 9811 | { |
| 9842 | Vquit_flag = Qt; | 9812 | Vquit_flag = Qt; |
| 9843 | QUIT; | 9813 | maybe_quit (); |
| 9844 | } | 9814 | } |
| 9845 | 9815 | ||
| 9846 | return unbind_to (count, | 9816 | return unbind_to (count, |
| @@ -10278,7 +10248,7 @@ clear_waiting_for_input (void) | |||
| 10278 | 10248 | ||
| 10279 | If we have a frame on the controlling tty, we assume that the | 10249 | If we have a frame on the controlling tty, we assume that the |
| 10280 | SIGINT was generated by C-g, so we call handle_interrupt. | 10250 | SIGINT was generated by C-g, so we call handle_interrupt. |
| 10281 | Otherwise, tell QUIT to kill Emacs. */ | 10251 | Otherwise, tell maybe_quit to kill Emacs. */ |
| 10282 | 10252 | ||
| 10283 | static void | 10253 | static void |
| 10284 | handle_interrupt_signal (int sig) | 10254 | handle_interrupt_signal (int sig) |
| @@ -10289,7 +10259,7 @@ handle_interrupt_signal (int sig) | |||
| 10289 | { | 10259 | { |
| 10290 | /* If there are no frames there, let's pretend that we are a | 10260 | /* If there are no frames there, let's pretend that we are a |
| 10291 | well-behaving UN*X program and quit. We must not call Lisp | 10261 | well-behaving UN*X program and quit. We must not call Lisp |
| 10292 | in a signal handler, so tell QUIT to exit when it is | 10262 | in a signal handler, so tell maybe_quit to exit when it is |
| 10293 | safe. */ | 10263 | safe. */ |
| 10294 | Vquit_flag = Qkill_emacs; | 10264 | Vquit_flag = Qkill_emacs; |
| 10295 | } | 10265 | } |
| @@ -10445,30 +10415,12 @@ handle_interrupt (bool in_signal_handler) | |||
| 10445 | } | 10415 | } |
| 10446 | else | 10416 | else |
| 10447 | { | 10417 | { |
| 10448 | /* If executing a function that wants to be interrupted out of | 10418 | /* Request quit when it's safe. */ |
| 10449 | and the user has not deferred quitting by binding `inhibit-quit' | 10419 | int count = NILP (Vquit_flag) ? 1 : force_quit_count + 1; |
| 10450 | then quit right away. */ | 10420 | force_quit_count = count; |
| 10451 | if (immediate_quit && NILP (Vinhibit_quit)) | 10421 | if (count == 3) |
| 10452 | { | 10422 | Vinhibit_quit = Qnil; |
| 10453 | struct gl_state_s saved; | 10423 | Vquit_flag = Qt; |
| 10454 | |||
| 10455 | immediate_quit = false; | ||
| 10456 | pthread_sigmask (SIG_SETMASK, &empty_mask, 0); | ||
| 10457 | saved = gl_state; | ||
| 10458 | quit (); | ||
| 10459 | gl_state = saved; | ||
| 10460 | } | ||
| 10461 | else | ||
| 10462 | { /* Else request quit when it's safe. */ | ||
| 10463 | int count = NILP (Vquit_flag) ? 1 : force_quit_count + 1; | ||
| 10464 | force_quit_count = count; | ||
| 10465 | if (count == 3) | ||
| 10466 | { | ||
| 10467 | immediate_quit = true; | ||
| 10468 | Vinhibit_quit = Qnil; | ||
| 10469 | } | ||
| 10470 | Vquit_flag = Qt; | ||
| 10471 | } | ||
| 10472 | } | 10424 | } |
| 10473 | 10425 | ||
| 10474 | pthread_sigmask (SIG_SETMASK, &empty_mask, 0); | 10426 | pthread_sigmask (SIG_SETMASK, &empty_mask, 0); |
| @@ -10907,7 +10859,6 @@ init_keyboard (void) | |||
| 10907 | { | 10859 | { |
| 10908 | /* This is correct before outermost invocation of the editor loop. */ | 10860 | /* This is correct before outermost invocation of the editor loop. */ |
| 10909 | command_loop_level = -1; | 10861 | command_loop_level = -1; |
| 10910 | immediate_quit = false; | ||
| 10911 | quit_char = Ctl ('g'); | 10862 | quit_char = Ctl ('g'); |
| 10912 | Vunread_command_events = Qnil; | 10863 | Vunread_command_events = Qnil; |
| 10913 | timer_idleness_start_time = invalid_timespec (); | 10864 | timer_idleness_start_time = invalid_timespec (); |