# HG changeset patch # User John W. Eaton # Date 1385279852 18000 # Node ID a99b7d656a6cb6092720f7b28a4d82d000bf7c0a # Parent ac9fd501062051ee5b60e649d2be9293d5f56415 start in CLI mode if display is not available (bug #40685) * main.in.cc (display_available): New function. (main): Use it. If no display is available, start in CLI mode. * src/Makefile.am (octave_LDADD): Include $(CARBON_LIBS) and $(X11_LIBS) in the list. diff -r ac9fd5010620 -r a99b7d656a6c src/Makefile.am --- a/src/Makefile.am Sat Nov 23 20:28:46 2013 -0500 +++ b/src/Makefile.am Sun Nov 24 02:57:32 2013 -0500 @@ -63,6 +63,8 @@ octave_LDADD = \ $(top_builddir)/libgnu/libgnu.la \ + $(X11_LIBS) \ + $(CARBON_LIBS) \ $(GNULIB_LINK_DEPS) octave_LDFLAGS = \ diff -r ac9fd5010620 -r a99b7d656a6c src/main.in.cc --- a/src/main.in.cc Sat Nov 23 20:28:46 2013 -0500 +++ b/src/main.in.cc Sun Nov 24 02:57:32 2013 -0500 @@ -102,6 +102,75 @@ #endif +#include + +#if defined (OCTAVE_USE_WINDOWS_API) +#include +#elif defined (HAVE_FRAMEWORK_CARBON) +#include +#elif defined (HAVE_X_WINDOWS) +#include +#endif + +bool +display_available (std::string& err_msg) +{ + bool dpy_avail = false; + + err_msg = ""; + +#if defined (OCTAVE_USE_WINDOWS_API) + + HDC hdc = GetDC (0); + + if (hdc) + dpy_avail = true; + else + err_msg = "no graphical display found"; + +#elif defined (HAVE_FRAMEWORK_CARBON) + + CGDirectDisplayID display = CGMainDisplayID (); + + if (display) + dpy_avail = true; + else + err_msg = "no graphical display found"; + +#elif defined (HAVE_X_WINDOWS) + + const char *display_name = getenv ("DISPLAY"); + + if (display_name && *display_name) + { + Display *display = XOpenDisplay (display_name); + + if (display) + { + Screen *screen = DefaultScreenOfDisplay (display); + + if (! screen) + err_msg = "X11 display has no default screen"; + + XCloseDisplay (display); + + dpy_avail = true; + } + else + err_msg = "unable to open X11 DISPLAY"; + } + else + err_msg = "X11 DISPLAY environment variable not set"; + +#else + + err_msg = "no graphical display found"; + +#endif + + return dpy_avail; +} + #if (defined (HAVE_OCTAVE_GUI) \ && ! defined (__WIN32__) || defined (__CYGWIN__)) @@ -515,11 +584,8 @@ { int retval = 0; -#if (defined (HAVE_OCTAVE_GUI) \ - && (! defined (__WIN32__) || defined (__CYGWIN__))) bool start_gui = true; bool gui_libs = true; -#endif std::string octave_bindir = get_octave_bindir (); @@ -540,6 +606,8 @@ new_argv[k++] = strsave ("octave"); #endif + bool warn_display = true; + for (int i = 1; i < argc; i++) { if (! strcmp (argv[i], "--no-gui-libs")) @@ -550,10 +618,8 @@ // require less memory. Don't pass the --no-gui-libs option // on as that option is not recognized by Octave. -#if (defined (HAVE_OCTAVE_GUI) \ - && ! defined (__WIN32__) || defined (__CYGWIN__)) + start_gui = false; gui_libs = false; -#endif file = octave_bindir + dir_sep_char + "octave-cli"; } else if (! strcmp (argv[i], "--no-gui")) @@ -564,18 +630,36 @@ // if the --no-gui option is given, we may be asked to do some // plotting or ui* calls. -#if (defined (HAVE_OCTAVE_GUI) \ - && ! defined (__WIN32__) || defined (__CYGWIN__)) start_gui = false; -#endif new_argv[k++] = argv[i]; } + else if (! strcmp (argv[i], "--silent") || ! strcmp (argv[i], "-q")) + warn_display = false; else new_argv[k++] = argv[i]; } new_argv[k] = 0; + if (gui_libs || start_gui) + { + std::string display_check_err_msg; + + if (! display_available (display_check_err_msg)) + { + start_gui = false; + gui_libs = false; + + file = octave_bindir + dir_sep_char + "octave-cli"; + + if (warn_display) + { + std::cerr << "octave: " << display_check_err_msg << std::endl; + std::cerr << "octave: disabiling GUI features" << std::endl; + } + } + } + #if (defined (HAVE_OCTAVE_GUI) \ && ! defined (__WIN32__) || defined (__CYGWIN__))