Mercurial > octave-nkf
diff liboctave/util/cmd-edit.cc @ 16570:d5ae5aa80d42
preserve pending command line input when running commands from GUI actions
* QTerminal.h, QTerminal.cc (QTerminal::relay_command): Delete.
* file-editor-tab.cc (file_editor_tab::run_file_callback): New
argument, bp_info. Save pending command line input and execute
command.
(file_editor_tab::run_file): Use octave_link to execute file.
* main-window.h, main-window.cc
(main_window::execute_command_in_terminal): Rename from
main_window::handle_command_double_clicked. Post event through
octave_link to execute command.
(main_window::construct_octave_qt_link): Connect
_octave_qt_link::execute_command_in_terminal_signal to
main_window::execute_command_in_terminal.
(main_window::execute_command_callback): New function.
(main_window::relay_command_signal): Delete signal. Remove all uses.
* octave-qt-link.h, octave-qt-link.cc
(octave_qt_link::do_execute_command_in_terminal): New function.
(octave_qt_link::execute_command_in_terminal_signal): New signal.
* terminal-dock-widget.h, terminal-dock-widget.cc
(terminal_dock_widget::relay_command_signal): Delete signal. Remove
all uses.
* octave-link.h (octave_link::execute_command_in_terminal,
octave_link::do_execute_command_in_terminal): New functions.
* cmd-edit.h, cmd-edit.cc
(command_editor::pre_input_hook_set): New variable.
(gnu_readline::previous_pre_input_hook,
command_editor::intial_input): New member variables.
(command_editor::restore_pre_input_hook,
command_editor::do_get_current_line,
command_editor::do_replace_line, command_editor::set_pre_input_hook,
gnu_readline::do_get_current_line, gnu_readline::do_replace_line,
gnu_readline::set_pre_input_hook, command_editor::set_initial_input,
gnu_readline::restore_pre_input_hook,
default_command_editor::do_get_current_line,
default_command_editor::do_replace_line,
command_editor::insert_initial_input,
command_editor::pre_input_handler, command_editor::get_current_line,
command_editor::replace_line, command_editor::add_pre_input_hook,
command_editor::do_insert_initial_input,
command_editor::set_pre_input_hook,
command_editor::restore_pre_input_hook): New functions.
(command_editor::readline): Handle initial input.
(command_editor::interrupt): Give argument a default value.
* oct-rl-edit.h, oct-rl-edit.c (octave_rl_copy_line,
octave_rl_replace_line, octave_rl_set_pre_input_hook,
octave_rl_get_pre_input_hook): New functions.
(rl_pre_input_hook_fcn_ptr): New typedef.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 25 Apr 2013 17:57:55 -0400 |
parents | 8ea8df0747e9 |
children | ca9a9c0740c5 |
line wrap: on
line diff
--- a/liboctave/util/cmd-edit.cc Thu Apr 25 12:33:09 2013 -0400 +++ b/liboctave/util/cmd-edit.cc Thu Apr 25 17:57:55 2013 -0400 @@ -48,6 +48,8 @@ std::set<command_editor::startup_hook_fcn> command_editor::startup_hook_set; +std::set<command_editor::pre_input_hook_fcn> command_editor::pre_input_hook_set; + std::set<command_editor::event_hook_fcn> command_editor::event_hook_set; static octave_mutex event_hook_lock; @@ -66,6 +68,8 @@ typedef command_editor::startup_hook_fcn startup_hook_fcn; + typedef command_editor::pre_input_hook_fcn pre_input_hook_fcn; + typedef command_editor::event_hook_fcn event_hook_fcn; typedef command_editor::completion_fcn completion_fcn; @@ -139,6 +143,10 @@ std::string do_get_line_buffer (void) const; + std::string do_get_current_line (void) const; + + void do_replace_line (const std::string& text, bool clear_undo); + void do_insert_text (const std::string& text); void do_newline (void); @@ -153,6 +161,10 @@ void restore_startup_hook (void); + void set_pre_input_hook (pre_input_hook_fcn f); + + void restore_pre_input_hook (void); + void set_event_hook (event_hook_fcn f); void restore_event_hook (void); @@ -179,6 +191,8 @@ startup_hook_fcn previous_startup_hook; + pre_input_hook_fcn previous_pre_input_hook; + event_hook_fcn previous_event_hook; completion_fcn completion_function; @@ -205,6 +219,7 @@ gnu_readline::gnu_readline () : command_editor (), previous_startup_hook (0), + previous_pre_input_hook (0), previous_event_hook (0), completion_function (0), quoting_function (0), dequoting_function (0), char_is_quoted_function (0), user_accept_line_function (0) @@ -522,6 +537,22 @@ return ::octave_rl_line_buffer (); } +std::string +gnu_readline::do_get_current_line (void) const +{ + std::string retval; + char *buf = ::octave_rl_copy_line (); + retval = buf; + free (buf); + return retval; +} + +void +gnu_readline::do_replace_line (const std::string& text, bool clear_undo) +{ + ::octave_rl_replace_line (text.c_str (), clear_undo); +} + void gnu_readline::do_insert_text (const std::string& text) { @@ -568,6 +599,21 @@ } void +gnu_readline::set_pre_input_hook (pre_input_hook_fcn f) +{ + previous_pre_input_hook = ::octave_rl_get_pre_input_hook (); + + if (f != previous_pre_input_hook) + ::octave_rl_set_pre_input_hook (f); +} + +void +gnu_readline::restore_pre_input_hook (void) +{ + ::octave_rl_set_pre_input_hook (previous_pre_input_hook); +} + +void gnu_readline::set_event_hook (event_hook_fcn f) { previous_event_hook = octave_rl_get_event_hook (); @@ -767,7 +813,11 @@ std::string do_get_line_buffer (void) const; - void do_insert_text (const std::string&); + std::string do_get_current_line (void) const; + + void do_replace_line (const std::string& text, bool clear_undo); + + void do_insert_text (const std::string& text); void do_newline (void); @@ -832,6 +882,19 @@ return ""; } +std::string +default_command_editor::do_get_current_line (void) const +{ + // FIXME + return std::string (); +} + +void +default_command_editor::do_replace_line (const std::string&, bool) +{ + // FIXME +} + void default_command_editor::do_insert_text (const std::string&) { @@ -891,6 +954,19 @@ instance = new default_command_editor (); } +void +command_editor::set_initial_input (const std::string& text) +{ + if (instance_ok ()) + instance->initial_input = text; +} + +int +command_editor::insert_initial_input (void) +{ + return instance_ok () ? instance->do_insert_initial_input () : 0; +} + int command_editor::startup_handler (void) { @@ -907,6 +983,21 @@ } int +command_editor::pre_input_handler (void) +{ + for (pre_input_hook_set_iterator p = pre_input_hook_set.begin (); + p != pre_input_hook_set.end (); p++) + { + pre_input_hook_fcn f = *p; + + if (f) + f (); + } + + return 0; +} + +int command_editor::event_handler (void) { event_hook_lock.lock (); @@ -945,8 +1036,17 @@ std::string command_editor::readline (const std::string& prompt, bool& eof) { - return (instance_ok ()) - ? instance->do_readline (prompt, eof) : std::string (); + std::string retval; + + if (instance_ok ()) + { + if (! instance->initial_input.empty ()) + add_pre_input_hook (command_editor::insert_initial_input); + + retval = instance->do_readline (prompt, eof); + } + + return retval; } void @@ -1179,6 +1279,19 @@ return (instance_ok ()) ? instance->do_get_line_buffer () : ""; } +std::string +command_editor::get_current_line (void) +{ + return (instance_ok ()) ? instance->do_get_current_line () : ""; +} + +void +command_editor::replace_line (const std::string& text, bool clear_undo) +{ + if (instance_ok ()) + instance->do_replace_line (text, clear_undo); +} + void command_editor::insert_text (const std::string& text) { @@ -1240,6 +1353,32 @@ } void +command_editor::add_pre_input_hook (pre_input_hook_fcn f) +{ + if (instance_ok ()) + { + pre_input_hook_set.insert (f); + + instance->set_pre_input_hook (pre_input_handler); + } +} + +void +command_editor::remove_pre_input_hook (pre_input_hook_fcn f) +{ + if (instance_ok ()) + { + pre_input_hook_set_iterator p = pre_input_hook_set.find (f); + + if (p != pre_input_hook_set.end ()) + pre_input_hook_set.erase (p); + + if (pre_input_hook_set.empty ()) + instance->restore_pre_input_hook (); + } +} + +void command_editor::add_event_hook (event_hook_fcn f) { octave_autolock guard (event_hook_lock); @@ -1586,6 +1725,21 @@ return result; } +int +command_editor::do_insert_initial_input (void) +{ + std::string input = initial_input; + + initial_input = ""; + + do_insert_text (input); + + // Is it really right to redisplay here? + do_redisplay (); + + return 0; +} + // Return the octal number parsed from STRING, or -1 to indicate that // the string contained a bad number.