Mercurial > octave
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 ()) |