annotate lib-src/i.c @ 5636:07256dcc0c8b

Add missing foreback specifier values to the GUI Element face. They were missing for an unexplicable reason in my initial patch, leading to nil color instances in the whole hierarchy of widget faces. -------------------- ChangeLog entries follow: -------------------- src/ChangeLog addition: 2012-01-03 Didier Verna <didier@xemacs.org> * faces.c (complex_vars_of_faces): Add missing foreback specifier values to the GUI Element face.
author Didier Verna <didier@lrde.epita.fr>
date Tue, 03 Jan 2012 11:25:06 +0100
parents 308d34e9f07d
children e2fae7783046
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
1 /* I-connector utility
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
2 Copyright (C) 2000 Kirill M. Katsnelson
1346
01c57eb70ae9 [xemacs-hg @ 2003-03-09 02:27:27 by ben]
ben
parents: 826
diff changeset
3 Copyright (C) 2002, 2003 Ben Wing.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
4
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
5 This file is part of XEmacs.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
6
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2993
diff changeset
7 XEmacs is free software: you can redistribute it and/or modify it
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2993
diff changeset
9 Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2993
diff changeset
10 option) any later version.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
11
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
15 for more details.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
16
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 2993
diff changeset
18 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
19
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
20 /* When run with an argument, i treats it as a command line, and pipes
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
21 command stdin, stdout and stderr to its own respective streams. How
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
22 silly it should sound, but windowed program in Win32 cannot do output
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
23 to the console from which it has been started, and should be run using
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
24 this utility.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
25
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
26 This utility is for running [tx]emacs as part of make process so that
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
27 its output goes to the same console as the rest of the make output
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
28 does. It can be used also when xemacs should be run as a batch
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
29 command ina script, especially when its standart output should be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
30 obtained programmatically. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
31
2993
49316578f12d [xemacs-hg @ 2005-10-14 01:02:29 by ben]
ben
parents: 2426
diff changeset
32 #ifdef HAVE_CONFIG_H
49316578f12d [xemacs-hg @ 2005-10-14 01:02:29 by ben]
ben
parents: 2426
diff changeset
33 # include <config.h>
49316578f12d [xemacs-hg @ 2005-10-14 01:02:29 by ben]
ben
parents: 2426
diff changeset
34 #endif
49316578f12d [xemacs-hg @ 2005-10-14 01:02:29 by ben]
ben
parents: 2426
diff changeset
35
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
36 #include <windows.h>
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
37 #include <stdio.h>
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
38 #include <string.h>
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
39 #include <tchar.h>
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
40
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
41 typedef struct
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
42 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
43 HANDLE source;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
44 HANDLE drain;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
45 } I_connector;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
46
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
47 /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
48 * Make new handle as that pointed to by PH but
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
49 * inheritable, substitute PH with it, and close the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
50 * original one
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
51 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
52 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
53 make_inheritable (HANDLE* ph)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
54 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
55 HANDLE htmp;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
56 DuplicateHandle (GetCurrentProcess(), *ph, GetCurrentProcess(), &htmp,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
57 0, TRUE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
58 *ph = htmp;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
59 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
60
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
61 /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
62 * Worker thread proc. Reads source, pumps into drain,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
63 * till either clogs.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
64 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
65 static DWORD CALLBACK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
66 pump (LPVOID pv_i)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
67 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
68 I_connector* pi = (I_connector*) pv_i;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
69 BYTE buffer [256];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
70 DWORD really_read, unused;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
71
2426
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
72 /* I said:
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
73
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
74 [[ The docs for ReadFile claim:
1346
01c57eb70ae9 [xemacs-hg @ 2003-03-09 02:27:27 by ben]
ben
parents: 826
diff changeset
75
01c57eb70ae9 [xemacs-hg @ 2003-03-09 02:27:27 by ben]
ben
parents: 826
diff changeset
76 The ReadFile function returns when one of the following is true: a write
01c57eb70ae9 [xemacs-hg @ 2003-03-09 02:27:27 by ben]
ben
parents: 826
diff changeset
77 operation completes on the write end of the pipe, the number of bytes
01c57eb70ae9 [xemacs-hg @ 2003-03-09 02:27:27 by ben]
ben
parents: 826
diff changeset
78 requested has been read, or an error occurs.
01c57eb70ae9 [xemacs-hg @ 2003-03-09 02:27:27 by ben]
ben
parents: 826
diff changeset
79
01c57eb70ae9 [xemacs-hg @ 2003-03-09 02:27:27 by ben]
ben
parents: 826
diff changeset
80 But this is just not true. ReadFile never seems to block, and unless we
2426
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
81 Sleep(), we will chew up all the CPU time. --ben ]]
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
82
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
83 But in fact
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
84
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
85 [a] this does not appear to be the case any more [maybe a temporary
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
86 bug in some versions of Win2000?]
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
87 [b] it causes data lossage. [#### Why should this be? Seems extremely
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
88 fishy. I tried commenting out the calls to close the standard
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
89 handles at the bottom of the program, but it made no difference.
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
90 Would we need some kind of additional handshaking? If we get
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
91 data loss with the sleep, then we are a race condition waiting
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
92 to happen. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
93 while (ReadFile (pi->source, buffer, sizeof (buffer), &really_read, NULL) &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
94 WriteFile (pi->drain, buffer, really_read, &unused, NULL))
2426
bb3f73fbbda8 [xemacs-hg @ 2004-12-07 00:20:51 by ben]
ben
parents: 1346
diff changeset
95 /* Sleep (100) */ ;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
96
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
97 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
98 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
99
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
100 /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
101 * Launch a pump for the given I-connector
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
102 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
103 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
104 start_pump (I_connector* pi)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
105 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
106 DWORD unused;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
107 HANDLE h_thread = CreateThread (NULL, 0, pump, (void*)pi, 0, &unused);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
108 CloseHandle (h_thread);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
109 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
110
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
111 static HANDLE external_event;
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
112
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
113 static BOOL
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
114 ctrl_c_handler (unsigned long type)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
115 {
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
116 SetEvent (external_event);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
117 return FALSE;
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
118 }
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
119
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
120 /* Skip over the executable name in the given command line. Correctly
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
121 handles quotes in the name. Return NULL upon error. If
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
122 REQUIRE_FOLLOWING is non-zero, it's an error if no argument follows the
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
123 executable name. */
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
124
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
125 static LPTSTR
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
126 skip_executable_name (LPTSTR cl, int require_following)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
127 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
128 int ix;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
129
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
130 while (1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
131 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
132 ix = _tcscspn (cl, _T(" \t\""));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
133 if (cl[ix] == '\"')
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
134 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
135 cl = _tcschr (cl + ix + 1, '\"');
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
136 if (cl == NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
137 return NULL; /* Unmatched quote */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
138 cl++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
139 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
140 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
141 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
142 cl += ix;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
143 cl += _tcsspn (cl, _T(" \t"));
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
144 if (!require_following)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
145 return cl;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
146 return *cl ? cl : NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
147 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
148 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
149 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
150
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
151 /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
152 * Brew coffee and bring snickers
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
153 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
154 void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
155 usage (void)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
156 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
157 fprintf (stderr,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
158 "\n"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
159 "usage: i command\n"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
160 "i executes the command and reroutes its standard handles to the calling\n"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
161 "console. Good for seeing output of GUI programs that use standard output."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
162 "\n");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
163 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
164
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
165 int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
166 main (void)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
167 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
168 STARTUPINFO si;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
169 PROCESS_INFORMATION pi;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
170 I_connector I_in, I_out, I_err;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
171 DWORD exit_code;
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
172 LPTSTR command = skip_executable_name (GetCommandLine (), 1);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
173
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
174 if (command == NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
175 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
176 usage ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
177 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
178 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
179
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
180 ZeroMemory (&si, sizeof (si));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
181 si.dwFlags = STARTF_USESTDHANDLES;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
182
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
183 I_in.source = GetStdHandle (STD_INPUT_HANDLE);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
184 CreatePipe (&si.hStdInput, &I_in.drain, NULL, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
185 make_inheritable (&si.hStdInput);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
186
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
187 I_out.drain = GetStdHandle (STD_OUTPUT_HANDLE);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
188 CreatePipe (&I_out.source, &si.hStdOutput, NULL, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
189 make_inheritable (&si.hStdOutput);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
190
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
191 I_err.drain = GetStdHandle (STD_ERROR_HANDLE);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
192 CreatePipe (&I_err.source, &si.hStdError, NULL, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
193 make_inheritable (&si.hStdError);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
194
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
195 {
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
196 SECURITY_ATTRIBUTES sa;
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
197 LPTSTR new_command =
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
198 (LPTSTR) malloc (666 + sizeof (TCHAR) * _tcslen (command));
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
199 LPTSTR past_exe;
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
200
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
201 if (!new_command)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
202 {
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
203 _ftprintf (stderr, _T ("Out of memory when launching `%s'\n"),
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
204 command);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
205 return 2;
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
206 }
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
207
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
208 past_exe = skip_executable_name (command, 0);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
209 if (!past_exe)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
210 {
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
211 usage ();
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
212 return 1;
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
213 }
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
214
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
215 /* Since XEmacs isn't a console application, it can't easily be
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
216 terminated using ^C. Therefore, we set up a communication path with
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
217 it so that when a ^C is sent to us (using GenerateConsoleCtrlEvent),
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
218 we in turn signals it to commit suicide. (This is cleaner than using
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
219 TerminateProcess()). This makes (e.g.) the "Stop Build" command
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
220 from VC++ correctly terminate XEmacs.
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
221
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
222 #### This will cause problems if i.exe is used for commands other
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
223 than XEmacs. We need to make behavior this a command-line
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
224 option. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
225
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
226 /* Create the event as inheritable so that we can use it to communicate
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
227 with the child process */
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
228 sa.nLength = sizeof (sa);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
229 sa.bInheritHandle = TRUE;
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
230 sa.lpSecurityDescriptor = NULL;
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
231 external_event = CreateEvent (&sa, FALSE, FALSE, NULL);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
232 if (!external_event)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
233 {
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
234 _ftprintf (stderr, _T ("Error %d creating signal event for `%s'\n"),
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
235 GetLastError (), command);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
236 return 2;
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
237 }
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
238
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
239 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) ctrl_c_handler, TRUE);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
240 _tcsncpy (new_command, command, past_exe - command);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
241 _stprintf (new_command + (past_exe - command),
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
242 /* start with space in case no args past command name */
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
243 " -mswindows-termination-handle %d ", (long) external_event);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
244 _tcscat (new_command, past_exe);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
245
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
246 if (CreateProcess (NULL, new_command, NULL, NULL, TRUE, 0,
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
247 NULL, NULL, &si, &pi) == 0)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
248 {
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
249 _ftprintf (stderr, _T("Error %d launching `%s'\n"),
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
250 GetLastError (), command);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
251 return 2;
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
252 }
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
253
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
254 CloseHandle (pi.hThread);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
255 }
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 442
diff changeset
256
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
257
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
258 /* Start pump in each I-connector */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
259 start_pump (&I_in);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
260 start_pump (&I_out);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
261 start_pump (&I_err);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
262
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
263 /* Wait for the process to complete */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
264 WaitForSingleObject (pi.hProcess, INFINITE);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
265 GetExitCodeProcess (pi.hProcess, &exit_code);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
266 CloseHandle (pi.hProcess);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
267
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
268 /* Make pump threads eventually die out. Looks rude, I agree */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
269 CloseHandle (GetStdHandle (STD_INPUT_HANDLE));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
270 CloseHandle (GetStdHandle (STD_OUTPUT_HANDLE));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
271 CloseHandle (GetStdHandle (STD_ERROR_HANDLE));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
272
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
273 return exit_code;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents:
diff changeset
274 }