Even more sophisticated readline functionality

This commit is contained in:
2021-11-04 14:00:35 -04:00
parent deaf4e4873
commit e5a1f238ec
4 changed files with 17 additions and 22 deletions

View File

@@ -23,7 +23,16 @@ Channel::~Channel() {
driven_->channels_[chid_] = nullptr; driven_->channels_[chid_] = nullptr;
} }
void Channel::show_command() { void Channel::show_or_hide_command() {
// Decide if we should hide the command, and if so, do it.
if ((!readline_enabled_) || (driven_->stop_driver_) || (sb_out_->fill() > 0)) {
int ccsize = current_prompt_.size() + current_command_.size();
readline_echo_ += util::repeat_string("\b \b", ccsize);
current_prompt_ = "";
current_command_ = "";
return;
}
// If the prompt has changed, erase everything and start over. // If the prompt has changed, erase everything and start over.
if (desired_prompt_ != current_prompt_) { if (desired_prompt_ != current_prompt_) {
int ccsize = current_prompt_.size() + current_command_.size(); int ccsize = current_prompt_.size() + current_command_.size();
@@ -51,18 +60,9 @@ void Channel::show_command() {
} }
} }
void Channel::hide_command() {
int ccsize = current_command_.size() + current_prompt_.size();
if (ccsize > 0) {
readline_echo_ += util::repeat_string("\b \b", ccsize);
current_command_ = "";
current_prompt_ = "";
}
}
void Channel::set_prompt(const std::string &p) { void Channel::set_prompt(const std::string &p) {
desired_prompt_ = p; desired_prompt_ = p;
if (readline_enabled_) show_command(); show_or_hide_command();
} }
void Channel::feed_readline(int nbytes, const char *bytes) { void Channel::feed_readline(int nbytes, const char *bytes) {
@@ -72,7 +72,7 @@ void Channel::feed_readline(int nbytes, const char *bytes) {
// Ignore newline immediately after carriage return. // Ignore newline immediately after carriage return.
// Otherwise, crlf produces two newlines. // Otherwise, crlf produces two newlines.
} else if ((c == '\r') || (c == '\n')) { } else if ((c == '\r') || (c == '\n')) {
show_command(); show_or_hide_command();
readline_echo_ = readline_echo_ + " \n"; readline_echo_ = readline_echo_ + " \n";
sb_in_->write_bytes(desired_command_); sb_in_->write_bytes(desired_command_);
sb_in_->write_uint8('\n'); sb_in_->write_uint8('\n');
@@ -95,11 +95,7 @@ void Channel::feed_readline(int nbytes, const char *bytes) {
} }
void Channel::peek_outgoing(int *nbytes, const char **bytes) { void Channel::peek_outgoing(int *nbytes, const char **bytes) {
if (sb_out_->fill() > 0) { show_or_hide_command();
hide_command();
} else if (readline_enabled_) {
show_command();
}
if (readline_echo_.size() > 0) { if (readline_echo_.size() > 0) {
*nbytes = readline_echo_.size(); *nbytes = readline_echo_.size();
*bytes = readline_echo_.c_str(); *bytes = readline_echo_.c_str();
@@ -127,6 +123,7 @@ void Channel::set_readline(bool e) {
if (e != readline_enabled_) { if (e != readline_enabled_) {
readline_enabled_ = e; readline_enabled_ = e;
desired_command_ = ""; desired_command_ = "";
show_or_hide_command();
} }
} }

View File

@@ -162,8 +162,7 @@ private:
void feed_readline(int nbytes, const char *bytes); void feed_readline(int nbytes, const char *bytes);
void peek_outgoing(int *nbytes, const char **bytes); void peek_outgoing(int *nbytes, const char **bytes);
void sent_outgoing(int nbytes); void sent_outgoing(int nbytes);
void show_command(); void show_or_hide_command();
void hide_command();
private: private:
static const int READLINE_MAX=512; static const int READLINE_MAX=512;

View File

@@ -345,8 +345,8 @@ public:
handle_lua_source(); handle_lua_source();
handle_new_closed_sockets(); handle_new_closed_sockets();
handle_new_outgoing_sockets(); handle_new_outgoing_sockets();
handle_console_input();
handle_console_output(); handle_console_output();
handle_console_input();
int mstimeout = short_sleep_ ? 0 : 100; int mstimeout = short_sleep_ ? 0 : 100;
handle_socket_input_output(mstimeout); handle_socket_input_output(mstimeout);
handle_clock(); handle_clock();

View File

@@ -155,7 +155,6 @@ void TextGame::do_quit_command(const StringVec &cmd) {
return; return;
} }
actor_id_ = 0; actor_id_ = 0;
stop_driver();
} }
void TextGame::do_command(const StringVec &words) { void TextGame::do_command(const StringVec &words) {
@@ -191,7 +190,7 @@ void TextGame::channel_printbuffer() {
printbuffer_line_ = printbuffer->first_line(); printbuffer_line_ = printbuffer->first_line();
} }
while (printbuffer_line_ < printbuffer->first_unchecked()) { while (printbuffer_line_ < printbuffer->first_unchecked()) {
stdostream() << "* " << printbuffer->nth(printbuffer_line_) << std::endl; stdostream() << printbuffer->nth(printbuffer_line_) << std::endl;
printbuffer_line_ += 1; printbuffer_line_ += 1;
} }
if (printbuffer_line_ > printbuffer->first_line()) { if (printbuffer_line_ > printbuffer->first_line()) {