X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FReadline.cc;h=dc8bd6ae529c5a95419feac85957f9b0e27f601b;hb=1863c038d0400159ce49b851a5b81c2ce698c684;hp=43da4470d42e59397d33052f50097a4e7f218da1;hpb=1a7c3a40d3e477b789c3fdfe7cacb01649d47edf;p=senf.git diff --git a/Console/Readline.cc b/Console/Readline.cc index 43da447..dc8bd6a 100644 --- a/Console/Readline.cc +++ b/Console/Readline.cc @@ -59,8 +59,13 @@ /////////////////////////////////////////////////////////////////////////// // senf::console::detail::ReadlineClientReader -extern int readline_echoing_p; -extern int _rl_bell_preference; +extern "C" { + extern int readline_echoing_p; + extern int _rl_bell_preference; + + void _rl_erase_entire_line(); +} + namespace { @@ -74,9 +79,13 @@ namespace { void readline_callback(char * input) { - if (senf::console::detail::ReadlineClientReader::active() && input) - return senf::console::detail::ReadlineClientReader::instance().callback( - std::string(input) ); + if (senf::console::detail::ReadlineClientReader::active()) { + if (input) + return senf::console::detail::ReadlineClientReader::instance().callback( + std::string(input) ); + else // input == 0 -> EOF (or Ctrl-D) + senf::console::detail::ReadlineClientReader::instance().eof(); + } } ssize_t readline_cookie_write_function(void * cookie, char const * buffer, size_t size) @@ -95,6 +104,14 @@ namespace { void readline_deprep_term() {} + int restart_line(int count, int key) + { + rl_kill_full_line(count, key); + rl_crlf(); + rl_forced_update_display(); + return 0; + } + } prefix_ senf::console::detail::ReadlineClientReader::ReadlineClientReader(Client & client) @@ -124,6 +141,7 @@ prefix_ senf::console::detail::ReadlineClientReader::ReadlineClientReader(Client rl_deprep_term_function = &readline_deprep_term; rl_getc_function = &readline_getc_function; rl_bind_key('\t', &rl_insert); + rl_bind_key('\x03', &restart_line); using_history(); // Don't ask me, where I found this ... @@ -164,10 +182,14 @@ prefix_ void senf::console::detail::ReadlineClientReader::callback(std::string l } prefix_ void senf::console::detail::ReadlineClientReader::v_disablePrompt() -{} +{ + _rl_erase_entire_line(); +} prefix_ void senf::console::detail::ReadlineClientReader::v_enablePrompt() -{} +{ + rl_forced_update_display(); +} prefix_ void senf::console::detail::ReadlineClientReader::v_translate(std::string & data) { @@ -182,11 +204,11 @@ prefix_ void senf::console::detail::ReadlineClientReader::charEvent(Scheduler::E stopClient(); return; } - ch_ = ch; + ch_ = static_cast(ch); if (skipChars_ > 0) --skipChars_; - else if (ch_ == static_cast(0xff)) + else if (ch_ == 0xff) skipChars_ = 2; else if (ch_ != 0) rl_callback_read_char();