Mercurial > hg > xemacs-beta
annotate src/console-x.c @ 4952:19a72041c5ed
Mule-izing, various fixes related to char * arguments
-------------------- ChangeLog entries follow: --------------------
modules/ChangeLog addition:
2010-01-26 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c:
* postgresql/postgresql.c (CHECK_LIVE_CONNECTION):
* postgresql/postgresql.c (print_pgresult):
* postgresql/postgresql.c (Fpq_conn_defaults):
* postgresql/postgresql.c (Fpq_connectdb):
* postgresql/postgresql.c (Fpq_connect_start):
* postgresql/postgresql.c (Fpq_result_status):
* postgresql/postgresql.c (Fpq_res_status):
Mule-ize large parts of it.
2010-01-26 Ben Wing <ben@xemacs.org>
* ldap/eldap.c (print_ldap):
* ldap/eldap.c (allocate_ldap):
Use write_ascstring().
src/ChangeLog addition:
2010-01-26 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (build_ascstring):
* alloc.c (build_msg_cistring):
* alloc.c (staticpro_1):
* alloc.c (staticpro_name):
* alloc.c (staticpro_nodump_1):
* alloc.c (staticpro_nodump_name):
* alloc.c (unstaticpro_nodump_1):
* alloc.c (mcpro_1):
* alloc.c (mcpro_name):
* alloc.c (object_memory_usage_stats):
* alloc.c (common_init_alloc_early):
* alloc.c (init_alloc_once_early):
* buffer.c (print_buffer):
* buffer.c (vars_of_buffer):
* buffer.c (common_init_complex_vars_of_buffer):
* buffer.c (init_initial_directory):
* bytecode.c (invalid_byte_code):
* bytecode.c (print_compiled_function):
* bytecode.c (mark_compiled_function):
* chartab.c (print_table_entry):
* chartab.c (print_char_table):
* config.h.in:
* console-gtk.c:
* console-gtk.c (gtk_device_to_console_connection):
* console-gtk.c (gtk_semi_canonicalize_console_connection):
* console-gtk.c (gtk_canonicalize_console_connection):
* console-gtk.c (gtk_semi_canonicalize_device_connection):
* console-gtk.c (gtk_canonicalize_device_connection):
* console-stream.c (stream_init_frame_1):
* console-stream.c (vars_of_console_stream):
* console-stream.c (init_console_stream):
* console-x.c (x_semi_canonicalize_console_connection):
* console-x.c (x_semi_canonicalize_device_connection):
* console-x.c (x_canonicalize_device_connection):
* console-x.h:
* data.c (eq_with_ebola_notice):
* data.c (Fsubr_interactive):
* data.c (Fnumber_to_string):
* data.c (digit_to_number):
* device-gtk.c (gtk_init_device):
* device-msw.c (print_devmode):
* device-x.c (x_event_name):
* dialog-msw.c (handle_directory_dialog_box):
* dialog-msw.c (handle_file_dialog_box):
* dialog-msw.c (vars_of_dialog_mswindows):
* doc.c (weird_doc):
* doc.c (Fsnarf_documentation):
* doc.c (vars_of_doc):
* dumper.c (pdump):
* dynarr.c:
* dynarr.c (Dynarr_realloc):
* editfns.c (Fuser_real_login_name):
* editfns.c (get_home_directory):
* elhash.c (print_hash_table_data):
* elhash.c (print_hash_table):
* emacs.c (main_1):
* emacs.c (vars_of_emacs):
* emodules.c:
* emodules.c (_emodules_list):
* emodules.c (Fload_module):
* emodules.c (Funload_module):
* emodules.c (Flist_modules):
* emodules.c (find_make_module):
* emodules.c (attempt_module_delete):
* emodules.c (emodules_load):
* emodules.c (emodules_doc_subr):
* emodules.c (emodules_doc_sym):
* emodules.c (syms_of_module):
* emodules.c (vars_of_module):
* emodules.h:
* eval.c (print_subr):
* eval.c (signal_call_debugger):
* eval.c (build_error_data):
* eval.c (signal_error):
* eval.c (maybe_signal_error):
* eval.c (signal_continuable_error):
* eval.c (maybe_signal_continuable_error):
* eval.c (signal_error_2):
* eval.c (maybe_signal_error_2):
* eval.c (signal_continuable_error_2):
* eval.c (maybe_signal_continuable_error_2):
* eval.c (signal_ferror):
* eval.c (maybe_signal_ferror):
* eval.c (signal_continuable_ferror):
* eval.c (maybe_signal_continuable_ferror):
* eval.c (signal_ferror_with_frob):
* eval.c (maybe_signal_ferror_with_frob):
* eval.c (signal_continuable_ferror_with_frob):
* eval.c (maybe_signal_continuable_ferror_with_frob):
* eval.c (syntax_error):
* eval.c (syntax_error_2):
* eval.c (maybe_syntax_error):
* eval.c (sferror):
* eval.c (sferror_2):
* eval.c (maybe_sferror):
* eval.c (invalid_argument):
* eval.c (invalid_argument_2):
* eval.c (maybe_invalid_argument):
* eval.c (invalid_constant):
* eval.c (invalid_constant_2):
* eval.c (maybe_invalid_constant):
* eval.c (invalid_operation):
* eval.c (invalid_operation_2):
* eval.c (maybe_invalid_operation):
* eval.c (invalid_change):
* eval.c (invalid_change_2):
* eval.c (maybe_invalid_change):
* eval.c (invalid_state):
* eval.c (invalid_state_2):
* eval.c (maybe_invalid_state):
* eval.c (wtaerror):
* eval.c (stack_overflow):
* eval.c (out_of_memory):
* eval.c (print_multiple_value):
* eval.c (issue_call_trapping_problems_warning):
* eval.c (backtrace_specials):
* eval.c (backtrace_unevalled_args):
* eval.c (Fbacktrace):
* eval.c (warn_when_safe):
* event-Xt.c (modwarn):
* event-Xt.c (modbarf):
* event-Xt.c (check_modifier):
* event-Xt.c (store_modifier):
* event-Xt.c (emacs_Xt_format_magic_event):
* event-Xt.c (describe_event):
* event-gtk.c (dragndrop_data_received):
* event-gtk.c (store_modifier):
* event-gtk.c (gtk_reset_modifier_mapping):
* event-msw.c (dde_eval_string):
* event-msw.c (Fdde_alloc_advise_item):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (FROB):
* event-msw.c (emacs_mswindows_format_magic_event):
* event-stream.c (external_debugging_print_event):
* event-stream.c (execute_help_form):
* event-stream.c (vars_of_event_stream):
* events.c (print_event_1):
* events.c (print_event):
* events.c (event_equal):
* extents.c (print_extent_1):
* extents.c (print_extent):
* extents.c (vars_of_extents):
* faces.c (print_face):
* faces.c (complex_vars_of_faces):
* file-coding.c:
* file-coding.c (print_coding_system):
* file-coding.c (print_coding_system_in_print_method):
* file-coding.c (default_query_method):
* file-coding.c (find_coding_system):
* file-coding.c (make_coding_system_1):
* file-coding.c (chain_print):
* file-coding.c (undecided_print):
* file-coding.c (gzip_print):
* file-coding.c (vars_of_file_coding):
* file-coding.c (complex_vars_of_file_coding):
* fileio.c:
* fileio.c (report_file_type_error):
* fileio.c (report_error_with_errno):
* fileio.c (report_file_error):
* fileio.c (barf_or_query_if_file_exists):
* fileio.c (vars_of_fileio):
* floatfns.c (matherr):
* fns.c (print_bit_vector):
* fns.c (Fmapconcat):
* fns.c (add_suffix_to_symbol):
* fns.c (add_prefix_to_symbol):
* frame-gtk.c:
* frame-gtk.c (Fgtk_window_id):
* frame-x.c (def):
* frame-x.c (x_cde_transfer_callback):
* frame.c:
* frame.c (Fmake_frame):
* gc.c (show_gc_cursor_and_message):
* gc.c (vars_of_gc):
* glyphs-eimage.c (png_instantiate):
* glyphs-eimage.c (tiff_instantiate):
* glyphs-gtk.c (gtk_print_image_instance):
* glyphs-msw.c (mswindows_print_image_instance):
* glyphs-x.c (x_print_image_instance):
* glyphs-x.c (update_widget_face):
* glyphs.c (make_string_from_file):
* glyphs.c (print_image_instance):
* glyphs.c (signal_image_error):
* glyphs.c (signal_image_error_2):
* glyphs.c (signal_double_image_error):
* glyphs.c (signal_double_image_error_2):
* glyphs.c (xbm_mask_file_munging):
* glyphs.c (pixmap_to_lisp_data):
* glyphs.h:
* gui.c (gui_item_display_flush_left):
* hpplay.c (player_error_internal):
* hpplay.c (myHandler):
* intl-win32.c:
* intl-win32.c (langcode_to_lang):
* intl-win32.c (sublangcode_to_lang):
* intl-win32.c (Fmswindows_get_locale_info):
* intl-win32.c (lcid_to_locale_mule_or_no):
* intl-win32.c (mswindows_multibyte_to_unicode_print):
* intl-win32.c (complex_vars_of_intl_win32):
* keymap.c:
* keymap.c (print_keymap):
* keymap.c (ensure_meta_prefix_char_keymapp):
* keymap.c (Fkey_description):
* keymap.c (Ftext_char_description):
* lisp.h:
* lisp.h (struct):
* lisp.h (DECLARE_INLINE_HEADER):
* lread.c (Fload_internal):
* lread.c (locate_file):
* lread.c (read_escape):
* lread.c (read_raw_string):
* lread.c (read1):
* lread.c (read_list):
* lread.c (read_compiled_function):
* lread.c (init_lread):
* lrecord.h:
* marker.c (print_marker):
* marker.c (marker_equal):
* menubar-msw.c (displayable_menu_item):
* menubar-x.c (command_builder_operate_menu_accelerator):
* menubar.c (vars_of_menubar):
* minibuf.c (reinit_complex_vars_of_minibuf):
* minibuf.c (complex_vars_of_minibuf):
* mule-charset.c (Fmake_charset):
* mule-charset.c (complex_vars_of_mule_charset):
* mule-coding.c (iso2022_print):
* mule-coding.c (fixed_width_query):
* number.c (bignum_print):
* number.c (ratio_print):
* number.c (bigfloat_print):
* number.c (bigfloat_finalize):
* objects-msw.c:
* objects-msw.c (mswindows_color_to_string):
* objects-msw.c (mswindows_color_list):
* objects-tty.c:
* objects-tty.c (tty_font_list):
* objects-tty.c (tty_find_charset_font):
* objects-xlike-inc.c (xft_find_charset_font):
* objects-xlike-inc.c (endif):
* print.c:
* print.c (write_istring):
* print.c (write_ascstring):
* print.c (Fterpri):
* print.c (Fprint):
* print.c (print_error_message):
* print.c (print_vector_internal):
* print.c (print_cons):
* print.c (print_string):
* print.c (printing_unreadable_object):
* print.c (print_internal):
* print.c (print_float):
* print.c (print_symbol):
* process-nt.c (mswindows_report_winsock_error):
* process-nt.c (nt_canonicalize_host_name):
* process-unix.c (unix_canonicalize_host_name):
* process.c (print_process):
* process.c (report_process_error):
* process.c (report_network_error):
* process.c (make_process_internal):
* process.c (Fstart_process_internal):
* process.c (status_message):
* process.c (putenv_internal):
* process.c (vars_of_process):
* process.h:
* profile.c (vars_of_profile):
* rangetab.c (print_range_table):
* realpath.c (vars_of_realpath):
* redisplay.c (vars_of_redisplay):
* search.c (wordify):
* search.c (Freplace_match):
* sheap.c (sheap_adjust_h):
* sound.c (report_sound_error):
* sound.c (Fplay_sound_file):
* specifier.c (print_specifier):
* symbols.c (Fsubr_name):
* symbols.c (do_symval_forwarding):
* symbols.c (set_default_buffer_slot_variable):
* symbols.c (set_default_console_slot_variable):
* symbols.c (store_symval_forwarding):
* symbols.c (default_value):
* symbols.c (defsymbol_massage_name_1):
* symbols.c (defsymbol_massage_name_nodump):
* symbols.c (defsymbol_massage_name):
* symbols.c (defsymbol_massage_multiword_predicate_nodump):
* symbols.c (defsymbol_massage_multiword_predicate):
* symbols.c (defsymbol_nodump):
* symbols.c (defsymbol):
* symbols.c (defkeyword):
* symbols.c (defkeyword_massage_name):
* symbols.c (check_module_subr):
* symbols.c (deferror_1):
* symbols.c (deferror):
* symbols.c (deferror_massage_name):
* symbols.c (deferror_massage_name_and_message):
* symbols.c (defvar_magic):
* symeval.h:
* symeval.h (DEFVAR_SYMVAL_FWD):
* sysdep.c:
* sysdep.c (init_system_name):
* sysdll.c:
* sysdll.c (MAYBE_PREPEND_UNDERSCORE):
* sysdll.c (dll_function):
* sysdll.c (dll_variable):
* sysdll.c (dll_error):
* sysdll.c (dll_open):
* sysdll.c (dll_close):
* sysdll.c (image_for_address):
* sysdll.c (my_find_image):
* sysdll.c (search_linked_libs):
* sysdll.h:
* sysfile.h:
* sysfile.h (DEFAULT_DIRECTORY_FALLBACK):
* syswindows.h:
* tests.c (DFC_CHECK_LENGTH):
* tests.c (DFC_CHECK_CONTENT):
* tests.c (Ftest_hash_tables):
* text.c (vars_of_text):
* text.h:
* tooltalk.c (tt_opnum_string):
* tooltalk.c (tt_message_arg_ival_string):
* tooltalk.c (Ftooltalk_default_procid):
* tooltalk.c (Ftooltalk_default_session):
* tooltalk.c (init_tooltalk):
* tooltalk.c (vars_of_tooltalk):
* ui-gtk.c (Fdll_load):
* ui-gtk.c (type_to_marshaller_type):
* ui-gtk.c (Fgtk_import_function_internal):
* ui-gtk.c (emacs_gtk_object_printer):
* ui-gtk.c (emacs_gtk_boxed_printer):
* unicode.c (unicode_to_ichar):
* unicode.c (unicode_print):
* unicode.c (unicode_query):
* unicode.c (vars_of_unicode):
* unicode.c (complex_vars_of_unicode):
* win32.c:
* win32.c (mswindows_report_process_error):
* window.c (print_window):
* xemacs.def.in.in:
BASIC IDEA: Further fixing up uses of char * and CIbyte *
to reflect their actual semantics; Mule-izing some code;
redoing of the not-yet-working code to handle message translation.
Clean up code to handle message-translation (not yet working).
Create separate versions of build_msg_string() for working with
Ibyte *, CIbyte *, and Ascbyte * arguments. Assert that Ascbyte *
arguments are pure-ASCII. Make build_msg_string() be the same
as build_msg_ascstring(). Create same three versions of GETTEXT()
and DEFER_GETTEXT(). Also create build_defer_string() and
variants for the equivalent of DEFER_GETTEXT() when building a
string. Remove old CGETTEXT(). Clean up code where GETTEXT(),
DEFER_GETTEXT(), build_msg_string(), etc. was being called and
introduce some new calls to build_msg_string(), etc. Remove
GETTEXT() from calls to weird_doc() -- we assume that the
message snarfer knows about weird_doc(). Remove uses of
DEFER_GETTEXT() from error messages in sysdep.c and instead use
special comments /* @@@begin-snarf@@@ */ and /* @@@end-snarf@@@ */
that the message snarfer presumably knows about.
Create build_ascstring() and use it in many instances in place
of build_string(). The purpose of having Ascbyte * variants is
to make the code more self-documenting in terms of what sort of
semantics is expected for char * strings. In fact in the process
of looking for uses of build_string(), much improperly Mule-ized
was discovered.
Mule-ize a lot of code as described in previous paragraph,
e.g. in sysdep.c.
Make the error functions take Ascbyte * strings and fix up a
couple of places where non-pure-ASCII strings were being passed in
(file-coding.c, mule-coding.c, unicode.c). (It's debatable whether
we really need to make the error functions work this way. It
helps catch places where code is written in a way that message
translation won't work, but we may well never implement message
translation.)
Make staticpro() and friends take Ascbyte * strings instead of
raw char * strings. Create a const_Ascbyte_ptr dynarr type
to describe what's held by staticpro_names[] and friends,
create pdump descriptions for const_Ascbyte_ptr dynarrs, and
use them in place of specially-crafted staticpro descriptions.
Mule-ize certain other functions (e.g. x_event_name) by correcting
raw use of char * to Ascbyte *, Rawbyte * or another such type,
and raw use of char[] buffers to another type (usually Ascbyte[]).
Change many uses of write_c_string() to write_msg_string(),
write_ascstring(), etc.
Mule-ize emodules.c, emodules.h, sysdll.h.
Fix some un-Mule-ized code in intl-win32.c.
A comment in event-Xt.c and the limitations of the message
snarfer (make-msgfile or whatever) is presumably incorrect --
it should be smart enough to handle function calls spread over
more than one line. Clean up code in event-Xt.c that was
written awkwardly for this reason.
In config.h.in, instead of NEED_ERROR_CHECK_TYPES_INLINES,
create a more general XEMACS_DEFS_NEEDS_INLINE_DECLS to
indicate when inlined functions need to be declared in
xemacs.defs.in.in, and make use of it in xemacs.defs.in.in.
We need to do this because postgresql.c now calls qxestrdup(),
which is an inline function.
Make nconc2() and other such functions MODULE_API and put
them in xemacs.defs.in.in since postgresql.c now uses them.
Clean up indentation in lread.c and a few other places.
In text.h, document ASSERT_ASCTEXT_ASCII() and
ASSERT_ASCTEXT_ASCII_LEN(), group together the stand-in
encodings and add some more for DLL symbols, function and
variable names, etc.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Tue, 26 Jan 2010 23:22:30 -0600 |
parents | 374186f156d5 |
children | 304aebb79cd3 |
rev | line source |
---|---|
428 | 1 /* Console functions for X windows. |
793 | 2 Copyright (C) 1996, 2002 Ben Wing. |
428 | 3 |
4 This file is part of XEmacs. | |
5 | |
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 | |
9 later version. | |
10 | |
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 | |
14 for more details. | |
15 | |
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. */ | |
20 | |
21 /* Synched up with: Not in FSF. */ | |
22 | |
442 | 23 /* This file Mule-ized by Ben Wing, 7-10-00. */ |
24 | |
428 | 25 /* Authorship: |
26 | |
27 Ben Wing: January 1996, for 19.14. | |
28 */ | |
29 | |
30 #include <config.h> | |
31 #include "lisp.h" | |
32 | |
442 | 33 #include "buffer.h" |
2828 | 34 #include "device.h" |
35 #include "elhash.h" | |
428 | 36 #include "process.h" /* canonicalize_host_name */ |
37 #include "redisplay.h" /* for display_arg */ | |
38 | |
2828 | 39 #include "device-impl.h" |
872 | 40 #include "console-x-impl.h" |
41 | |
428 | 42 DEFINE_CONSOLE_TYPE (x); |
43 | |
3381 | 44 int wedge_metacity; /* nonzero means update WM_HINTS always */ |
45 | |
2828 | 46 extern void x_has_keysym (KeySym, Lisp_Object, int); |
47 | |
428 | 48 static int |
2286 | 49 x_initially_selected_for_input (struct console *UNUSED (con)) |
428 | 50 { |
51 return 1; | |
52 } | |
53 | |
444 | 54 /* Parse a DISPLAY specification like "host:10.0" or ":0" */ |
428 | 55 static void |
56 split_up_display_spec (Lisp_Object display, int *hostname_length, | |
57 int *display_length, int *screen_length) | |
58 { | |
867 | 59 Ibyte *beg = XSTRING_DATA (display); |
60 Ibyte *end = beg + XSTRING_LENGTH (display); | |
61 Ibyte *p = end; | |
428 | 62 |
444 | 63 while (p > beg) |
428 | 64 { |
867 | 65 DEC_IBYTEPTR (p); |
66 if (itext_ichar (p) == ':') | |
444 | 67 { |
68 *hostname_length = p - beg; | |
428 | 69 |
444 | 70 while (p < end - 1) |
71 { | |
867 | 72 INC_IBYTEPTR (p); |
73 if (itext_ichar (p) == '.') | |
444 | 74 { |
75 *display_length = p - beg - *hostname_length; | |
76 *screen_length = end - p; | |
77 return; | |
78 } | |
79 } | |
80 /* No '.' found. */ | |
81 *display_length = XSTRING_LENGTH (display) - *hostname_length; | |
82 *screen_length = 0; | |
83 return; | |
84 } | |
428 | 85 } |
86 | |
444 | 87 /* No ':' found. */ |
88 *hostname_length = XSTRING_LENGTH (display); | |
89 *display_length = 0; | |
90 *screen_length = 0; | |
428 | 91 } |
92 | |
93 /* Remember, in all of the following functions, we have to verify | |
94 the integrity of our input, because the generic functions don't. */ | |
95 | |
96 static Lisp_Object | |
578 | 97 x_device_to_console_connection (Lisp_Object connection, Error_Behavior errb) |
428 | 98 { |
99 /* Strip the trailing .# off of the connection, if it's there. */ | |
100 | |
101 if (NILP (connection)) | |
102 return Qnil; | |
103 else | |
104 { | |
105 int hostname_length, display_length, screen_length; | |
106 | |
107 if (!ERRB_EQ (errb, ERROR_ME)) | |
108 { | |
109 if (!STRINGP (connection)) | |
110 return Qunbound; | |
111 } | |
112 else | |
113 CHECK_STRING (connection); | |
114 | |
115 split_up_display_spec (connection, &hostname_length, &display_length, | |
116 &screen_length); | |
117 connection = make_string (XSTRING_DATA (connection), | |
118 hostname_length + display_length); | |
119 } | |
120 | |
121 return connection; | |
122 } | |
123 | |
124 static Lisp_Object | |
125 get_display_arg_connection (void) | |
126 { | |
442 | 127 const Extbyte *disp_name; |
428 | 128 |
129 /* If the user didn't explicitly specify a display to use when | |
130 they called make-x-device, then we first check to see if a | |
131 display was specified on the command line with -display. If | |
132 so, we set disp_name to it. Otherwise we use XDisplayName to | |
133 see what DISPLAY is set to. XtOpenDisplay knows how to do | |
134 both of these things, but we need to know the name to use. */ | |
135 if (display_arg) | |
136 { | |
137 int elt; | |
138 int argc; | |
442 | 139 Extbyte **argv; |
428 | 140 Lisp_Object conn; |
141 | |
142 make_argc_argv (Vx_initial_argv_list, &argc, &argv); | |
143 | |
144 disp_name = NULL; | |
145 for (elt = 0; elt < argc; elt++) | |
146 { | |
147 if (!strcmp (argv[elt], "-d") || !strcmp (argv[elt], "-display")) | |
148 { | |
149 if (elt + 1 == argc) | |
150 { | |
151 suppress_early_error_handler_backtrace = 1; | |
563 | 152 invalid_argument ("-display specified with no arg", Qunbound); |
428 | 153 } |
154 else | |
155 { | |
156 disp_name = argv[elt + 1]; | |
157 break; | |
158 } | |
159 } | |
160 } | |
161 | |
162 /* assert: display_arg is only set if we found the display | |
163 arg earlier so we can't fail to find it now. */ | |
164 assert (disp_name != NULL); | |
442 | 165 conn = build_ext_string (disp_name, Qcommand_argument_encoding); |
428 | 166 free_argc_argv (argv); |
167 return conn; | |
168 } | |
169 else | |
442 | 170 return build_ext_string (XDisplayName (0), Qx_display_name_encoding); |
428 | 171 } |
172 | |
173 /* "semi-canonicalize" means convert to a nicer form for printing, but | |
174 don't completely canonicalize (into some likely ugly form) */ | |
175 | |
176 static Lisp_Object | |
177 x_semi_canonicalize_console_connection (Lisp_Object connection, | |
578 | 178 Error_Behavior errb) |
428 | 179 { |
180 struct gcpro gcpro1; | |
181 | |
182 GCPRO1 (connection); | |
183 | |
184 if (NILP (connection)) | |
185 connection = get_display_arg_connection (); | |
186 else | |
187 { | |
188 if (!ERRB_EQ (errb, ERROR_ME)) | |
189 { | |
190 if (!STRINGP (connection)) | |
191 RETURN_UNGCPRO (Qunbound); | |
192 } | |
193 else | |
194 CHECK_STRING (connection); | |
195 } | |
196 | |
197 | |
198 /* Be lenient, allow people to specify a device connection instead of | |
199 a console connection -- e.g. "foo:0.0" instead of "foo:0". This | |
200 only happens in `find-console' and `get-console'. */ | |
201 connection = x_device_to_console_connection (connection, errb); | |
202 | |
203 /* Check for a couple of standard special cases */ | |
867 | 204 if (string_ichar (connection, 0) == ':') |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
3381
diff
changeset
|
205 connection = concat2 (build_ascstring ("localhost"), connection); |
444 | 206 else |
207 { | |
208 /* connection =~ s/^unix:/localhost:/; */ | |
867 | 209 const Ibyte *p = XSTRING_DATA (connection); |
210 const Ibyte *end = XSTRING_DATA (connection) + XSTRING_LENGTH (connection); | |
647 | 211 int i; |
444 | 212 |
647 | 213 for (i = 0; i < (int) sizeof ("unix:") - 1; i++) |
444 | 214 { |
867 | 215 if (p == end || itext_ichar (p) != "unix:"[i]) |
444 | 216 goto ok; |
867 | 217 INC_IBYTEPTR (p); |
444 | 218 } |
219 | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
3381
diff
changeset
|
220 connection = concat2 (build_ascstring ("localhost:"), |
444 | 221 make_string (p, end - p)); |
222 } | |
223 ok: | |
428 | 224 |
225 RETURN_UNGCPRO (connection); | |
226 } | |
227 | |
228 static Lisp_Object | |
578 | 229 x_canonicalize_console_connection (Lisp_Object connection, Error_Behavior errb) |
428 | 230 { |
231 Lisp_Object hostname = Qnil; | |
232 struct gcpro gcpro1, gcpro2; | |
233 | |
234 GCPRO2 (connection, hostname); | |
235 | |
236 connection = x_semi_canonicalize_console_connection (connection, errb); | |
237 if (UNBOUNDP (connection)) | |
238 RETURN_UNGCPRO (Qunbound); | |
239 | |
240 { | |
241 int hostname_length, display_length, screen_length; | |
242 | |
243 split_up_display_spec (connection, &hostname_length, &display_length, | |
244 &screen_length); | |
245 hostname = Fsubstring (connection, Qzero, make_int (hostname_length)); | |
246 hostname = canonicalize_host_name (hostname); | |
247 connection = concat2 (hostname, | |
248 make_string (XSTRING_DATA (connection) | |
249 + hostname_length, display_length)); | |
250 } | |
251 | |
252 RETURN_UNGCPRO (connection); | |
253 } | |
254 | |
255 static Lisp_Object | |
256 x_semi_canonicalize_device_connection (Lisp_Object connection, | |
578 | 257 Error_Behavior errb) |
428 | 258 { |
259 int hostname_length, display_length, screen_length; | |
260 struct gcpro gcpro1; | |
261 | |
262 GCPRO1 (connection); | |
263 if (NILP (connection)) | |
264 connection = get_display_arg_connection (); | |
265 else | |
266 { | |
267 if (!ERRB_EQ (errb, ERROR_ME)) | |
268 { | |
269 if (!STRINGP (connection)) | |
270 RETURN_UNGCPRO (Qunbound); | |
271 } | |
272 else | |
273 CHECK_STRING (connection); | |
274 } | |
275 | |
276 split_up_display_spec (connection, &hostname_length, &display_length, | |
277 &screen_length); | |
278 | |
279 if (!screen_length) | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
3381
diff
changeset
|
280 connection = concat2 (connection, build_ascstring (".0")); |
428 | 281 RETURN_UNGCPRO (connection); |
282 } | |
283 | |
284 static Lisp_Object | |
578 | 285 x_canonicalize_device_connection (Lisp_Object connection, Error_Behavior errb) |
428 | 286 { |
287 int hostname_length, display_length, screen_length; | |
288 Lisp_Object screen_str = Qnil; | |
289 struct gcpro gcpro1, gcpro2; | |
290 | |
291 GCPRO2 (screen_str, connection); | |
292 connection = x_semi_canonicalize_device_connection (connection, errb); | |
293 if (UNBOUNDP (connection)) | |
294 RETURN_UNGCPRO (Qunbound); | |
295 | |
296 split_up_display_spec (connection, &hostname_length, &display_length, | |
297 &screen_length); | |
298 | |
444 | 299 screen_str = make_string (XSTRING_DATA (connection) |
300 + hostname_length + display_length, screen_length); | |
428 | 301 connection = x_canonicalize_console_connection (connection, errb); |
302 | |
303 RETURN_UNGCPRO (concat2 (connection, screen_str)); | |
304 } | |
305 | |
2828 | 306 /* Given a key, if it maps to a character and we weren't previously aware |
307 that it could be generated on console CON, and if it's unbound in the | |
308 global map, bind it to self-insert-command. Return Qt if the binding was | |
309 done; Qnil if not. */ | |
310 | |
311 static Lisp_Object | |
312 x_perhaps_init_unseen_key_defaults (struct console *con, Lisp_Object key) | |
313 { | |
314 KeySym xkeysym; | |
315 const Extbyte *keysym_ext; | |
316 Lisp_Object key_name, previous_binding = Qnil; | |
317 extern Lisp_Object Qcharacter_of_keysym, Vcurrent_global_map; | |
318 | |
319 /* Getting the device exactly right is not horrendously important; as long | |
320 as it's an X11 device it should be okay, because the global keymap (and | |
321 whether the key is bound) _is_ global, and any previously seen keysym | |
322 will already be bound, or not, in it. However, there is a corner case | |
323 where a symbol has been typed, and then explicitly unbound; if the next | |
324 event using that symbol comes in on some other frame, it'll get bound | |
325 again. This is not realistically an issue. */ | |
326 struct device *d = XDEVICE(con->selected_device); | |
327 | |
328 if (SYMBOLP (key)) | |
329 { | |
330 key_name = symbol_name(XSYMBOL(key)); | |
331 } | |
332 else | |
333 { | |
334 Ibyte buf[MAX_ICHAR_LEN + 1]; | |
335 CHECK_CHAR(key); | |
336 | |
337 buf[set_itext_ichar(buf, XCHAR(key))] = '\0'; | |
2837 | 338 key_name = build_intstring (buf); |
2828 | 339 |
340 /* We need to do the lookup and compare later, because we can't check | |
341 the Qcharacter_of_keysym property belonging to an actual character. */ | |
342 previous_binding = Flookup_key (Vcurrent_global_map, key, Qnil); | |
343 } | |
344 | |
345 if (!NILP(Fgethash(key, DEVICE_X_KEYSYM_MAP_HASH_TABLE (d), Qnil))) | |
346 { | |
347 return Qnil; | |
348 } | |
349 | |
350 LISP_STRING_TO_EXTERNAL (key_name, keysym_ext, Qctext); | |
351 xkeysym = XStringToKeysym(keysym_ext); | |
352 if (NoSymbol == xkeysym) | |
353 { | |
3142 | 354 /* Keysym is NoSymbol; this may mean the key event passed to us came |
355 from an input method, which stored the actual character intended to | |
356 be inserted in the key name, and didn't trouble itself to set the | |
357 keycode to anything useful. Thus, if the key name is a single | |
358 character, and the keysym is NoSymbol, give it a default binding, | |
359 if that is possible. */ | |
360 Lisp_Object keychar; | |
361 | |
362 if (1 != string_char_length(key_name)) | |
363 { | |
364 /* Don't let them pass us more than one character. */ | |
365 return Qnil; | |
366 } | |
367 keychar = make_char(itext_ichar(XSTRING_DATA(key_name))); | |
368 if (NILP (Flookup_key (Vcurrent_global_map, keychar, Qnil))) | |
369 { | |
370 Fdefine_key (Vcurrent_global_map, keychar, Qself_insert_command); | |
371 Fputhash (keychar, Qt, DEVICE_X_KEYSYM_MAP_HASH_TABLE (d)); | |
372 return Qt; | |
373 } | |
2828 | 374 return Qnil; |
375 } | |
376 | |
377 x_has_keysym(xkeysym, DEVICE_X_KEYSYM_MAP_HASH_TABLE (d), 0); | |
378 | |
379 if (SYMBOLP(key)) | |
380 { | |
381 return NILP(Fget (key, Qcharacter_of_keysym, Qnil)) ? Qnil : Qt; | |
382 } | |
383 else | |
384 { | |
385 return EQ(previous_binding, Flookup_key(Vcurrent_global_map, key, Qnil)) | |
386 ? Qnil : Qt; | |
387 } | |
388 } | |
389 | |
428 | 390 void |
391 console_type_create_x (void) | |
392 { | |
393 INITIALIZE_CONSOLE_TYPE (x, "x", "console-x-p"); | |
394 | |
395 CONSOLE_HAS_METHOD (x, semi_canonicalize_console_connection); | |
396 CONSOLE_HAS_METHOD (x, canonicalize_console_connection); | |
397 CONSOLE_HAS_METHOD (x, semi_canonicalize_device_connection); | |
398 CONSOLE_HAS_METHOD (x, canonicalize_device_connection); | |
399 CONSOLE_HAS_METHOD (x, device_to_console_connection); | |
400 CONSOLE_HAS_METHOD (x, initially_selected_for_input); | |
2828 | 401 CONSOLE_HAS_METHOD (x, perhaps_init_unseen_key_defaults); |
428 | 402 } |
403 | |
404 | |
405 void | |
3381 | 406 vars_of_console_x (void) |
407 { | |
408 DEFVAR_BOOL ("wedge-metacity", &wedge_metacity /* | |
409 When non-nil, frame geometry management is backward-compatible. | |
410 This is known to create inflooping window jitter in metacity, et al. | |
411 It also does not conform to Xt conventions for geometry management. | |
412 Specifically, all frame resizes, XEmacs-initiated or not, update WM_HINTS. | |
413 Furthermore, geometry changes occur in the widget resize method. | |
414 | |
415 The default is nil. This probably gives correct behavior regardless of the | |
416 window manager used. | |
417 This variable is deprecated and will be removed. | |
418 */ ); | |
419 } | |
420 | |
421 void | |
428 | 422 reinit_console_type_create_x (void) |
423 { | |
424 REINITIALIZE_CONSOLE_TYPE (x); | |
425 } |