comparison src/main.in.cc @ 17994:a99b7d656a6c

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.
author John W. Eaton <jwe@octave.org>
date Sun, 24 Nov 2013 02:57:32 -0500
parents 1329866151be
children b992a17767fe
comparison
equal deleted inserted replaced
17993:ac9fd5010620 17994:a99b7d656a6c
99 99
100 return retval; 100 return retval;
101 } 101 }
102 102
103 #endif 103 #endif
104
105 #include <cstdlib>
106
107 #if defined (OCTAVE_USE_WINDOWS_API)
108 #include <windows.h>
109 #elif defined (HAVE_FRAMEWORK_CARBON)
110 #include <Carbon/Carbon.h>
111 #elif defined (HAVE_X_WINDOWS)
112 #include <X11/Xlib.h>
113 #endif
114
115 bool
116 display_available (std::string& err_msg)
117 {
118 bool dpy_avail = false;
119
120 err_msg = "";
121
122 #if defined (OCTAVE_USE_WINDOWS_API)
123
124 HDC hdc = GetDC (0);
125
126 if (hdc)
127 dpy_avail = true;
128 else
129 err_msg = "no graphical display found";
130
131 #elif defined (HAVE_FRAMEWORK_CARBON)
132
133 CGDirectDisplayID display = CGMainDisplayID ();
134
135 if (display)
136 dpy_avail = true;
137 else
138 err_msg = "no graphical display found";
139
140 #elif defined (HAVE_X_WINDOWS)
141
142 const char *display_name = getenv ("DISPLAY");
143
144 if (display_name && *display_name)
145 {
146 Display *display = XOpenDisplay (display_name);
147
148 if (display)
149 {
150 Screen *screen = DefaultScreenOfDisplay (display);
151
152 if (! screen)
153 err_msg = "X11 display has no default screen";
154
155 XCloseDisplay (display);
156
157 dpy_avail = true;
158 }
159 else
160 err_msg = "unable to open X11 DISPLAY";
161 }
162 else
163 err_msg = "X11 DISPLAY environment variable not set";
164
165 #else
166
167 err_msg = "no graphical display found";
168
169 #endif
170
171 return dpy_avail;
172 }
104 173
105 #if (defined (HAVE_OCTAVE_GUI) \ 174 #if (defined (HAVE_OCTAVE_GUI) \
106 && ! defined (__WIN32__) || defined (__CYGWIN__)) 175 && ! defined (__WIN32__) || defined (__CYGWIN__))
107 176
108 #include <signal.h> 177 #include <signal.h>
513 int 582 int
514 main (int argc, char **argv) 583 main (int argc, char **argv)
515 { 584 {
516 int retval = 0; 585 int retval = 0;
517 586
518 #if (defined (HAVE_OCTAVE_GUI) \
519 && (! defined (__WIN32__) || defined (__CYGWIN__)))
520 bool start_gui = true; 587 bool start_gui = true;
521 bool gui_libs = true; 588 bool gui_libs = true;
522 #endif
523 589
524 std::string octave_bindir = get_octave_bindir (); 590 std::string octave_bindir = get_octave_bindir ();
525 591
526 std::string file = octave_bindir + dir_sep_char; 592 std::string file = octave_bindir + dir_sep_char;
527 593
537 int k = 1; 603 int k = 1;
538 #else 604 #else
539 int k = 0; 605 int k = 0;
540 new_argv[k++] = strsave ("octave"); 606 new_argv[k++] = strsave ("octave");
541 #endif 607 #endif
608
609 bool warn_display = true;
542 610
543 for (int i = 1; i < argc; i++) 611 for (int i = 1; i < argc; i++)
544 { 612 {
545 if (! strcmp (argv[i], "--no-gui-libs")) 613 if (! strcmp (argv[i], "--no-gui-libs"))
546 { 614 {
548 // libraries. It may not be possible to do plotting or any 616 // libraries. It may not be possible to do plotting or any
549 // ui* calls, but it will be a little faster to start and 617 // ui* calls, but it will be a little faster to start and
550 // require less memory. Don't pass the --no-gui-libs option 618 // require less memory. Don't pass the --no-gui-libs option
551 // on as that option is not recognized by Octave. 619 // on as that option is not recognized by Octave.
552 620
553 #if (defined (HAVE_OCTAVE_GUI) \ 621 start_gui = false;
554 && ! defined (__WIN32__) || defined (__CYGWIN__))
555 gui_libs = false; 622 gui_libs = false;
556 #endif
557 file = octave_bindir + dir_sep_char + "octave-cli"; 623 file = octave_bindir + dir_sep_char + "octave-cli";
558 } 624 }
559 else if (! strcmp (argv[i], "--no-gui")) 625 else if (! strcmp (argv[i], "--no-gui"))
560 { 626 {
561 // If we see this option, then we can just exec octave; we 627 // If we see this option, then we can just exec octave; we
562 // don't have to create a child process and wait for it to 628 // don't have to create a child process and wait for it to
563 // exit. But do exec "octave", not "octave-cli", because even 629 // exit. But do exec "octave", not "octave-cli", because even
564 // if the --no-gui option is given, we may be asked to do some 630 // if the --no-gui option is given, we may be asked to do some
565 // plotting or ui* calls. 631 // plotting or ui* calls.
566 632
567 #if (defined (HAVE_OCTAVE_GUI) \
568 && ! defined (__WIN32__) || defined (__CYGWIN__))
569 start_gui = false; 633 start_gui = false;
570 #endif
571 new_argv[k++] = argv[i]; 634 new_argv[k++] = argv[i];
572 } 635 }
636 else if (! strcmp (argv[i], "--silent") || ! strcmp (argv[i], "-q"))
637 warn_display = false;
573 else 638 else
574 new_argv[k++] = argv[i]; 639 new_argv[k++] = argv[i];
575 } 640 }
576 641
577 new_argv[k] = 0; 642 new_argv[k] = 0;
643
644 if (gui_libs || start_gui)
645 {
646 std::string display_check_err_msg;
647
648 if (! display_available (display_check_err_msg))
649 {
650 start_gui = false;
651 gui_libs = false;
652
653 file = octave_bindir + dir_sep_char + "octave-cli";
654
655 if (warn_display)
656 {
657 std::cerr << "octave: " << display_check_err_msg << std::endl;
658 std::cerr << "octave: disabiling GUI features" << std::endl;
659 }
660 }
661 }
578 662
579 #if (defined (HAVE_OCTAVE_GUI) \ 663 #if (defined (HAVE_OCTAVE_GUI) \
580 && ! defined (__WIN32__) || defined (__CYGWIN__)) 664 && ! defined (__WIN32__) || defined (__CYGWIN__))
581 665
582 if (gui_libs && start_gui && have_controlling_terminal ()) 666 if (gui_libs && start_gui && have_controlling_terminal ())