Mercurial > emacs
changeset 101775:250ce1fa6aed
Include coding.h and termhooks.h.
(composition_gstring_p): Fix for the terminal case.
(composition_gstring_width): Likewise.
(fill_gstring_body): Likewise.
(autocmp_chars): For terminal, call Fcomposition_get_gstring with
the frame.
(composition_compute_stop_pos): Adjust cmp_it->stop_pos if point
is within a composition.
(Fcomposition_get_gstring): Fix the the terminal case.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 04 Feb 2009 01:48:37 +0000 |
parents | d4f9e4244d5a |
children | 11ba351ce12b |
files | src/composite.c |
diffstat | 1 files changed, 36 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/composite.c Wed Feb 04 01:35:16 2009 +0000 +++ b/src/composite.c Wed Feb 04 01:48:37 2009 +0000 @@ -27,11 +27,14 @@ #include "lisp.h" #include "buffer.h" #include "character.h" +#include "coding.h" #include "intervals.h" #include "window.h" #include "frame.h" #include "dispextern.h" #include "font.h" +#include "termhooks.h" + /* Emacs uses special text property `composition' to support character composition. A sequence of characters that have the same (i.e. eq) @@ -723,7 +726,8 @@ if (! VECTORP (header) || ASIZE (header) < 2) return 0; if (! NILP (LGSTRING_FONT (gstring)) - && ! FONT_OBJECT_P (LGSTRING_FONT (gstring))) + && (! FONT_OBJECT_P (LGSTRING_FONT (gstring)) + && ! CODING_SYSTEM_P (LGSTRING_FONT (gstring)))) return 0; for (i = 1; i < ASIZE (LGSTRING_HEADER (gstring)); i++) if (! NATNUMP (AREF (LGSTRING_HEADER (gstring), i))) @@ -753,10 +757,19 @@ if (metrics) { Lisp_Object font_object = LGSTRING_FONT (gstring); - struct font *font = XFONT_OBJECT (font_object); + + if (FONT_OBJECT_P (font_object)) + { + struct font *font = XFONT_OBJECT (font_object); - metrics->ascent = font->ascent; - metrics->descent = font->descent; + metrics->ascent = font->ascent; + metrics->descent = font->descent; + } + else + { + metrics->ascent = 1; + metrics->descent = 0; + } metrics->width = metrics->lbearing = metrics->rbearing = 0; } for (glyph = &LGSTRING_GLYPH (gstring, from); from < to; from++, glyph++) @@ -874,7 +887,7 @@ LGLYPH_SET_FROM (g, i); LGLYPH_SET_TO (g, i); LGLYPH_SET_CHAR (g, c); - if (! NILP (font_object)) + if (FONT_OBJECT_P (font_object)) { font_fill_lglyph_metrics (g, font_object); } @@ -953,7 +966,9 @@ return unbind_to (count, Qnil); } } + else #endif /* not HAVE_WINDOW_SYSTEM */ + font_object = win->frame; gstring = Fcomposition_get_gstring (pos, make_number (to), font_object, string); if (NILP (LGSTRING_ID (gstring))) @@ -1007,6 +1022,8 @@ cmp_it->stop_pos = endpos = start; cmp_it->ch = -1; } + if (NILP (string) && PT > charpos && PT < endpos) + cmp_it->stop_pos = PT; if (NILP (current_buffer->enable_multibyte_characters) || ! FUNCTIONP (Vauto_composition_function)) return; @@ -1454,7 +1471,8 @@ doc: /* Return a glyph-string for characters between FROM and TO. If the glyph string is for graphic display, FONT-OBJECT must be a font-object to use for those characters. -Otherwise (for terminal display), FONT-OBJECT must be nil. +Otherwise (for terminal display), FONT-OBJECT must be a terminal ID, a +frame, or nil for the selected frame's terminal device. If the optional 4th argument STRING is not nil, it is a string containing the target characters between indices FROM and TO. @@ -1467,7 +1485,7 @@ [FONT-OBJECT CHAR ...] where FONT-OBJECT is a font-object for all glyphs in the glyph-string, - or nil if not yet decided. + or the terminal coding system of the specified terminal. CHARs are characters to be composed by GLYPHs. ID is an identification number of the glyph-string. It may be nil if @@ -1494,8 +1512,17 @@ CHECK_NATNUM (from); CHECK_NATNUM (to); - if (! NILP (font_object)) - CHECK_FONT_OBJECT (font_object); + if (! FONT_OBJECT_P (font_object)) + { + struct coding_system *coding; + struct terminal *terminal = get_terminal (font_object, 1); + + coding = ((TERMINAL_TERMINAL_CODING (terminal)->common_flags + & CODING_REQUIRE_ENCODING_MASK) + ? TERMINAL_TERMINAL_CODING (terminal) : &safe_terminal_coding); + font_object = CODING_ID_NAME (coding->id); + } + header = fill_gstring_header (Qnil, from, to, font_object, string); gstring = gstring_lookup_cache (header); if (! NILP (gstring))