Mercurial > hg > xemacs-beta
annotate src/objects-tty.c @ 2367:ecf1ebac70d8
[xemacs-hg @ 2004-11-04 23:05:23 by ben]
commit mega-patch
configure.in: Turn off -Winline and -Wchar-subscripts.
Use the right set of cflags when compiling modules.
Rewrite ldap configuration to separate the inclusion of lber
(needed in recent Cygwin) from the basic checks for the
needed libraries.
add a function for MAKE_JUNK_C; initially code was added to
generate xemacs.def using this, but it will need to be rewritten.
add an rm -f for junk.c to avoid weird Cygwin bug with cp -f onto
an existing file.
Sort list of auto-detected functions and eliminate unused checks for
stpcpy, setlocale and getwd.
Add autodetection of Cygwin scanf problems
BETA: Rewrite section on configure to indicate what flags are important
and what not.
digest-doc.c, make-dump-id.c, profile.c, sorted-doc.c: Add proper decls for main().
make-msgfile.c: Document that this is old junk.
Move proposal to text.c.
make-msgfile.lex: Move proposal to text.c.
make-mswin-unicode.pl: Convert error-generating code so that the entire message will
be seen as a single unrecognized token.
mule/mule-ccl.el: Update docs.
lispref/mule.texi: Update CCL docs.
ldap/eldap.c: Mule-ize.
Use EXTERNAL_LIST_LOOP_2 instead of deleted EXTERNAL_LIST_LOOP.
* XEmacs 21.5.18 "chestnut" is released.
---------------------------------------------------------------
MULE-RELATED WORK:
---------------------------------------------------------------
---------------------------
byte-char conversion
---------------------------
buffer.c, buffer.h, insdel.c, text.c: Port FSF algorithm for byte-char conversion, replacing broken
previous version. Track the char position of the gap. Add
functions to do char-byte conversion downwards as well as upwards.
Move comments about algorithm workings to internals manual.
---------------------------
work on types
---------------------------
alloc.c, console-x-impl.h, dump-data.c, dump-data.h, dumper.c, dialog-msw.c, dired-msw.c, doc.c, editfns.c, esd.c, event-gtk.h, event-msw.c, events.c, file-coding.c, file-coding.h, fns.c, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-shared.c, glyphs-x.c, glyphs.c, glyphs.h, gui.c, hpplay.c, imgproc.c, intl-win32.c, lrecord.h, lstream.c, keymap.c, lisp.h, libsst.c, linuxplay.c, miscplay.c, miscplay.h, mule-coding.c, nas.c, nt.c, ntheap.c, ntplay.c, objects-msw.c, objects-tty.c, objects-x.c, print.c, process-nt.c, process.c, redisplay.h, select-common.h, select-gtk.c, select-x.c, sgiplay.c, sound.c, sound.h, sunplay.c, sysfile.h, sysdep.c, syswindows.h, text.c, unexnt.c, win32.c, xgccache.c: Further work on types. This creates a full set of types for all
the basic semantics of `char' that I have so far identified, so that
its semantics can always be identified for the purposes of proper
Mule-safe code, and the raw use of `char' always avoided.
(1) More type renaming, for consistency of naming.
Char_ASCII -> Ascbyte
UChar_ASCII -> UAscbyte
Char_Binary -> CBinbyte
UChar_Binary -> Binbyte
SChar_Binary -> SBinbyte
(2) Introduce Rawbyte, CRawbyte, Boolbyte, Chbyte, UChbyte, and
Bitbyte and use them.
(3) New types Itext, Wexttext and Textcount for separating out
the concepts of bytes and textual units (different under UTF-16
and UTF-32, which are potential internal encodings).
(4) qxestr*_c -> qxestr*_ascii.
lisp.h: New; goes with other qxe() functions. #### Maybe goes in a
different section.
lisp.h: Group generic int-type defs together with EMACS_INT defs.
lisp.h: * lisp.h (WEXTTEXT_IS_WIDE)
New defns.
lisp.h: New type to replace places where int occurs as a boolean.
It's signed because occasionally people may want to use -1 as
an error value, and because unsigned ints are viral -- see comments
in the internals manual against using them.
dynarr.c: int -> Bytecount.
---------------------------
Mule-izing
---------------------------
device-x.c: Partially Mule-ize.
dumper.c, dumper.h: Mule-ize. Use Rawbyte. Use stderr_out not printf. Use wext_*().
sysdep.c, syswindows.h, text.c: New Wexttext API for manipulation of external text that may be
Unicode (e.g. startup code under Windows).
emacs.c: Mule-ize. Properly deal with argv in external encoding.
Use wext_*() and Wexttext. Use Rawbyte.
#if 0 some old junk on SCO that is unlikely to be correct.
Rewrite allocation code in run-temacs.
emacs.c, symsinit.h, win32.c: Rename win32 init function and call it even earlier, to
initialize mswindows_9x_p even earlier, for use in startup code
(XEUNICODE_P).
process.c: Use _wenviron not environ under Windows, to get Unicode environment
variables.
event-Xt.c: Mule-ize drag-n-drop related stuff.
dragdrop.c, dragdrop.h, frame-x.c: Mule-ize.
text.h: Add some more stand-in defines for particular kinds of conversion;
use in Mule-ization work in frame-x.c etc.
---------------------------
Freshening
---------------------------
intl-auto-encap-win32.c, intl-auto-encap-win32.h: Regenerate.
---------------------------
Unicode-work
---------------------------
intl-win32.c, syswindows.h: Factor out common options to MultiByteToWideChar and
WideCharToMultiByte. Add convert_unicode_to_multibyte_malloc()
and convert_unicode_to_multibyte_dynarr() and use. Add stuff for
alloca() conversion of multibyte/unicode.
alloc.c: Use dfc_external_data_len() in case of unicode coding system.
alloc.c, mule-charset.c: Don't zero out and reinit charset Unicode tables. This fucks up
dump-time loading. Anyway, either we load them at dump time or
run time, never both.
unicode.c: Dump the blank tables as well.
---------------------------------------------------------------
DOCUMENTATION, MOSTLY MULE-RELATED:
---------------------------------------------------------------
EmacsFrame.c, emodules.c, event-Xt.c, fileio.c, input-method-xlib.c, mule-wnnfns.c, redisplay-gtk.c, redisplay-tty.c, redisplay-x.c, regex.c, sysdep.c: Add comment about Mule work needed.
text.h: Add more documentation describing why DFC routines were not written
to return their value. Add some other DFC documentation.
console-msw.c, console-msw.h: Add pointer to docs in win32.c.
emacs.c: Add comments on sources of doc info.
text.c, charset.h, unicode.c, intl-win32.c, intl-encap-win32.c, text.h, file-coding.c, mule-coding.c: Collect background comments and related to text matters and
internationalization, and proposals for work to be done, in text.c
or Internals manual, stuff related to specific textual API's in
text.h, and stuff related to internal implementation of Unicode
conversion in unicode.c. Put lots of pointers to the comments to
make them easier to find.
s/mingw32.h, s/win32-common.h, s/win32-native.h, s/windowsnt.h, win32.c: Add bunches of new documentation on the different kinds of
builds and environments under Windows and how they work.
Collect this info in win32.c. Add pointers to these docs in
the relevant s/* files.
emacs.c: Document places with long comments.
Remove comment about exiting, move to internals manual, put
in pointer.
event-stream.c: Move docs about event queues and focus to internals manual, put
in pointer.
events.h: Move docs about event stream callbacks to internals manual, put
in pointer.
profile.c, redisplay.c, signal.c: Move documentation to the Internals manual.
process-nt.c: Add pointer to comment in win32-native.el.
lisp.h: Add comments about some comment conventions.
lisp.h: Add comment about the second argument.
device-msw.c, redisplay-msw.c: @@#### comments are out-of-date.
---------------------------------------------------------------
PDUMP WORK (MOTIVATED BY UNICODE CHANGES)
---------------------------------------------------------------
alloc.c, buffer.c, bytecode.c, console-impl.h, console.c, device.c, dumper.c, lrecord.h, elhash.c, emodules.h, events.c, extents.c, frame.c, glyphs.c, glyphs.h, mule-charset.c, mule-coding.c, objects.c, profile.c, rangetab.c, redisplay.c, specifier.c, specifier.h, window.c, lstream.c, file-coding.h, file-coding.c: PDUMP:
Properly implement dump_add_root_block(), which never worked before,
and is necessary for dumping Unicode tables.
Pdump name changes for accuracy:
XD_STRUCT_PTR -> XD_BLOCK_PTR.
XD_STRUCT_ARRAY -> XD_BLOCK_ARRAY.
XD_C_STRING -> XD_ASCII_STRING.
*_structure_* -> *_block_*.
lrecord.h: some comments added about
dump_add_root_block() vs dump_add_root_block_ptr().
extents.c: remove incorrect comment about pdump problems with gap array.
---------------------------------------------------------------
ALLOCATION
---------------------------------------------------------------
abbrev.c, alloc.c, bytecode.c, casefiddle.c, device-msw.c, device-x.c, dired-msw.c, doc.c, doprnt.c, dragdrop.c, editfns.c, emodules.c, file-coding.c, fileio.c, filelock.c, fns.c, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-x.c, gui-msw.c, gui-x.c, imgproc.c, intl-win32.c, lread.c, menubar-gtk.c, menubar.c, nt.c, objects-msw.c, objects-x.c, print.c, process-nt.c, process-unix.c, process.c, realpath.c, redisplay.c, search.c, select-common.c, symbols.c, sysdep.c, syswindows.h, text.c, text.h, ui-byhand.c: New macros {alloca,xnew}_{itext,{i,ext,raw,bin,asc}bytes} for
more convenient allocation of these commonly requested items.
Modify functions to use alloca_ibytes, alloca_array, alloca_extbytes,
xnew_ibytes, etc. also XREALLOC_ARRAY, xnew.
alloc.c: Rewrite the allocation functions to factor out repeated code.
Add assertions for freeing dumped data.
lisp.h: Moved down and consolidated with other allocation stuff.
lisp.h, dynarr.c: New functions for allocation that's very efficient when mostly in
LIFO order.
lisp.h, text.c, text.h: Factor out some stuff for general use by alloca()-conversion funs.
text.h, lisp.h: Fill out convenience routines for allocating various kinds of
bytes and put them in lisp.h. Use them in place of xmalloc(),
ALLOCA().
text.h: Fill out the convenience functions so the _MALLOC() kinds match
the alloca() kinds.
---------------------------------------------------------------
ERROR-CHECKING
---------------------------------------------------------------
text.h: Create ASSERT_ASCTEXT_ASCII() and ASSERT_ASCTEXT_ASCII_LEN()
from similar Eistring checkers and change the Eistring checkers to
use them instead.
---------------------------------------------------------------
MACROS IN LISP.H
---------------------------------------------------------------
lisp.h: Redo GCPRO declarations. Create a "base" set of functions that can
be used to generate any kind of gcpro sets -- regular, ngcpro,
nngcpro, private ones used in GC_EXTERNAL_LIST_LOOP_2.
buffer.c, callint.c, chartab.c, console-msw.c, device-x.c, dialog-msw.c, dired.c, extents.c, ui-gtk.c, rangetab.c, nt.c, mule-coding.c, minibuf.c, menubar-msw.c, menubar.c, menubar-gtk.c, lread.c, lisp.h, gutter.c, glyphs.c, glyphs-widget.c, fns.c, fileio.c, file-coding.c, specifier.c: Eliminate EXTERNAL_LIST_LOOP, which does not check for circularities.
Use EXTERNAL_LIST_LOOP_2 instead or EXTERNAL_LIST_LOOP_3
or EXTERNAL_PROPERTY_LIST_LOOP_3 or GC_EXTERNAL_LIST_LOOP_2
(new macro). Removed/redid comments on EXTERNAL_LIST_LOOP.
---------------------------------------------------------------
SPACING FIXES
---------------------------------------------------------------
callint.c, hftctl.c, number-gmp.c, process-unix.c: Spacing fixes.
---------------------------------------------------------------
FIX FOR GEOMETRY PROBLEM IN FIRST FRAME
---------------------------------------------------------------
unicode.c: Add workaround for newlib bug in sscanf() [should be fixed by
release 1.5.12 of Cygwin].
toolbar.c: bug fix for problem of initial frame being 77 chars wide on Windows.
will be overridden by my other ws.
---------------------------------------------------------------
FIX FOR LEAKING PROCESS HANDLES:
---------------------------------------------------------------
process-nt.c: Fixes for leaking handles. Inspired by work done by Adrian Aichner
<adrian@xemacs.org>.
---------------------------------------------------------------
FIX FOR CYGWIN BUG (Unicode-related):
---------------------------------------------------------------
unicode.c: Add workaround for newlib bug in sscanf() [should be fixed by
release 1.5.12 of Cygwin].
---------------------------------------------------------------
WARNING FIXES:
---------------------------------------------------------------
console-stream.c: `reinit' is unused.
compiler.h, event-msw.c, frame-msw.c, intl-encap-win32.c, text.h: Add stuff to deal with ANSI-aliasing warnings I got.
regex.c: Gather includes together to avoid warning.
---------------------------------------------------------------
CHANGES TO INITIALIZATION ROUTINES:
---------------------------------------------------------------
buffer.c, emacs.c, console.c, debug.c, device-x.c, device.c, dragdrop.c, emodules.c, eval.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, events.c, extents.c, faces.c, file-coding.c, fileio.c, font-lock.c, frame-msw.c, glyphs-widget.c, glyphs.c, gui-x.c, insdel.c, lread.c, lstream.c, menubar-gtk.c, menubar-x.c, minibuf.c, mule-wnnfns.c, objects-msw.c, objects.c, print.c, scrollbar-x.c, search.c, select-x.c, text.c, undo.c, unicode.c, window.c, symsinit.h: Call reinit_*() functions directly from emacs.c, for clarity.
Factor out some redundant init code. Move disallowed stuff
that had crept into vars_of_glyphs() into complex_vars_of_glyphs().
Call init_eval_semi_early() from eval.c not in the middle of
vars_of_() in emacs.c since there should be no order dependency
in the latter calls.
---------------------------------------------------------------
ARMAGEDDON:
---------------------------------------------------------------
alloc.c, emacs.c, lisp.h, print.c: Rename inhibit_non_essential_printing_operations to
inhibit_non_essential_conversion_operations.
text.c: Assert on !inhibit_non_essential_conversion_operations.
console-msw.c, print.c: Don't do conversion in SetConsoleTitle or FindWindow to avoid
problems during armageddon. Put #errors for NON_ASCII_INTERNAL_FORMAT
in places where problems would arise.
---------------------------------------------------------------
CHANGES TO THE BUILD PROCEDURE:
---------------------------------------------------------------
config.h.in, s/cxux.h, s/usg5-4-2.h, m/powerpc.h: Add comment about correct ordering of this file.
Rearrange everything to follow this -- put all #undefs together
and before the s&m files. Add undefs for HAVE_ALLOCA, C_ALLOCA,
BROKEN_ALLOCA_IN_FUNCTION_CALLS, STACK_DIRECTION. Remove unused
HAVE_STPCPY, HAVE_GETWD, HAVE_SETLOCALE.
m/gec63.h: Deleted; totally broken, not used at all, not in FSF.
m/7300.h, m/acorn.h, m/alliant-2800.h, m/alliant.h, m/altos.h, m/amdahl.h, m/apollo.h, m/att3b.h, m/aviion.h, m/celerity.h, m/clipper.h, m/cnvrgnt.h, m/convex.h, m/cydra5.h, m/delta.h, m/delta88k.h, m/dpx2.h, m/elxsi.h, m/ews4800r.h, m/gould.h, m/hp300bsd.h, m/hp800.h, m/hp9000s300.h, m/i860.h, m/ibmps2-aix.h, m/ibmrs6000.h, m/ibmrt-aix.h, m/ibmrt.h, m/intel386.h, m/iris4d.h, m/iris5d.h, m/iris6d.h, m/irist.h, m/isi-ov.h, m/luna88k.h, m/m68k.h, m/masscomp.h, m/mg1.h, m/mips-nec.h, m/mips-siemens.h, m/mips.h, m/news.h, m/nh3000.h, m/nh4000.h, m/ns32000.h, m/orion105.h, m/pfa50.h, m/plexus.h, m/pmax.h, m/powerpc.h, m/pyrmips.h, m/sequent-ptx.h, m/sequent.h, m/sgi-challenge.h, m/symmetry.h, m/tad68k.h, m/tahoe.h, m/targon31.h, m/tekxd88.h, m/template.h, m/tower32.h, m/tower32v3.h, m/ustation.h, m/vax.h, m/wicat.h, m/xps100.h: Delete C_ALLOCA, HAVE_ALLOCA, STACK_DIRECTION,
BROKEN_ALLOCA_IN_FUNCTION_CALLS. All of this is auto-detected.
When in doubt, I followed recent FSF sources, which also have
these things deleted.
author | ben |
---|---|
date | Thu, 04 Nov 2004 23:08:28 +0000 |
parents | 04bc9d2f42c7 |
children | de9952d2ed18 |
rev | line source |
---|---|
428 | 1 /* TTY-specific Lisp objects. |
2 Copyright (C) 1995 Board of Trustees, University of Illinois. | |
793 | 3 Copyright (C) 1995, 1996, 2001, 2002 Ben Wing. |
428 | 4 |
5 This file is part of XEmacs. | |
6 | |
7 XEmacs is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
11 | |
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with XEmacs; see the file COPYING. If not, write to | |
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
20 Boston, MA 02111-1307, USA. */ | |
21 | |
22 /* Synched up with: Not in FSF. */ | |
23 | |
24 #include <config.h> | |
25 #include "lisp.h" | |
26 | |
872 | 27 #include "console-tty-impl.h" |
428 | 28 #include "insdel.h" |
872 | 29 #include "objects-tty-impl.h" |
428 | 30 #include "device.h" |
771 | 31 #include "charset.h" |
428 | 32 |
33 /* An alist mapping from color names to a cons of (FG-STRING, BG-STRING). */ | |
34 Lisp_Object Vtty_color_alist; | |
35 #if 0 /* This stuff doesn't quite work yet */ | |
36 Lisp_Object Vtty_dynamic_color_fg; | |
37 Lisp_Object Vtty_dynamic_color_bg; | |
38 #endif | |
39 | |
1204 | 40 static const struct memory_description tty_color_instance_data_description_1 [] = { |
41 { XD_LISP_OBJECT, offsetof (struct tty_color_instance_data, symbol) }, | |
42 { XD_END } | |
43 }; | |
44 | |
45 const struct sized_memory_description tty_color_instance_data_description = { | |
46 sizeof (struct tty_color_instance_data), tty_color_instance_data_description_1 | |
47 }; | |
48 | |
49 static const struct memory_description tty_font_instance_data_description_1 [] = { | |
50 { XD_LISP_OBJECT, offsetof (struct tty_font_instance_data, charset) }, | |
51 { XD_END } | |
52 }; | |
53 | |
54 const struct sized_memory_description tty_font_instance_data_description = { | |
55 sizeof (struct tty_font_instance_data), tty_font_instance_data_description_1 | |
56 }; | |
57 | |
428 | 58 DEFUN ("register-tty-color", Fregister_tty_color, 3, 3, 0, /* |
59 Register COLOR as a recognized TTY color. | |
60 COLOR should be a string. | |
61 Strings FG-STRING and BG-STRING should specify the escape sequences to | |
62 set the foreground and background to the given color, respectively. | |
63 */ | |
64 (color, fg_string, bg_string)) | |
65 { | |
66 CHECK_STRING (color); | |
67 CHECK_STRING (fg_string); | |
68 CHECK_STRING (bg_string); | |
69 | |
70 color = Fintern (color, Qnil); | |
71 Vtty_color_alist = Fremassq (color, Vtty_color_alist); | |
72 Vtty_color_alist = Fcons (Fcons (color, Fcons (fg_string, bg_string)), | |
73 Vtty_color_alist); | |
74 | |
75 return Qnil; | |
76 } | |
77 | |
78 DEFUN ("unregister-tty-color", Funregister_tty_color, 1, 1, 0, /* | |
79 Unregister COLOR as a recognized TTY color. | |
80 */ | |
81 (color)) | |
82 { | |
83 CHECK_STRING (color); | |
84 | |
85 color = Fintern (color, Qnil); | |
86 Vtty_color_alist = Fremassq (color, Vtty_color_alist); | |
87 return Qnil; | |
88 } | |
89 | |
90 DEFUN ("find-tty-color", Ffind_tty_color, 1, 1, 0, /* | |
91 Look up COLOR in the list of registered TTY colors. | |
92 If it is found, return a list (FG-STRING BG-STRING) of the escape | |
93 sequences used to set the foreground and background to the color, respectively. | |
94 If it is not found, return nil. | |
95 */ | |
96 (color)) | |
97 { | |
98 Lisp_Object result; | |
99 | |
100 CHECK_STRING (color); | |
101 | |
102 result = Fassq (Fintern (color, Qnil), Vtty_color_alist); | |
103 if (!NILP (result)) | |
104 return list2 (Fcar (Fcdr (result)), Fcdr (Fcdr (result))); | |
105 else | |
106 return Qnil; | |
107 } | |
108 | |
109 DEFUN ("tty-color-list", Ftty_color_list, 0, 0, 0, /* | |
110 Return a list of the registered TTY colors. | |
111 */ | |
112 ()) | |
113 { | |
114 Lisp_Object result = Qnil; | |
115 Lisp_Object rest; | |
116 | |
117 LIST_LOOP (rest, Vtty_color_alist) | |
118 { | |
119 result = Fcons (Fsymbol_name (XCAR (XCAR (rest))), result); | |
120 } | |
121 | |
122 return Fnreverse (result); | |
123 } | |
124 | |
125 #if 0 | |
126 | |
127 /* This approach is too simplistic. The problem is that the | |
128 dynamic color settings apply to *all* text in the default color, | |
129 not just the text output after the escape sequence has been given. */ | |
130 | |
131 DEFUN ("set-tty-dynamic-color-specs", Fset_tty_dynamic_color_specs, 2, 2, 0, /* | |
132 Set the dynamic color specifications for TTY's. | |
133 FG and BG should be either nil or vaguely printf-like strings, | |
134 where each occurrence of %s is replaced with the color name and each | |
135 occurrence of %% is replaced with a single % character. | |
136 */ | |
137 (fg, bg)) | |
138 { | |
139 if (!NILP (fg)) | |
140 CHECK_STRING (fg); | |
141 if (!NILP (bg)) | |
142 CHECK_STRING (bg); | |
143 | |
144 Vtty_dynamic_color_fg = fg; | |
145 Vtty_dynamic_color_bg = bg; | |
146 | |
147 return Qnil; | |
148 } | |
149 | |
150 DEFUN ("tty-dynamic-color-specs", Ftty_dynamic_color_specs, 0, 0, 0, /* | |
151 Return the dynamic color specifications for TTY's as a list of (FG BG). | |
152 See `set-tty-dynamic-color-specs'. | |
153 */ | |
154 ()) | |
155 { | |
156 return list2 (Vtty_dynamic_color_fg, Vtty_dynamic_color_bg); | |
157 } | |
158 | |
159 #endif /* 0 */ | |
160 | |
161 static int | |
440 | 162 tty_initialize_color_instance (Lisp_Color_Instance *c, Lisp_Object name, |
2286 | 163 Lisp_Object UNUSED (device), |
164 Error_Behavior UNUSED (errb)) | |
428 | 165 { |
166 Lisp_Object result; | |
167 | |
168 name = Fintern (name, Qnil); | |
169 result = assq_no_quit (name, Vtty_color_alist); | |
170 | |
171 if (NILP (result)) | |
172 { | |
173 #if 0 | |
174 if (!STRINGP (Vtty_dynamic_color_fg) | |
175 && !STRINGP (Vtty_dynamic_color_bg)) | |
176 #endif | |
177 return 0; | |
178 } | |
179 | |
180 /* Don't allocate the data until we're sure that we will succeed. */ | |
181 c->data = xnew (struct tty_color_instance_data); | |
182 COLOR_INSTANCE_TTY_SYMBOL (c) = name; | |
183 | |
184 return 1; | |
185 } | |
186 | |
187 static void | |
440 | 188 tty_mark_color_instance (Lisp_Color_Instance *c) |
428 | 189 { |
190 mark_object (COLOR_INSTANCE_TTY_SYMBOL (c)); | |
191 } | |
192 | |
193 static void | |
2286 | 194 tty_print_color_instance (Lisp_Color_Instance *UNUSED (c), |
195 Lisp_Object UNUSED (printcharfun), | |
196 int UNUSED (escapeflag)) | |
428 | 197 { |
198 } | |
199 | |
200 static void | |
440 | 201 tty_finalize_color_instance (Lisp_Color_Instance *c) |
428 | 202 { |
203 if (c->data) | |
1726 | 204 xfree (c->data, void *); |
428 | 205 } |
206 | |
207 static int | |
440 | 208 tty_color_instance_equal (Lisp_Color_Instance *c1, |
209 Lisp_Color_Instance *c2, | |
2286 | 210 int UNUSED (depth)) |
428 | 211 { |
212 return (EQ (COLOR_INSTANCE_TTY_SYMBOL (c1), | |
213 COLOR_INSTANCE_TTY_SYMBOL (c2))); | |
214 } | |
215 | |
216 static unsigned long | |
2286 | 217 tty_color_instance_hash (Lisp_Color_Instance *c, int UNUSED (depth)) |
428 | 218 { |
219 return LISP_HASH (COLOR_INSTANCE_TTY_SYMBOL (c)); | |
220 } | |
221 | |
222 static int | |
2286 | 223 tty_valid_color_name_p (struct device *UNUSED (d), Lisp_Object color) |
428 | 224 { |
225 return (!NILP (assoc_no_quit (Fintern (color, Qnil), Vtty_color_alist))); | |
226 #if 0 | |
227 || STRINGP (Vtty_dynamic_color_fg) | |
228 || STRINGP (Vtty_dynamic_color_bg) | |
229 #endif | |
230 } | |
231 | |
232 | |
233 static int | |
440 | 234 tty_initialize_font_instance (Lisp_Font_Instance *f, Lisp_Object name, |
2286 | 235 Lisp_Object UNUSED (device), |
236 Error_Behavior UNUSED (errb)) | |
428 | 237 { |
867 | 238 Ibyte *str = XSTRING_DATA (name); |
428 | 239 Lisp_Object charset = Qnil; |
240 | |
2367 | 241 if (qxestrncmp_ascii (str, "normal", 6)) |
428 | 242 return 0; |
243 str += 6; | |
244 if (*str) | |
245 { | |
246 #ifdef MULE | |
247 if (*str != '/') | |
248 return 0; | |
249 str++; | |
771 | 250 charset = Ffind_charset (intern_int (str)); |
428 | 251 if (NILP (charset)) |
252 return 0; | |
253 #else | |
254 return 0; | |
255 #endif | |
256 } | |
257 | |
258 /* Don't allocate the data until we're sure that we will succeed. */ | |
259 f->data = xnew (struct tty_font_instance_data); | |
260 FONT_INSTANCE_TTY_CHARSET (f) = charset; | |
261 #ifdef MULE | |
262 if (CHARSETP (charset)) | |
263 f->width = XCHARSET_COLUMNS (charset); | |
264 else | |
265 #endif | |
266 f->width = 1; | |
267 | |
268 f->proportional_p = 0; | |
269 f->ascent = f->height = 1; | |
270 f->descent = 0; | |
271 | |
272 return 1; | |
273 } | |
274 | |
275 static void | |
440 | 276 tty_mark_font_instance (Lisp_Font_Instance *f) |
428 | 277 { |
278 mark_object (FONT_INSTANCE_TTY_CHARSET (f)); | |
279 } | |
280 | |
281 static void | |
2286 | 282 tty_print_font_instance (Lisp_Font_Instance *UNUSED (f), |
283 Lisp_Object UNUSED (printcharfun), | |
284 int UNUSED (escapeflag)) | |
428 | 285 { |
286 } | |
287 | |
288 static void | |
440 | 289 tty_finalize_font_instance (Lisp_Font_Instance *f) |
428 | 290 { |
291 if (f->data) | |
1726 | 292 xfree (f->data, void *); |
428 | 293 } |
294 | |
295 static Lisp_Object | |
2286 | 296 tty_list_fonts (Lisp_Object UNUSED (pattern), Lisp_Object UNUSED (device), |
297 Lisp_Object UNUSED (maxnumber)) | |
428 | 298 { |
299 return list1 (build_string ("normal")); | |
300 } | |
301 | |
302 #ifdef MULE | |
303 | |
304 static int | |
2286 | 305 tty_font_spec_matches_charset (struct device *UNUSED (d), Lisp_Object charset, |
867 | 306 const Ibyte *nonreloc, Lisp_Object reloc, |
872 | 307 Bytecount offset, Bytecount length, |
308 int stage) | |
428 | 309 { |
867 | 310 const Ibyte *the_nonreloc = nonreloc; |
428 | 311 |
872 | 312 if (stage) |
313 return 0; | |
314 | |
428 | 315 if (!the_nonreloc) |
316 the_nonreloc = XSTRING_DATA (reloc); | |
317 fixup_internal_substring (nonreloc, reloc, offset, &length); | |
318 the_nonreloc += offset; | |
319 | |
320 if (UNBOUNDP (charset)) | |
321 return !memchr (the_nonreloc, '/', length); | |
867 | 322 the_nonreloc = (const Ibyte *) memchr (the_nonreloc, '/', length); |
428 | 323 if (!the_nonreloc) |
324 return 0; | |
325 the_nonreloc++; | |
326 { | |
793 | 327 Lisp_Object s = symbol_name (XSYMBOL (XCHARSET_NAME (charset))); |
328 return !qxestrcmp (the_nonreloc, XSTRING_DATA (s)); | |
428 | 329 } |
330 } | |
331 | |
332 /* find a font spec that matches font spec FONT and also matches | |
333 (the registry of) CHARSET. */ | |
334 static Lisp_Object | |
335 tty_find_charset_font (Lisp_Object device, Lisp_Object font, | |
872 | 336 Lisp_Object charset, int stage) |
428 | 337 { |
867 | 338 Ibyte *fontname = XSTRING_DATA (font); |
428 | 339 |
872 | 340 if (stage) |
341 return Qnil; | |
342 | |
442 | 343 if (strchr ((const char *) fontname, '/')) |
428 | 344 { |
345 if (tty_font_spec_matches_charset (XDEVICE (device), charset, 0, | |
872 | 346 font, 0, -1, 0)) |
428 | 347 return font; |
348 return Qnil; | |
349 } | |
350 | |
351 if (UNBOUNDP (charset)) | |
352 return font; | |
353 | |
354 return concat3 (font, build_string ("/"), | |
355 Fsymbol_name (XCHARSET_NAME (charset))); | |
356 } | |
357 | |
358 #endif /* MULE */ | |
359 | |
360 | |
361 /************************************************************************/ | |
362 /* initialization */ | |
363 /************************************************************************/ | |
364 | |
365 void | |
366 syms_of_objects_tty (void) | |
367 { | |
368 DEFSUBR (Fregister_tty_color); | |
369 DEFSUBR (Funregister_tty_color); | |
370 DEFSUBR (Ffind_tty_color); | |
371 DEFSUBR (Ftty_color_list); | |
372 #if 0 | |
373 DEFSUBR (Fset_tty_dynamic_color_specs); | |
374 DEFSUBR (Ftty_dynamic_color_specs); | |
375 #endif | |
376 } | |
377 | |
378 void | |
379 console_type_create_objects_tty (void) | |
380 { | |
381 /* object methods */ | |
382 CONSOLE_HAS_METHOD (tty, initialize_color_instance); | |
383 CONSOLE_HAS_METHOD (tty, mark_color_instance); | |
384 CONSOLE_HAS_METHOD (tty, print_color_instance); | |
385 CONSOLE_HAS_METHOD (tty, finalize_color_instance); | |
386 CONSOLE_HAS_METHOD (tty, color_instance_equal); | |
387 CONSOLE_HAS_METHOD (tty, color_instance_hash); | |
388 CONSOLE_HAS_METHOD (tty, valid_color_name_p); | |
389 | |
390 CONSOLE_HAS_METHOD (tty, initialize_font_instance); | |
391 CONSOLE_HAS_METHOD (tty, mark_font_instance); | |
392 CONSOLE_HAS_METHOD (tty, print_font_instance); | |
393 CONSOLE_HAS_METHOD (tty, finalize_font_instance); | |
394 CONSOLE_HAS_METHOD (tty, list_fonts); | |
395 #ifdef MULE | |
396 CONSOLE_HAS_METHOD (tty, font_spec_matches_charset); | |
397 CONSOLE_HAS_METHOD (tty, find_charset_font); | |
398 #endif | |
399 } | |
400 | |
401 void | |
402 vars_of_objects_tty (void) | |
403 { | |
404 staticpro (&Vtty_color_alist); | |
405 Vtty_color_alist = Qnil; | |
406 | |
407 #if 0 | |
408 staticpro (&Vtty_dynamic_color_fg); | |
409 Vtty_dynamic_color_fg = Qnil; | |
410 | |
411 staticpro (&Vtty_dynamic_color_bg); | |
412 Vtty_dynamic_color_bg = Qnil; | |
413 #endif | |
414 } |