changeset 15138:16a6b0a6855d gui

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.
author John W. Eaton <jwe@octave.org>
date Sun, 05 Aug 2012 16:15:58 -0400
parents 3735a0e783cb
children 089b98bdaebf
files gui/src/octave-adapter/octave-main-thread.cc gui/src/octave-gui.cc run-octave.in src/octave.cc src/octave.h
diffstat 5 files changed, 67 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/gui/src/octave-adapter/octave-main-thread.cc
+++ b/gui/src/octave-adapter/octave-main-thread.cc
@@ -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<char**>(argv), 0);
+  octave_execute_interpreter ();
 }
--- a/gui/src/octave-gui.cc
+++ b/gui/src/octave-gui.cc
@@ -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 ())
--- a/run-octave.in
+++ b/run-octave.in
@@ -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" "$@"
--- a/src/octave.cc
+++ b/src/octave.cc
@@ -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
--- a/src/octave.h
+++ b/src/octave.h
@@ -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