]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - readline/callback.c
TUI resize unification
[thirdparty/binutils-gdb.git] / readline / callback.c
index 0fc3f90bcd5f7ca2c65bb72b32bf54e12181e3b7..a466cf9b6ef1a5712a00f8837e86c23c55165e34 100644 (file)
@@ -1,6 +1,6 @@
 /* callback.c -- functions to use readline as an X `callback' mechanism. */
 
-/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2017 Free Software Foundation, Inc.
 
    This file is part of the GNU Readline Library (Readline), a library
    for reading lines of text with interactive input and history editing.
 _rl_callback_func_t *_rl_callback_func = 0;
 _rl_callback_generic_arg *_rl_callback_data = 0;
 
+/* Applications can set this to non-zero to have readline's signal handlers
+   installed during the entire duration of reading a complete line, as in
+   readline-6.2.  This should be used with care, because it can result in
+   readline receiving signals and not handling them until it's called again
+   via rl_callback_read_char, thereby stealing them from the application.
+   By default, signal handlers are only active while readline is active. */   
+int rl_persistent_signal_handlers = 0;
+
 /* **************************************************************** */
 /*                                                                 */
-/*                     Callback Readline Functions              */
+/*                     Callback Readline Functions                 */
 /*                                                                 */
 /* **************************************************************** */
 
@@ -72,7 +80,7 @@ static int in_handler;                /* terminal_prepped and signals set? */
 
 /* Make sure the terminal is set up, initialize readline, and prompt. */
 static void
-_rl_callback_newline ()
+_rl_callback_newline (void)
 {
   rl_initialize ();
 
@@ -82,6 +90,11 @@ _rl_callback_newline ()
 
       if (rl_prep_term_function)
        (*rl_prep_term_function) (_rl_meta_flag);
+
+#if defined (HANDLE_SIGNALS)
+      if (rl_persistent_signal_handlers)
+       rl_set_signals ();
+#endif
     }
 
   readline_internal_setup ();
@@ -90,9 +103,7 @@ _rl_callback_newline ()
 
 /* Install a readline handler, set up the terminal, and issue the prompt. */
 void
-rl_callback_handler_install (prompt, linefunc)
-     const char *prompt;
-     rl_vcpfunc_t *linefunc;
+rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *linefunc)
 {
   rl_set_prompt (prompt);
   RL_SETSTATE (RL_STATE_CALLBACK);
@@ -103,7 +114,8 @@ rl_callback_handler_install (prompt, linefunc)
 #if defined (HANDLE_SIGNALS)
 #define CALLBACK_READ_RETURN() \
   do { \
-    rl_clear_signals (); \
+    if (rl_persistent_signal_handlers == 0) \
+      rl_clear_signals (); \
     return; \
   } while (0)
 #else
@@ -112,7 +124,7 @@ rl_callback_handler_install (prompt, linefunc)
 
 /* Read one character, and dispatch to the handler if it ends the line. */
 void
-rl_callback_read_char ()
+rl_callback_read_char (void)
 {
   char *line;
   int eof, jcode;
@@ -140,7 +152,8 @@ rl_callback_read_char ()
 
 #if defined (HANDLE_SIGNALS)
   /* Install signal handlers only when readline has control. */
-  rl_set_signals ();
+  if (rl_persistent_signal_handlers == 0)
+    rl_set_signals ();
 #endif
 
   do
@@ -161,6 +174,36 @@ rl_callback_read_char ()
          CALLBACK_READ_RETURN ();
        }
 #if defined (VI_MODE)
+      /* States that can occur while in state VIMOTION have to be checked
+        before RL_STATE_VIMOTION */
+      else if (RL_ISSTATE (RL_STATE_CHARSEARCH))
+       {
+         int k;
+
+         k = _rl_callback_data->i2;
+
+         eof = (*_rl_callback_func) (_rl_callback_data);
+         /* If the function `deregisters' itself, make sure the data is
+            cleaned up. */
+         if (_rl_callback_func == 0)   /* XXX - just sanity check */
+           {
+             if (_rl_callback_data)
+               {
+                 _rl_callback_data_dispose (_rl_callback_data);
+                 _rl_callback_data = 0;
+               }
+           }
+
+         /* Messy case where vi motion command can be char search */
+         if (RL_ISSTATE (RL_STATE_VIMOTION))
+           {
+             _rl_vi_domove_motion_cleanup (k, _rl_vimvcxt);
+             _rl_internal_char_cleanup ();
+             CALLBACK_READ_RETURN ();        
+           }
+
+         _rl_internal_char_cleanup ();
+       }
       else if (RL_ISSTATE (RL_STATE_VIMOTION))
        {
          eof = _rl_vi_domove_callback (_rl_vimvcxt);
@@ -254,7 +297,7 @@ rl_callback_read_char ()
 
 /* Remove the handler, and make sure the terminal is in its normal state. */
 void
-rl_callback_handler_remove ()
+rl_callback_handler_remove (void)
 {
   rl_linefunc = NULL;
   RL_UNSETSTATE (RL_STATE_CALLBACK);
@@ -271,8 +314,7 @@ rl_callback_handler_remove ()
 }
 
 _rl_callback_generic_arg *
-_rl_callback_data_alloc (count)
-     int count;
+_rl_callback_data_alloc (int count)
 {
   _rl_callback_generic_arg *arg;
 
@@ -285,15 +327,14 @@ _rl_callback_data_alloc (count)
 }
 
 void
-_rl_callback_data_dispose (arg)
-     _rl_callback_generic_arg *arg;
+_rl_callback_data_dispose (_rl_callback_generic_arg *arg)
 {
   xfree (arg);
 }
 
 /* Make sure that this agrees with cases in rl_callback_read_char */
 void
-rl_callback_sigcleanup ()
+rl_callback_sigcleanup (void)
 {
   if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
     return;
@@ -311,6 +352,8 @@ rl_callback_sigcleanup ()
     }
   else if (RL_ISSTATE (RL_STATE_MULTIKEY))
     RL_UNSETSTATE (RL_STATE_MULTIKEY);
+  if (RL_ISSTATE (RL_STATE_CHARSEARCH))
+    RL_UNSETSTATE (RL_STATE_CHARSEARCH);
 
   _rl_callback_func = 0;
 }