1 /* Console functions for X windows.
2 Copyright (C) 1996 Ben Wing.
4 This file is part of XEmacs.
6 XEmacs is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /* Synched up with: Not in FSF. */
23 /* This file Mule-ized by Ben Wing, 7-10-00. */
27 Ben Wing: January 1996, for 19.14.
33 #include "console-x.h"
35 #include "process.h" /* canonicalize_host_name */
36 #include "redisplay.h" /* for display_arg */
38 DEFINE_CONSOLE_TYPE (x);
41 x_initially_selected_for_input (struct console *con)
46 /* Parse a DISPLAY specification like "host:10.0" or ":0" */
48 split_up_display_spec (Lisp_Object display, int *hostname_length,
49 int *display_length, int *screen_length)
51 Bufbyte *beg = XSTRING_DATA (display);
52 Bufbyte *end = beg + XSTRING_LENGTH (display);
58 if (charptr_emchar (p) == ':')
60 *hostname_length = p - beg;
65 if (charptr_emchar (p) == '.')
67 *display_length = p - beg - *hostname_length;
68 *screen_length = end - p;
73 *display_length = XSTRING_LENGTH (display) - *hostname_length;
80 *hostname_length = XSTRING_LENGTH (display);
85 /* Remember, in all of the following functions, we have to verify
86 the integrity of our input, because the generic functions don't. */
89 x_device_to_console_connection (Lisp_Object connection, Error_behavior errb)
91 /* Strip the trailing .# off of the connection, if it's there. */
93 if (NILP (connection))
97 int hostname_length, display_length, screen_length;
99 if (!ERRB_EQ (errb, ERROR_ME))
101 if (!STRINGP (connection))
105 CHECK_STRING (connection);
107 split_up_display_spec (connection, &hostname_length, &display_length,
109 connection = make_string (XSTRING_DATA (connection),
110 hostname_length + display_length);
117 get_display_arg_connection (void)
119 const Extbyte *disp_name;
121 /* If the user didn't explicitly specify a display to use when
122 they called make-x-device, then we first check to see if a
123 display was specified on the command line with -display. If
124 so, we set disp_name to it. Otherwise we use XDisplayName to
125 see what DISPLAY is set to. XtOpenDisplay knows how to do
126 both of these things, but we need to know the name to use. */
134 make_argc_argv (Vx_initial_argv_list, &argc, &argv);
137 for (elt = 0; elt < argc; elt++)
139 if (!strcmp (argv[elt], "-d") || !strcmp (argv[elt], "-display"))
143 suppress_early_error_handler_backtrace = 1;
144 type_error (Qinvalid_argument,
145 "-display specified with no arg");
149 disp_name = argv[elt + 1];
155 /* assert: display_arg is only set if we found the display
156 arg earlier so we can't fail to find it now. */
157 assert (disp_name != NULL);
158 conn = build_ext_string (disp_name, Qcommand_argument_encoding);
159 free_argc_argv (argv);
163 return build_ext_string (XDisplayName (0), Qx_display_name_encoding);
166 /* "semi-canonicalize" means convert to a nicer form for printing, but
167 don't completely canonicalize (into some likely ugly form) */
170 x_semi_canonicalize_console_connection (Lisp_Object connection,
177 if (NILP (connection))
178 connection = get_display_arg_connection ();
181 if (!ERRB_EQ (errb, ERROR_ME))
183 if (!STRINGP (connection))
184 RETURN_UNGCPRO (Qunbound);
187 CHECK_STRING (connection);
191 /* Be lenient, allow people to specify a device connection instead of
192 a console connection -- e.g. "foo:0.0" instead of "foo:0". This
193 only happens in `find-console' and `get-console'. */
194 connection = x_device_to_console_connection (connection, errb);
196 /* Check for a couple of standard special cases */
197 if (string_char (XSTRING (connection), 0) == ':')
198 connection = concat2 (build_string ("localhost"), connection);
201 /* connection =~ s/^unix:/localhost:/; */
202 const Bufbyte *p = XSTRING_DATA (connection);
203 const Bufbyte *end = XSTRING_DATA (connection) + XSTRING_LENGTH (connection);
206 for (i = 0; i < sizeof ("unix:") - 1; i++)
208 if (p == end || charptr_emchar (p) != "unix:"[i])
213 connection = concat2 (build_string ("localhost:"),
214 make_string (p, end - p));
218 RETURN_UNGCPRO (connection);
222 x_canonicalize_console_connection (Lisp_Object connection, Error_behavior errb)
224 Lisp_Object hostname = Qnil;
225 struct gcpro gcpro1, gcpro2;
227 GCPRO2 (connection, hostname);
229 connection = x_semi_canonicalize_console_connection (connection, errb);
230 if (UNBOUNDP (connection))
231 RETURN_UNGCPRO (Qunbound);
234 int hostname_length, display_length, screen_length;
236 split_up_display_spec (connection, &hostname_length, &display_length,
238 hostname = Fsubstring (connection, Qzero, make_int (hostname_length));
239 hostname = canonicalize_host_name (hostname);
240 connection = concat2 (hostname,
241 make_string (XSTRING_DATA (connection)
242 + hostname_length, display_length));
245 RETURN_UNGCPRO (connection);
249 x_semi_canonicalize_device_connection (Lisp_Object connection,
252 int hostname_length, display_length, screen_length;
256 if (NILP (connection))
257 connection = get_display_arg_connection ();
260 if (!ERRB_EQ (errb, ERROR_ME))
262 if (!STRINGP (connection))
263 RETURN_UNGCPRO (Qunbound);
266 CHECK_STRING (connection);
269 split_up_display_spec (connection, &hostname_length, &display_length,
273 connection = concat2 (connection, build_string (".0"));
274 RETURN_UNGCPRO (connection);
278 x_canonicalize_device_connection (Lisp_Object connection, Error_behavior errb)
280 int hostname_length, display_length, screen_length;
281 Lisp_Object screen_str = Qnil;
282 struct gcpro gcpro1, gcpro2;
284 GCPRO2 (screen_str, connection);
285 connection = x_semi_canonicalize_device_connection (connection, errb);
286 if (UNBOUNDP (connection))
287 RETURN_UNGCPRO (Qunbound);
289 split_up_display_spec (connection, &hostname_length, &display_length,
292 screen_str = make_string (XSTRING_DATA (connection)
293 + hostname_length + display_length, screen_length);
294 connection = x_canonicalize_console_connection (connection, errb);
296 RETURN_UNGCPRO (concat2 (connection, screen_str));
300 console_type_create_x (void)
302 INITIALIZE_CONSOLE_TYPE (x, "x", "console-x-p");
304 CONSOLE_HAS_METHOD (x, semi_canonicalize_console_connection);
305 CONSOLE_HAS_METHOD (x, canonicalize_console_connection);
306 CONSOLE_HAS_METHOD (x, semi_canonicalize_device_connection);
307 CONSOLE_HAS_METHOD (x, canonicalize_device_connection);
308 CONSOLE_HAS_METHOD (x, device_to_console_connection);
309 CONSOLE_HAS_METHOD (x, initially_selected_for_input);
314 reinit_console_type_create_x (void)
316 REINITIALIZE_CONSOLE_TYPE (x);