# HG changeset patch # User John W. Eaton # Date 1344197758 14400 # Node ID 16a6b0a6855d43d5c0fd89773351133217c28521 # Parent 3735a0e783cb30c2cffc2ba884e18f427de965f5 GUI: support for octave arguments and integrate with run-octave. * src/octave.h (octave_initialize_interpreter, octave_execute_interpreter): New functions. (octave_cmdline_argc, octave_cmdline_argv, octave_embedded): New variables. * src/octave.cc (octave_cmdline_argc, octave_cmdline_argv, octave_embedded): New variables. (octave_initialize_interpreter, octave_execute_interpreter): New functions. (octave_main): Rewrite using them. * run-octave.in (octave_executable): New variable. (-gui): New option flag. * gui/src/octave-adapter/octave-main-thread.cc (octave_main_thread::run): Use octave_execute_interpreter. * gui/src/octave-gui.cc (dissociate_terminal): New function. (main): Use it. Also use octave_initialize_interpreter. diff -r 3735a0e783cb -r 16a6b0a6855d gui/src/octave-adapter/octave-main-thread.cc --- a/gui/src/octave-adapter/octave-main-thread.cc Sun Aug 05 16:43:55 2012 -0400 +++ b/gui/src/octave-adapter/octave-main-thread.cc Sun Aug 05 16:15:58 2012 -0400 @@ -27,8 +27,6 @@ octave_main_thread::run () { setlocale (LC_ALL, "en_US.UTF-8"); - int argc = 1; - const char *argv[] = { "octave" }; emit ready (); - octave_main (argc, const_cast(argv), 0); + octave_execute_interpreter (); } diff -r 3735a0e783cb -r 16a6b0a6855d gui/src/octave-gui.cc --- a/gui/src/octave-gui.cc Sun Aug 05 16:43:55 2012 -0400 +++ b/gui/src/octave-gui.cc Sun Aug 05 16:15:58 2012 -0400 @@ -22,36 +22,43 @@ #include "resource-manager.h" #include "main-window.h" -int -main (int argc, char *argv[]) +// Dissociate from the controlling terminal, if any. + +static void +dissociate_terminal (void) { - /* dissociate from the controlling terminal, if any */ +#if ! defined (Q_OS_WIN32) || defined (Q_OS_CYGWIN) + pid_t pid = fork (); - pid_t pid = fork (); if (pid < 0) { - //fprintf (stderr, "fork failed\n"); - return 1; + std::cerr << "fork failed!" << std::endl;; + exit (1); } else if (pid == 0) { - /* child */ - //fprintf (stderr, "in child, calling setsid ()\n"); + // Child. if (setsid () < 0) { - //fprintf (stderr, "setsid error\n"); - return 1; + std::cerr << "setsid error" << std::endl; + exit (1); } } else - { - /* parent */ - //fprintf (stderr, "in parent, exiting\n"); - exit (0); - } + exit (0); +#endif +} + +int +main (int argc, char *argv[]) +{ + octave_initialize_interpreter (argc, argv, 0); + + dissociate_terminal (); QApplication application (argc, argv); + while (true) { if (resource_manager::instance ()->is_first_run ()) diff -r 3735a0e783cb -r 16a6b0a6855d run-octave.in --- a/run-octave.in Sun Aug 05 16:43:55 2012 -0400 +++ b/run-octave.in Sun Aug 05 16:15:58 2012 -0400 @@ -42,6 +42,8 @@ d2_path=`echo "$d2_list" | $AWK '{ t = (s $0); s = t; } END { sub (/:$/, "", s); print s; }'` d3_path=`echo "$d3_list" | $AWK '{ t = (s $0); s = t; } END { sub (/:$/, "", s); print s; }'` +octave_executable="$builddir/src/octave" + LOADPATH="$d1_path:$d2_path:$d3_path" IMAGEPATH="$top_srcdir/scripts/image" DOCFILE="$builddir/doc/interpreter/doc-cache" @@ -64,11 +66,14 @@ elif [ "x$1" = "x-strace" ]; then driver="strace -o octave.trace" shift + elif [ "x$1" = "x-gui" ]; then + octave_executable="$builddir/gui/src/octave-gui" + shift fi fi OCTAVE_SITE_INITFILE="$top_srcdir/scripts/startup/main-rcfile" \ exec $builddir/libtool --mode=execute $driver \ - "$builddir/src/octave" --no-init-path --path="$LOADPATH" \ + "$octave_executable" --no-init-path --path="$LOADPATH" \ --image-path="$IMAGEPATH" --doc-cache-file="$DOCFILE" \ --texi-macros-file="$TEXIMACROSFILE" --info-file="$INFOFILE" "$@" diff -r 3735a0e783cb -r 16a6b0a6855d src/octave.cc --- a/src/octave.cc Sun Aug 05 16:43:55 2012 -0400 +++ b/src/octave.cc Sun Aug 05 16:15:58 2012 -0400 @@ -81,6 +81,10 @@ extern void install_builtins (void); +int octave_cmdline_argc; +char **octave_cmdline_argv; +int octave_embedded; + // The command-line options. static string_vector octave_argv; @@ -633,6 +637,18 @@ int octave_main (int argc, char **argv, int embedded) { + octave_initialize_interpreter (argc, argv, embedded); + + return octave_execute_interpreter (); +} + +void +octave_initialize_interpreter (int argc, char **argv, int embedded) +{ + octave_cmdline_argc = argc; + octave_cmdline_argv = argv; + octave_embedded = embedded; + octave_env::set_program_name (argv[0]); octave_program_invocation_name = octave_env::get_program_invocation_name (); @@ -862,9 +878,6 @@ if (line_editing) initialize_command_input (); - if (! inhibit_startup_message) - std::cout << OCTAVE_STARTUP_MESSAGE "\n" << std::endl; - if (traditional) maximum_braindamage (); @@ -880,6 +893,13 @@ load_path::initialize (set_initial_path); initialize_history (read_history_file); +} + +int +octave_execute_interpreter (void) +{ + if (! inhibit_startup_message) + std::cout << OCTAVE_STARTUP_MESSAGE "\n" << std::endl; execute_startup_files (); @@ -892,7 +912,7 @@ int last_arg_idx = optind; - int remaining_args = argc - last_arg_idx; + int remaining_args = octave_cmdline_argc - last_arg_idx; if (! code_to_eval.empty ()) { @@ -907,9 +927,9 @@ // If we are running an executable script (#! /bin/octave) then // we should only see the args passed to the script. - intern_argv (remaining_args, argv+last_arg_idx); + intern_argv (remaining_args, octave_cmdline_argv+last_arg_idx); - execute_command_line_file (argv[last_arg_idx]); + execute_command_line_file (octave_cmdline_argv[last_arg_idx]); if (! persist) { @@ -924,9 +944,9 @@ command_editor::reset_current_command_number (1); // Now argv should have the full set of args. - intern_argv (argc, argv); + intern_argv (octave_cmdline_argc, octave_cmdline_argv); - if (! embedded) + if (! octave_embedded) switch_to_buffer (create_buffer (get_input_from_stdin ())); // Force input to be echoed if not really interactive, but the user @@ -941,7 +961,7 @@ bind_internal_variable ("echo_executing_commands", ECHO_CMD_LINE); } - if (embedded) + if (octave_embedded) { // FIXME -- do we need to do any cleanup here before // returning? If we don't, what will happen to Octave functions diff -r 3735a0e783cb -r 16a6b0a6855d src/octave.h --- a/src/octave.h Sun Aug 05 16:43:55 2012 -0400 +++ b/src/octave.h Sun Aug 05 16:15:58 2012 -0400 @@ -29,6 +29,15 @@ extern OCTINTERP_API int octave_main (int argc, char **argv, int embedded); +extern OCTINTERP_API void +octave_initialize_interpreter (int argc, char **argv, int embedded); + +extern OCTINTERP_API int octave_execute_interpreter (void); + +extern OCTINTERP_API int octave_cmdline_argc; +extern OCTINTERP_API char **octave_cmdline_argv; +extern OCTINTERP_API int octave_embedded; + #ifdef __cplusplus } #endif