Mercurial > emacs
annotate src/composite.c @ 106085:cd4cbab8bb21
Handle system default font and changing font parameters.
* xterm.h (struct x_display_info): Add atoms and Window for xsettings.
* xterm.c (handle_one_xevent): Call xft_settings_event for
ClientMessage, PropertyNotify and DestroyNotify.
(x_term_init): If we have XFT, get DPI from Xft.dpi.
Call xsettings_initialize.
* xftfont.c (xftfont_fix_match): New function.
(xftfont_open): Call XftDefaultSubstitute before XftFontMatch.
Call xftfont_fix_match after XftFontMatch.
* xfont.c (xfont_driver): Initialize all members.
* xfns.c (x_default_font_parameter): Try font from Ffont_get_system_font.
Do not get font from x_default_parameter if we got one from
Ffont_get_system_font.
(Fx_select_font): Get the defaut font name from :name of FRAME_FONT (f).
* w32font.c (w32font_driver): Initialize all members.
* termhooks.h (enum event_kind): CONFIG_CHANGED_EVENT is new.
* lisp.h: Declare syms_of_xsettings.
* keyboard.c (kbd_buffer_get_event, make_lispy_event): Handle
CONFIG_CHANGED_EVENT.
* ftfont.c (ftfont_filter_properties): New function.
* frame.c (x_set_font): Remove unused variable lval.
* font.h (struct font_driver): filter_properties is new.
* font.c (font_put_extra): Don't return if val is nil, it means
boolean option is off.
(font_parse_fcname): Collect all extra properties in extra_props
and call filter_properties for all drivers with extra_props and
font as parameter.
(font_open_entity): Do not use cache, it does not pick up new fontconfig
settings like hinting.
(font_load_for_lface): If spec had a name in it, store it in entity.
* emacs.c (main): Call syms_of_xsettings
* config.in: HAVE_GCONF is new.
* Makefile.in (GCONF_CFLAGS, GCONF_LIBS): New variables for HAVE_GCONF.
xsettings.o is new.
* menu-bar.el: Put "Use system font" in Option-menu.
* loadup.el: If feature system-font-setting or font-render-setting is
there, load font-setting.
* Makefile.in (ELCFILES): font-settings.el is new.
* font-setting.el: New file.
* NEWS: Mention dynamic font changes (font-use-system-font).
* configure.in: New option: --with(out)-gconf.
Set HAVE_GCONF if we find gconf.
| author | Jan Dj?rv <jan.h.d@swipnet.se> |
|---|---|
| date | Tue, 17 Nov 2009 08:21:23 +0000 |
| parents | 21bdda3ded62 |
| children | f2cea199b0c4 |
| rev | line source |
|---|---|
| 26848 | 1 /* Composite sequence support. |
|
68651
3bd95f4f2941
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
67658
diff
changeset
|
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, |
| 100951 | 3 2006, 2007, 2008, 2009 Free Software Foundation, Inc. |
| 4 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 | |
| 67658 | 5 National Institute of Advanced Industrial Science and Technology (AIST) |
| 6 Registration Number H14PRO021 | |
|
90405
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
7 Copyright (C) 2003, 2006 |
|
88366
97f11940f06a
Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents:
41001
diff
changeset
|
8 National Institute of Advanced Industrial Science and Technology (AIST) |
|
97f11940f06a
Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents:
41001
diff
changeset
|
9 Registration Number H13PRO009 |
| 26848 | 10 |
| 11 This file is part of GNU Emacs. | |
| 12 | |
|
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94922
diff
changeset
|
13 GNU Emacs is free software: you can redistribute it and/or modify |
| 26848 | 14 it under the terms of the GNU General Public License as published by |
|
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94922
diff
changeset
|
15 the Free Software Foundation, either version 3 of the License, or |
|
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94922
diff
changeset
|
16 (at your option) any later version. |
| 26848 | 17 |
| 18 GNU Emacs is distributed in the hope that it will be useful, | |
| 19 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 21 GNU General Public License for more details. | |
| 22 | |
| 23 You should have received a copy of the GNU General Public License | |
|
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94922
diff
changeset
|
24 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
| 26848 | 25 |
| 26 #include <config.h> | |
|
105669
68dd71358159
* alloc.c: Do not define struct catchtag.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
102726
diff
changeset
|
27 #include <setjmp.h> |
| 26848 | 28 #include "lisp.h" |
| 29 #include "buffer.h" | |
|
88366
97f11940f06a
Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents:
41001
diff
changeset
|
30 #include "character.h" |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
31 #include "coding.h" |
| 26848 | 32 #include "intervals.h" |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
33 #include "window.h" |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
34 #include "frame.h" |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
35 #include "dispextern.h" |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
36 #include "font.h" |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
37 #include "termhooks.h" |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
38 |
| 26848 | 39 |
| 40 /* Emacs uses special text property `composition' to support character | |
| 41 composition. A sequence of characters that have the same (i.e. eq) | |
| 42 `composition' property value is treated as a single composite | |
| 43 sequence (we call it just `composition' here after). Characters in | |
| 44 a composition are all composed somehow on the screen. | |
| 45 | |
| 46 The property value has this form when the composition is made: | |
| 47 ((LENGTH . COMPONENTS) . MODIFICATION-FUNC) | |
| 48 then turns to this form: | |
| 49 (COMPOSITION-ID . (LENGTH COMPONENTS-VEC . MODIFICATION-FUNC)) | |
| 50 when the composition is registered in composition_hash_table and | |
| 51 composition_table. These rather peculiar structures were designed | |
| 52 to make it easy to distinguish them quickly (we can do that by | |
| 53 checking only the first element) and to extract LENGTH (from the | |
| 54 former form) and COMPOSITION-ID (from the latter form). | |
| 55 | |
| 56 We register a composition when it is displayed, or when the width | |
| 57 is required (for instance, to calculate columns). | |
| 58 | |
| 59 LENGTH -- Length of the composition. This information is used to | |
| 60 check the validity of the composition. | |
| 61 | |
| 62 COMPONENTS -- Character, string, vector, list, or nil. | |
| 63 | |
| 64 If it is nil, characters in the text are composed relatively | |
| 65 according to their metrics in font glyphs. | |
| 66 | |
| 67 If it is a character or a string, the character or characters | |
| 68 in the string are composed relatively. | |
| 69 | |
| 70 If it is a vector or list of integers, the element is a | |
| 71 character or an encoded composition rule. The characters are | |
| 72 composed according to the rules. (2N)th elements are | |
| 73 characters to be composed and (2N+1)th elements are | |
| 74 composition rules to tell how to compose (2N+2)th element with | |
| 75 the previously composed 2N glyphs. | |
| 76 | |
| 77 COMPONENTS-VEC -- Vector of integers. In relative composition, the | |
| 78 elements are characters to be composed. In rule-base | |
| 79 composition, the elements are characters or encoded | |
| 80 composition rules. | |
| 81 | |
| 82 MODIFICATION-FUNC -- If non nil, it is a function to call when the | |
| 83 composition gets invalid after a modification in a buffer. If | |
| 84 it is nil, a function in `composition-function-table' of the | |
| 85 first character in the sequence is called. | |
| 86 | |
| 87 COMPOSITION-ID --Identification number of the composition. It is | |
| 88 used as an index to composition_table for the composition. | |
| 89 | |
| 90 When Emacs has to display a composition or has to know its | |
| 91 displaying width, the function get_composition_id is called. It | |
| 92 returns COMPOSITION-ID so that the caller can access the | |
| 93 information about the composition through composition_table. If a | |
| 94 COMPOSITION-ID has not yet been assigned to the composition, | |
| 95 get_composition_id checks the validity of `composition' property, | |
| 96 and, if valid, assigns a new ID, registers the information in | |
| 97 composition_hash_table and composition_table, and changes the form | |
| 98 of the property value. If the property is invalid, return -1 | |
| 99 without changing the property value. | |
| 100 | |
| 101 We use two tables to keep information about composition; | |
| 102 composition_hash_table and composition_table. | |
| 103 | |
| 104 The former is a hash table in which keys are COMPONENTS-VECs and | |
| 105 values are the corresponding COMPOSITION-IDs. This hash table is | |
|
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
106 weak, but as each key (COMPONENTS-VEC) is also kept as a value of the |
| 26848 | 107 `composition' property, it won't be collected as garbage until all |
|
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
108 bits of text that have the same COMPONENTS-VEC are deleted. |
| 26848 | 109 |
| 110 The latter is a table of pointers to `struct composition' indexed | |
|
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
111 by COMPOSITION-ID. This structure keeps the other information (see |
| 26848 | 112 composite.h). |
| 113 | |
| 114 In general, a text property holds information about individual | |
| 115 characters. But, a `composition' property holds information about | |
|
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
116 a sequence of characters (in this sense, it is like the `intangible' |
| 26848 | 117 property). That means that we should not share the property value |
|
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
118 in adjacent compositions -- we can't distinguish them if they have the |
| 26848 | 119 same property. So, after any changes, we call |
| 120 `update_compositions' and change a property of one of adjacent | |
| 121 compositions to a copy of it. This function also runs a proper | |
| 122 composition modification function to make a composition that gets | |
| 123 invalid by the change valid again. | |
| 124 | |
|
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
125 As the value of the `composition' property holds information about a |
| 26848 | 126 specific range of text, the value gets invalid if we change the |
|
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
127 text in the range. We treat the `composition' property as always |
| 26848 | 128 rear-nonsticky (currently by setting default-text-properties to |
| 129 (rear-nonsticky (composition))) and we never make properties of | |
| 130 adjacent compositions identical. Thus, any such changes make the | |
|
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
131 range just shorter. So, we can check the validity of the `composition' |
| 26848 | 132 property by comparing LENGTH information with the actual length of |
| 133 the composition. | |
| 134 | |
| 135 */ | |
| 136 | |
| 137 | |
| 138 Lisp_Object Qcomposition; | |
| 139 | |
| 140 /* Table of pointers to the structure `composition' indexed by | |
| 141 COMPOSITION-ID. This structure is for storing information about | |
| 142 each composition except for COMPONENTS-VEC. */ | |
| 143 struct composition **composition_table; | |
| 144 | |
| 145 /* The current size of `composition_table'. */ | |
| 146 static int composition_table_size; | |
| 147 | |
| 148 /* Number of compositions currently made. */ | |
| 149 int n_compositions; | |
| 150 | |
| 151 /* Hash table for compositions. The key is COMPONENTS-VEC of | |
| 152 `composition' property. The value is the corresponding | |
| 153 COMPOSITION-ID. */ | |
| 154 Lisp_Object composition_hash_table; | |
| 155 | |
| 156 /* Function to call to adjust composition. */ | |
| 157 Lisp_Object Vcompose_chars_after_function; | |
| 158 | |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
159 Lisp_Object Qauto_composed; |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
160 Lisp_Object Vauto_composition_function; |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
161 Lisp_Object Qauto_composition_function; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
162 Lisp_Object Vcomposition_function_table; |
|
33240
aaa42106f0da
(Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents:
30171
diff
changeset
|
163 |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
164 /* Maxinum number of characters to lookback to check |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
165 auto-composition. */ |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
166 #define MAX_AUTO_COMPOSITION_LOOKBACK 3 |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
167 |
|
89546
c380df3cc4df
(Fremove_list_of_text_properties): Declare.
Dave Love <fx@gnu.org>
parents:
89509
diff
changeset
|
168 EXFUN (Fremove_list_of_text_properties, 4); |
|
33240
aaa42106f0da
(Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents:
30171
diff
changeset
|
169 |
| 26848 | 170 /* Temporary variable used in macros COMPOSITION_XXX. */ |
| 171 Lisp_Object composition_temp; | |
|
90405
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
172 |
| 26848 | 173 |
| 174 /* Return COMPOSITION-ID of a composition at buffer position | |
| 175 CHARPOS/BYTEPOS and length NCHARS. The `composition' property of | |
| 176 the sequence is PROP. STRING, if non-nil, is a string that | |
| 177 contains the composition instead of the current buffer. | |
| 178 | |
| 179 If the composition is invalid, return -1. */ | |
| 180 | |
| 181 int | |
| 182 get_composition_id (charpos, bytepos, nchars, prop, string) | |
| 183 int charpos, bytepos, nchars; | |
| 184 Lisp_Object prop, string; | |
| 185 { | |
| 186 Lisp_Object id, length, components, key, *key_contents; | |
| 187 int glyph_len; | |
| 188 struct Lisp_Hash_Table *hash_table = XHASH_TABLE (composition_hash_table); | |
| 189 int hash_index; | |
| 190 unsigned hash_code; | |
| 191 struct composition *cmp; | |
| 192 int i, ch; | |
| 193 | |
| 194 /* PROP should be | |
| 195 Form-A: ((LENGTH . COMPONENTS) . MODIFICATION-FUNC) | |
| 196 or | |
| 197 Form-B: (COMPOSITION-ID . (LENGTH COMPONENTS-VEC . MODIFICATION-FUNC)) | |
| 198 */ | |
| 199 if (nchars == 0 || !CONSP (prop)) | |
| 200 goto invalid_composition; | |
| 201 | |
| 202 id = XCAR (prop); | |
| 203 if (INTEGERP (id)) | |
| 204 { | |
| 205 /* PROP should be Form-B. */ | |
| 206 if (XINT (id) < 0 || XINT (id) >= n_compositions) | |
| 207 goto invalid_composition; | |
| 208 return XINT (id); | |
| 209 } | |
| 210 | |
| 211 /* PROP should be Form-A. | |
| 212 Thus, ID should be (LENGTH . COMPONENTS). */ | |
| 213 if (!CONSP (id)) | |
| 214 goto invalid_composition; | |
| 215 length = XCAR (id); | |
| 216 if (!INTEGERP (length) || XINT (length) != nchars) | |
| 217 goto invalid_composition; | |
| 218 | |
| 219 components = XCDR (id); | |
| 220 | |
| 221 /* Check if the same composition has already been registered or not | |
| 222 by consulting composition_hash_table. The key for this table is | |
| 223 COMPONENTS (converted to a vector COMPONENTS-VEC) or, if it is | |
| 224 nil, vector of characters in the composition range. */ | |
| 225 if (INTEGERP (components)) | |
| 226 key = Fmake_vector (make_number (1), components); | |
| 227 else if (STRINGP (components) || CONSP (components)) | |
| 228 key = Fvconcat (1, &components); | |
| 229 else if (VECTORP (components)) | |
| 230 key = components; | |
| 231 else if (NILP (components)) | |
| 232 { | |
| 233 key = Fmake_vector (make_number (nchars), Qnil); | |
| 234 if (STRINGP (string)) | |
| 235 for (i = 0; i < nchars; i++) | |
| 236 { | |
| 237 FETCH_STRING_CHAR_ADVANCE (ch, string, charpos, bytepos); | |
| 238 XVECTOR (key)->contents[i] = make_number (ch); | |
| 239 } | |
| 240 else | |
| 241 for (i = 0; i < nchars; i++) | |
| 242 { | |
| 243 FETCH_CHAR_ADVANCE (ch, charpos, bytepos); | |
| 244 XVECTOR (key)->contents[i] = make_number (ch); | |
| 245 } | |
| 246 } | |
| 247 else | |
| 248 goto invalid_composition; | |
| 249 | |
| 250 hash_index = hash_lookup (hash_table, key, &hash_code); | |
| 251 if (hash_index >= 0) | |
| 252 { | |
| 253 /* We have already registered the same composition. Change PROP | |
| 254 from Form-A above to Form-B while replacing COMPONENTS with | |
| 255 COMPONENTS-VEC stored in the hash table. We can directly | |
| 256 modify the cons cell of PROP because it is not shared. */ | |
| 257 key = HASH_KEY (hash_table, hash_index); | |
| 258 id = HASH_VALUE (hash_table, hash_index); | |
|
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39046
diff
changeset
|
259 XSETCAR (prop, id); |
|
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39046
diff
changeset
|
260 XSETCDR (prop, Fcons (make_number (nchars), Fcons (key, XCDR (prop)))); |
| 26848 | 261 return XINT (id); |
| 262 } | |
| 263 | |
| 264 /* This composition is a new one. We must register it. */ | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49136
diff
changeset
|
265 |
| 26848 | 266 /* Check if we have sufficient memory to store this information. */ |
| 267 if (composition_table_size == 0) | |
| 268 { | |
| 269 composition_table_size = 256; | |
| 270 composition_table | |
| 271 = (struct composition **) xmalloc (sizeof (composition_table[0]) | |
| 272 * composition_table_size); | |
| 273 } | |
| 274 else if (composition_table_size <= n_compositions) | |
| 275 { | |
| 276 composition_table_size += 256; | |
| 277 composition_table | |
| 278 = (struct composition **) xrealloc (composition_table, | |
| 279 sizeof (composition_table[0]) | |
| 280 * composition_table_size); | |
| 281 } | |
| 282 | |
| 283 key_contents = XVECTOR (key)->contents; | |
| 284 | |
| 285 /* Check if the contents of COMPONENTS are valid if COMPONENTS is a | |
| 286 vector or a list. It should be a sequence of: | |
| 287 char1 rule1 char2 rule2 char3 ... ruleN charN+1 */ | |
|
90405
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
288 |
|
94922
181a3677061e
Throughout the file, delete all USE_FONT_BACKEND
Kenichi Handa <handa@m17n.org>
parents:
92028
diff
changeset
|
289 if (VECTORP (components) |
|
90405
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
290 && ASIZE (components) >= 2 |
|
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
291 && VECTORP (AREF (components, 0))) |
|
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
292 { |
|
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
293 /* COMPONENTS is a glyph-string. */ |
|
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
294 int len = ASIZE (key); |
|
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
295 |
|
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
296 for (i = 1; i < len; i++) |
|
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
297 if (! VECTORP (AREF (key, i))) |
|
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
298 goto invalid_composition; |
|
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
299 } |
|
94922
181a3677061e
Throughout the file, delete all USE_FONT_BACKEND
Kenichi Handa <handa@m17n.org>
parents:
92028
diff
changeset
|
300 else if (VECTORP (components) || CONSP (components)) |
| 26848 | 301 { |
| 302 int len = XVECTOR (key)->size; | |
| 303 | |
| 304 /* The number of elements should be odd. */ | |
| 305 if ((len % 2) == 0) | |
| 306 goto invalid_composition; | |
| 307 /* All elements should be integers (character or encoded | |
| 308 composition rule). */ | |
| 309 for (i = 0; i < len; i++) | |
| 310 { | |
| 311 if (!INTEGERP (key_contents[i])) | |
| 312 goto invalid_composition; | |
| 313 } | |
| 314 } | |
| 315 | |
| 316 /* Change PROP from Form-A above to Form-B. We can directly modify | |
| 317 the cons cell of PROP because it is not shared. */ | |
| 318 XSETFASTINT (id, n_compositions); | |
|
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39046
diff
changeset
|
319 XSETCAR (prop, id); |
|
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39046
diff
changeset
|
320 XSETCDR (prop, Fcons (make_number (nchars), Fcons (key, XCDR (prop)))); |
| 26848 | 321 |
| 322 /* Register the composition in composition_hash_table. */ | |
| 323 hash_index = hash_put (hash_table, key, id, hash_code); | |
| 324 | |
| 325 /* Register the composition in composition_table. */ | |
| 326 cmp = (struct composition *) xmalloc (sizeof (struct composition)); | |
| 327 | |
| 328 cmp->method = (NILP (components) | |
| 329 ? COMPOSITION_RELATIVE | |
| 330 : ((INTEGERP (components) || STRINGP (components)) | |
| 331 ? COMPOSITION_WITH_ALTCHARS | |
| 332 : COMPOSITION_WITH_RULE_ALTCHARS)); | |
| 333 cmp->hash_index = hash_index; | |
| 334 glyph_len = (cmp->method == COMPOSITION_WITH_RULE_ALTCHARS | |
| 335 ? (XVECTOR (key)->size + 1) / 2 | |
| 336 : XVECTOR (key)->size); | |
| 337 cmp->glyph_len = glyph_len; | |
| 338 cmp->offsets = (short *) xmalloc (sizeof (short) * glyph_len * 2); | |
| 339 cmp->font = NULL; | |
| 340 | |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
341 if (cmp->method != COMPOSITION_WITH_RULE_ALTCHARS) |
| 26848 | 342 { |
| 343 /* Relative composition. */ | |
| 344 cmp->width = 0; | |
| 345 for (i = 0; i < glyph_len; i++) | |
| 346 { | |
| 347 int this_width; | |
| 348 ch = XINT (key_contents[i]); | |
|
96413
b38a7de9af46
(get_composition_id): Fix the width calculation for TAB.
Kenichi Handa <handa@m17n.org>
parents:
94963
diff
changeset
|
349 this_width = (ch == '\t' ? 1 : CHAR_WIDTH (ch)); |
| 26848 | 350 if (cmp->width < this_width) |
| 351 cmp->width = this_width; | |
| 352 } | |
| 353 } | |
| 354 else | |
| 355 { | |
| 356 /* Rule-base composition. */ | |
| 357 float leftmost = 0.0, rightmost; | |
| 358 | |
| 359 ch = XINT (key_contents[0]); | |
|
90618
b7ce72709298
(get_composition_id): Pay attention to TAB
Kenichi Handa <handa@m17n.org>
parents:
90405
diff
changeset
|
360 rightmost = ch != '\t' ? CHAR_WIDTH (ch) : 1; |
| 26848 | 361 |
| 362 for (i = 1; i < glyph_len; i += 2) | |
| 363 { | |
|
89726
2660b0974edb
(get_composition_id): Handle xoff and yoff in a
Kenichi Handa <handa@m17n.org>
parents:
89706
diff
changeset
|
364 int rule, gref, nref, xoff, yoff; |
| 26848 | 365 int this_width; |
| 366 float this_left; | |
| 367 | |
| 368 rule = XINT (key_contents[i]); | |
| 369 ch = XINT (key_contents[i + 1]); | |
|
90618
b7ce72709298
(get_composition_id): Pay attention to TAB
Kenichi Handa <handa@m17n.org>
parents:
90405
diff
changeset
|
370 this_width = ch != '\t' ? CHAR_WIDTH (ch) : 1; |
| 26848 | 371 |
| 372 /* A composition rule is specified by an integer value | |
| 373 that encodes global and new reference points (GREF and | |
| 374 NREF). GREF and NREF are specified by numbers as | |
| 375 below: | |
| 376 0---1---2 -- ascent | |
| 377 | | | |
| 378 | | | |
| 379 | | | |
| 380 9--10--11 -- center | |
| 381 | | | |
| 382 ---3---4---5--- baseline | |
| 383 | | | |
| 384 6---7---8 -- descent | |
| 385 */ | |
|
89726
2660b0974edb
(get_composition_id): Handle xoff and yoff in a
Kenichi Handa <handa@m17n.org>
parents:
89706
diff
changeset
|
386 COMPOSITION_DECODE_RULE (rule, gref, nref, xoff, yoff); |
| 26848 | 387 this_left = (leftmost |
| 388 + (gref % 3) * (rightmost - leftmost) / 2.0 | |
| 389 - (nref % 3) * this_width / 2.0); | |
| 390 | |
| 391 if (this_left < leftmost) | |
| 392 leftmost = this_left; | |
| 393 if (this_left + this_width > rightmost) | |
| 394 rightmost = this_left + this_width; | |
| 395 } | |
| 396 | |
| 397 cmp->width = rightmost - leftmost; | |
| 398 if (cmp->width < (rightmost - leftmost)) | |
| 399 /* To get a ceiling integer value. */ | |
| 400 cmp->width++; | |
| 401 } | |
| 402 | |
| 403 composition_table[n_compositions] = cmp; | |
| 404 | |
| 405 return n_compositions++; | |
| 406 | |
| 407 invalid_composition: | |
| 408 /* Would it be better to remove this `composition' property? */ | |
| 409 return -1; | |
| 410 } | |
| 411 | |
| 412 | |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
413 /* Find a static composition at or nearest to position POS of OBJECT |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
414 (buffer or string). |
| 26848 | 415 |
| 416 OBJECT defaults to the current buffer. If there's a composition at | |
| 417 POS, set *START and *END to the start and end of the sequence, | |
| 418 *PROP to the `composition' property, and return 1. | |
| 419 | |
| 420 If there's no composition at POS and LIMIT is negative, return 0. | |
| 421 | |
| 422 Otherwise, search for a composition forward (LIMIT > POS) or | |
| 423 backward (LIMIT < POS). In this case, LIMIT bounds the search. | |
| 424 | |
| 425 If a composition is found, set *START, *END, and *PROP as above, | |
| 426 and return 1, else return 0. | |
| 427 | |
| 428 This doesn't check the validity of composition. */ | |
| 429 | |
| 430 int | |
| 431 find_composition (pos, limit, start, end, prop, object) | |
|
89509
3c9d2f9bf6bb
(find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents:
89483
diff
changeset
|
432 int pos, limit; |
|
3c9d2f9bf6bb
(find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents:
89483
diff
changeset
|
433 EMACS_INT *start, *end; |
| 26848 | 434 Lisp_Object *prop, object; |
| 435 { | |
| 436 Lisp_Object val; | |
| 437 | |
| 438 if (get_property_and_range (pos, Qcomposition, prop, start, end, object)) | |
| 439 return 1; | |
| 440 | |
| 441 if (limit < 0 || limit == pos) | |
| 442 return 0; | |
| 443 | |
| 444 if (limit > pos) /* search forward */ | |
|
34933
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
445 { |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
446 val = Fnext_single_property_change (make_number (pos), Qcomposition, |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
447 object, make_number (limit)); |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
448 pos = XINT (val); |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
449 if (pos == limit) |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
450 return 0; |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
451 } |
| 26848 | 452 else /* search backward */ |
|
34933
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
453 { |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
454 if (get_property_and_range (pos - 1, Qcomposition, prop, start, end, |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
455 object)) |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
456 return 1; |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
457 val = Fprevious_single_property_change (make_number (pos), Qcomposition, |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
458 object, make_number (limit)); |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
459 pos = XINT (val); |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
460 if (pos == limit) |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
461 return 0; |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
462 pos--; |
|
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
463 } |
| 26848 | 464 get_property_and_range (pos, Qcomposition, prop, start, end, object); |
| 465 return 1; | |
| 466 } | |
| 467 | |
| 468 /* Run a proper function to adjust the composition sitting between | |
| 469 FROM and TO with property PROP. */ | |
| 470 | |
| 471 static void | |
| 472 run_composition_function (from, to, prop) | |
| 473 int from, to; | |
| 474 Lisp_Object prop; | |
| 475 { | |
|
34958
e3133339e30c
(run_composition_function): Remove unused variable
Eli Zaretskii <eliz@gnu.org>
parents:
34933
diff
changeset
|
476 Lisp_Object func; |
|
89509
3c9d2f9bf6bb
(find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents:
89483
diff
changeset
|
477 EMACS_INT start, end; |
| 26848 | 478 |
| 479 func = COMPOSITION_MODIFICATION_FUNC (prop); | |
| 480 /* If an invalid composition precedes or follows, try to make them | |
| 481 valid too. */ | |
| 482 if (from > BEGV | |
| 483 && find_composition (from - 1, -1, &start, &end, &prop, Qnil) | |
| 484 && !COMPOSITION_VALID_P (start, end, prop)) | |
| 485 from = start; | |
| 486 if (to < ZV | |
| 487 && find_composition (to, -1, &start, &end, &prop, Qnil) | |
| 488 && !COMPOSITION_VALID_P (start, end, prop)) | |
| 489 to = end; | |
| 46940 | 490 if (!NILP (Ffboundp (func))) |
| 26848 | 491 call2 (func, make_number (from), make_number (to)); |
| 492 } | |
| 493 | |
| 494 /* Make invalid compositions adjacent to or inside FROM and TO valid. | |
| 495 CHECK_MASK is bitwise `or' of mask bits defined by macros | |
| 496 CHECK_XXX (see the comment in composite.h). | |
| 497 | |
|
89361
1dd4e6b8509a
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
89340
diff
changeset
|
498 It also resets the text-property `auto-composed' to a proper region |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
499 so that automatic character composition works correctly later while |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
500 displaying the region. |
| 89483 | 501 |
| 26848 | 502 This function is called when a buffer text is changed. If the |
| 503 change is deletion, FROM == TO. Otherwise, FROM < TO. */ | |
| 504 | |
| 505 void | |
| 506 update_compositions (from, to, check_mask) | |
|
89509
3c9d2f9bf6bb
(find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents:
89483
diff
changeset
|
507 EMACS_INT from, to; |
|
3c9d2f9bf6bb
(find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents:
89483
diff
changeset
|
508 int check_mask; |
| 26848 | 509 { |
|
34958
e3133339e30c
(run_composition_function): Remove unused variable
Eli Zaretskii <eliz@gnu.org>
parents:
34933
diff
changeset
|
510 Lisp_Object prop; |
|
89509
3c9d2f9bf6bb
(find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents:
89483
diff
changeset
|
511 EMACS_INT start, end; |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
512 /* The beginning and end of the region to set the property |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
513 `auto-composed' to nil. */ |
|
89509
3c9d2f9bf6bb
(find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents:
89483
diff
changeset
|
514 EMACS_INT min_pos = from, max_pos = to; |
| 26848 | 515 |
|
39046
a61b3d907098
(update_compositions): Do nothing if
Gerd Moellmann <gerd@gnu.org>
parents:
38116
diff
changeset
|
516 if (inhibit_modification_hooks) |
|
a61b3d907098
(update_compositions): Do nothing if
Gerd Moellmann <gerd@gnu.org>
parents:
38116
diff
changeset
|
517 return; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49136
diff
changeset
|
518 |
|
28581
151b7ae3b21f
(update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents:
28472
diff
changeset
|
519 /* If FROM and TO are not in a valid range, do nothing. */ |
|
151b7ae3b21f
(update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents:
28472
diff
changeset
|
520 if (! (BEGV <= from && from <= to && to <= ZV)) |
|
151b7ae3b21f
(update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents:
28472
diff
changeset
|
521 return; |
|
151b7ae3b21f
(update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents:
28472
diff
changeset
|
522 |
| 26848 | 523 if (check_mask & CHECK_HEAD) |
| 524 { | |
| 525 /* FROM should be at composition boundary. But, insertion or | |
| 526 deletion will make two compositions adjacent and | |
| 527 indistinguishable when they have same (eq) property. To | |
| 528 avoid it, in such a case, we change the property of the | |
| 529 latter to the copy of it. */ | |
| 530 if (from > BEGV | |
|
78011
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
531 && find_composition (from - 1, -1, &start, &end, &prop, Qnil) |
|
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
532 && COMPOSITION_VALID_P (start, end, prop)) |
| 26848 | 533 { |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
534 min_pos = start; |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
535 if (end > to) |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
536 max_pos = end; |
| 26848 | 537 if (from < end) |
| 538 Fput_text_property (make_number (from), make_number (end), | |
| 539 Qcomposition, | |
| 540 Fcons (XCAR (prop), XCDR (prop)), Qnil); | |
| 541 run_composition_function (start, end, prop); | |
| 542 from = end; | |
| 543 } | |
|
37242
029c8c1b451d
(update_compositions) <check_mask & CHECK_HEAD>: Fix
Dave Love <fx@gnu.org>
parents:
34958
diff
changeset
|
544 else if (from < ZV |
|
78011
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
545 && find_composition (from, -1, &start, &from, &prop, Qnil) |
|
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
546 && COMPOSITION_VALID_P (start, from, prop)) |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
547 { |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
548 if (from > to) |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
549 max_pos = from; |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
550 run_composition_function (start, from, prop); |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
551 } |
| 26848 | 552 } |
| 553 | |
| 554 if (check_mask & CHECK_INSIDE) | |
| 555 { | |
| 556 /* In this case, we are sure that (check & CHECK_TAIL) is also | |
| 557 nonzero. Thus, here we should check only compositions before | |
| 558 (to - 1). */ | |
| 559 while (from < to - 1 | |
| 560 && find_composition (from, to, &start, &from, &prop, Qnil) | |
|
78011
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
561 && COMPOSITION_VALID_P (start, from, prop) |
| 26848 | 562 && from < to - 1) |
| 563 run_composition_function (start, from, prop); | |
| 564 } | |
| 565 | |
| 566 if (check_mask & CHECK_TAIL) | |
| 567 { | |
| 568 if (from < to | |
|
78011
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
569 && find_composition (to - 1, -1, &start, &end, &prop, Qnil) |
|
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
570 && COMPOSITION_VALID_P (start, end, prop)) |
| 26848 | 571 { |
| 572 /* TO should be also at composition boundary. But, | |
| 573 insertion or deletion will make two compositions adjacent | |
| 574 and indistinguishable when they have same (eq) property. | |
| 575 To avoid it, in such a case, we change the property of | |
| 576 the former to the copy of it. */ | |
| 577 if (to < end) | |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
578 { |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
579 Fput_text_property (make_number (start), make_number (to), |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
580 Qcomposition, |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
581 Fcons (XCAR (prop), XCDR (prop)), Qnil); |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
582 max_pos = end; |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
583 } |
| 26848 | 584 run_composition_function (start, end, prop); |
| 585 } | |
| 586 else if (to < ZV | |
|
78011
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
587 && find_composition (to, -1, &start, &end, &prop, Qnil) |
|
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
588 && COMPOSITION_VALID_P (start, end, prop)) |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
589 { |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
590 run_composition_function (start, end, prop); |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
591 max_pos = end; |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
592 } |
| 26848 | 593 } |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
594 if (min_pos < max_pos) |
|
89633
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
595 { |
|
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
596 int count = SPECPDL_INDEX (); |
|
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
597 |
|
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
598 specbind (Qinhibit_read_only, Qt); |
|
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
599 specbind (Qinhibit_modification_hooks, Qt); |
|
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
600 specbind (Qinhibit_point_motion_hooks, Qt); |
|
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
601 Fremove_list_of_text_properties (make_number (min_pos), |
|
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
602 make_number (max_pos), |
|
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
603 Fcons (Qauto_composed, Qnil), Qnil); |
|
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
604 unbind_to (count, Qnil); |
| 26848 | 605 } |
| 606 } | |
| 607 | |
|
30022
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
608 |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
609 /* Modify composition property values in LIST destructively. LIST is |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
610 a list as returned from text_property_list. Change values to the |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
611 top-level copies of them so that none of them are `eq'. */ |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
612 |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
613 void |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
614 make_composition_value_copy (list) |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
615 Lisp_Object list; |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
616 { |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
617 Lisp_Object plist, val; |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
618 |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
619 for (; CONSP (list); list = XCDR (list)) |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
620 { |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
621 plist = XCAR (XCDR (XCDR (XCAR (list)))); |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
622 while (CONSP (plist) && CONSP (XCDR (plist))) |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
623 { |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
624 if (EQ (XCAR (plist), Qcomposition) |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
625 && (val = XCAR (XCDR (plist)), CONSP (val))) |
|
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39046
diff
changeset
|
626 XSETCAR (XCDR (plist), Fcons (XCAR (val), XCDR (val))); |
|
30022
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
627 plist = XCDR (XCDR (plist)); |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
628 } |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
629 } |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
630 } |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
631 |
|
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
632 |
| 26848 | 633 /* Make text in the region between START and END a composition that |
| 634 has COMPONENTS and MODIFICATION-FUNC. | |
| 635 | |
| 636 If STRING is non-nil, then operate on characters contained between | |
| 637 indices START and END in STRING. */ | |
| 638 | |
| 639 void | |
| 640 compose_text (start, end, components, modification_func, string) | |
| 641 int start, end; | |
| 642 Lisp_Object components, modification_func, string; | |
| 643 { | |
| 644 Lisp_Object prop; | |
| 645 | |
| 646 prop = Fcons (Fcons (make_number (end - start), components), | |
| 647 modification_func); | |
| 648 Fput_text_property (make_number (start), make_number (end), | |
| 649 Qcomposition, prop, string); | |
| 650 } | |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
651 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
652 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
653 static Lisp_Object autocmp_chars P_ ((Lisp_Object, EMACS_INT, EMACS_INT, |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
654 EMACS_INT, struct window *, |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
655 struct face *, Lisp_Object)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
656 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
657 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
658 /* Lisp glyph-string handlers */ |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
659 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
660 /* Hash table for automatic composition. The key is a header of a |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
661 lgstring (Lispy glyph-string), and the value is a body of a |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
662 lgstring. */ |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
663 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
664 static Lisp_Object gstring_hash_table; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
665 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
666 static Lisp_Object gstring_lookup_cache P_ ((Lisp_Object)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
667 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
668 static Lisp_Object |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
669 gstring_lookup_cache (header) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
670 Lisp_Object header; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
671 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
672 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
673 int i = hash_lookup (h, header, NULL); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
674 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
675 return (i >= 0 ? HASH_VALUE (h, i) : Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
676 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
677 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
678 Lisp_Object |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
679 composition_gstring_put_cache (gstring, len) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
680 Lisp_Object gstring; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
681 int len; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
682 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
683 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
684 unsigned hash; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
685 Lisp_Object header, copy; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
686 int i; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
687 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
688 header = LGSTRING_HEADER (gstring); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
689 hash = h->hashfn (h, header); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
690 if (len < 0) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
691 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
692 len = LGSTRING_GLYPH_LEN (gstring); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
693 for (i = 0; i < len; i++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
694 if (NILP (LGSTRING_GLYPH (gstring, i))) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
695 break; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
696 len = i; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
697 } |
|
102726
93ad3a5a4f75
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
101967
diff
changeset
|
698 |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
699 copy = Fmake_vector (make_number (len + 2), Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
700 LGSTRING_SET_HEADER (copy, Fcopy_sequence (header)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
701 for (i = 0; i < len; i++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
702 LGSTRING_SET_GLYPH (copy, i, Fcopy_sequence (LGSTRING_GLYPH (gstring, i))); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
703 i = hash_put (h, LGSTRING_HEADER (copy), copy, hash); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
704 LGSTRING_SET_ID (copy, make_number (i)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
705 return copy; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
706 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
707 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
708 Lisp_Object |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
709 composition_gstring_from_id (id) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
710 int id; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
711 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
712 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
713 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
714 return HASH_VALUE (h, id); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
715 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
716 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
717 static Lisp_Object fill_gstring_header P_ ((Lisp_Object, Lisp_Object, |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
718 Lisp_Object, Lisp_Object, |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
719 Lisp_Object)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
720 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
721 int |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
722 composition_gstring_p (gstring) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
723 Lisp_Object gstring; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
724 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
725 Lisp_Object header; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
726 int i; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
727 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
728 if (! VECTORP (gstring) || ASIZE (gstring) < 2) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
729 return 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
730 header = LGSTRING_HEADER (gstring); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
731 if (! VECTORP (header) || ASIZE (header) < 2) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
732 return 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
733 if (! NILP (LGSTRING_FONT (gstring)) |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
734 && (! FONT_OBJECT_P (LGSTRING_FONT (gstring)) |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
735 && ! CODING_SYSTEM_P (LGSTRING_FONT (gstring)))) |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
736 return 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
737 for (i = 1; i < ASIZE (LGSTRING_HEADER (gstring)); i++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
738 if (! NATNUMP (AREF (LGSTRING_HEADER (gstring), i))) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
739 return 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
740 if (! NILP (LGSTRING_ID (gstring)) && ! NATNUMP (LGSTRING_ID (gstring))) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
741 return 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
742 for (i = 0; i < LGSTRING_GLYPH_LEN (gstring); i++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
743 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
744 Lisp_Object glyph = LGSTRING_GLYPH (gstring, i); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
745 if (NILP (glyph)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
746 break; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
747 if (! VECTORP (glyph) || ASIZE (glyph) != LGLYPH_SIZE) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
748 return 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
749 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
750 return 1; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
751 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
752 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
753 int |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
754 composition_gstring_width (gstring, from, to, metrics) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
755 Lisp_Object gstring; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
756 int from, to; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
757 struct font_metrics *metrics; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
758 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
759 Lisp_Object *glyph; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
760 int width = 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
761 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
762 if (metrics) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
763 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
764 Lisp_Object font_object = LGSTRING_FONT (gstring); |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
765 |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
766 if (FONT_OBJECT_P (font_object)) |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
767 { |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
768 struct font *font = XFONT_OBJECT (font_object); |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
769 |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
770 metrics->ascent = font->ascent; |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
771 metrics->descent = font->descent; |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
772 } |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
773 else |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
774 { |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
775 metrics->ascent = 1; |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
776 metrics->descent = 0; |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
777 } |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
778 metrics->width = metrics->lbearing = metrics->rbearing = 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
779 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
780 for (glyph = &LGSTRING_GLYPH (gstring, from); from < to; from++, glyph++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
781 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
782 int x; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
783 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
784 if (NILP (LGLYPH_ADJUSTMENT (*glyph))) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
785 width += LGLYPH_WIDTH (*glyph); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
786 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
787 width += LGLYPH_WADJUST (*glyph); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
788 if (metrics) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
789 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
790 x = metrics->width + LGLYPH_LBEARING (*glyph) + LGLYPH_XOFF (*glyph); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
791 if (metrics->lbearing > x) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
792 metrics->lbearing = x; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
793 x = metrics->width + LGLYPH_RBEARING (*glyph) + LGLYPH_XOFF (*glyph); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
794 if (metrics->rbearing < x) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
795 metrics->rbearing = x; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
796 metrics->width = width; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
797 x = LGLYPH_ASCENT (*glyph) - LGLYPH_YOFF (*glyph); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
798 if (metrics->ascent < x) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
799 metrics->ascent = x; |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
800 x = LGLYPH_DESCENT (*glyph) + LGLYPH_YOFF (*glyph); |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
801 if (metrics->descent < x) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
802 metrics->descent = x; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
803 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
804 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
805 return width; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
806 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
807 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
808 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
809 static Lisp_Object gstring_work; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
810 static Lisp_Object gstring_work_headers; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
811 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
812 static Lisp_Object |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
813 fill_gstring_header (header, start, end, font_object, string) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
814 Lisp_Object header, start, end, font_object, string; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
815 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
816 EMACS_INT from, to, from_byte; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
817 EMACS_INT len, i; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
818 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
819 if (NILP (string)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
820 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
821 if (NILP (current_buffer->enable_multibyte_characters)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
822 error ("Attempt to shape unibyte text"); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
823 validate_region (&start, &end); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
824 from = XFASTINT (start); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
825 to = XFASTINT (end); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
826 from_byte = CHAR_TO_BYTE (from); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
827 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
828 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
829 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
830 CHECK_STRING (string); |
|
99301
ef372a9c4197
(fill_gstring_header): Fix copy/paste typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
98369
diff
changeset
|
831 if (! STRING_MULTIBYTE (string)) |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
832 error ("Attempt to shape unibyte text"); |
|
98214
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
833 /* FROM and TO are checked by the caller. */ |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
834 from = XINT (start); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
835 to = XINT (end); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
836 if (from < 0 || from > to || to > SCHARS (string)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
837 args_out_of_range_3 (string, start, end); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
838 from_byte = string_char_to_byte (string, from); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
839 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
840 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
841 len = to - from; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
842 if (len == 0) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
843 error ("Attempt to shape zero-length text"); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
844 if (VECTORP (header)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
845 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
846 if (ASIZE (header) != len + 1) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
847 args_out_of_range (header, make_number (len + 1)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
848 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
849 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
850 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
851 if (len <= 8) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
852 header = AREF (gstring_work_headers, len - 1); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
853 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
854 header = Fmake_vector (make_number (len + 1), Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
855 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
856 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
857 ASET (header, 0, font_object); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
858 for (i = 0; i < len; i++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
859 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
860 int c; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
861 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
862 if (NILP (string)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
863 FETCH_CHAR_ADVANCE_NO_CHECK (c, from, from_byte); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
864 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
865 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string, from, from_byte); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
866 ASET (header, i + 1, make_number (c)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
867 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
868 return header; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
869 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
870 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
871 extern void font_fill_lglyph_metrics P_ ((Lisp_Object, Lisp_Object)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
872 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
873 static void |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
874 fill_gstring_body (gstring) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
875 Lisp_Object gstring; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
876 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
877 Lisp_Object font_object = LGSTRING_FONT (gstring); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
878 Lisp_Object header = AREF (gstring, 0); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
879 EMACS_INT len = LGSTRING_CHAR_LEN (gstring); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
880 EMACS_INT i; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
881 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
882 for (i = 0; i < len; i++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
883 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
884 Lisp_Object g = LGSTRING_GLYPH (gstring, i); |
|
97854
a361f652d863
(fill_gstring_body): Avoid compiler warnings.
Eli Zaretskii <eliz@gnu.org>
parents:
97819
diff
changeset
|
885 EMACS_INT c = XINT (AREF (header, i + 1)); |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
886 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
887 if (NILP (g)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
888 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
889 g = LGLYPH_NEW (); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
890 LGSTRING_SET_GLYPH (gstring, i, g); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
891 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
892 LGLYPH_SET_FROM (g, i); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
893 LGLYPH_SET_TO (g, i); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
894 LGLYPH_SET_CHAR (g, c); |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
895 if (FONT_OBJECT_P (font_object)) |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
896 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
897 font_fill_lglyph_metrics (g, font_object); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
898 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
899 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
900 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
901 int width = XFASTINT (CHAR_TABLE_REF (Vchar_width_table, c)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
902 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
903 LGLYPH_SET_CODE (g, c); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
904 LGLYPH_SET_LBEARING (g, 0); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
905 LGLYPH_SET_RBEARING (g, width); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
906 LGLYPH_SET_WIDTH (g, width); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
907 LGLYPH_SET_ASCENT (g, 1); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
908 LGLYPH_SET_DESCENT (g, 0); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
909 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
910 LGLYPH_SET_ADJUSTMENT (g, Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
911 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
912 if (i < LGSTRING_GLYPH_LEN (gstring)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
913 LGSTRING_SET_GLYPH (gstring, i, Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
914 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
915 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
916 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
917 /* Try to compose the characters at CHARPOS according to CFT_ELEMENT |
|
102726
93ad3a5a4f75
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
101967
diff
changeset
|
918 which is an element of composition-function-table (which see). |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
919 LIMIT limits the characters to compose. STRING, if not nil, is a |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
920 target string. WIN is a window where the characters are being |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
921 displayed. */ |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
922 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
923 static Lisp_Object |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
924 autocmp_chars (cft_element, charpos, bytepos, limit, win, face, string) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
925 Lisp_Object cft_element; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
926 EMACS_INT charpos, bytepos, limit; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
927 struct window *win; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
928 struct face *face; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
929 Lisp_Object string; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
930 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
931 int count = SPECPDL_INDEX (); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
932 FRAME_PTR f = XFRAME (win->frame); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
933 Lisp_Object pos = make_number (charpos); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
934 EMACS_INT pt = PT, pt_byte = PT_BYTE; |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
935 int lookback; |
|
102726
93ad3a5a4f75
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
101967
diff
changeset
|
936 |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
937 record_unwind_save_match_data (); |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
938 for (lookback = -1; CONSP (cft_element); cft_element = XCDR (cft_element)) |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
939 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
940 Lisp_Object elt = XCAR (cft_element); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
941 Lisp_Object re; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
942 Lisp_Object font_object = Qnil, gstring; |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
943 EMACS_INT len, to; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
944 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
945 if (! VECTORP (elt) || ASIZE (elt) != 3) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
946 continue; |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
947 if (lookback < 0) |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
948 { |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
949 lookback = XFASTINT (AREF (elt, 1)); |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
950 if (limit > charpos + MAX_COMPOSITION_COMPONENTS) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
951 limit = charpos + MAX_COMPOSITION_COMPONENTS; |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
952 } |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
953 else if (lookback != XFASTINT (AREF (elt, 1))) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
954 break; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
955 re = AREF (elt, 0); |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
956 if (NILP (re)) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
957 len = 1; |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
958 else if ((len = fast_looking_at (re, charpos, bytepos, limit, -1, string)) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
959 > 0) |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
960 { |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
961 if (NILP (string)) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
962 len = BYTE_TO_CHAR (bytepos + len) - charpos; |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
963 else |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
964 len = string_byte_to_char (string, bytepos + len) - charpos; |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
965 } |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
966 if (len > 0) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
967 { |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
968 limit = to = charpos + len; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
969 #ifdef HAVE_WINDOW_SYSTEM |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
970 if (FRAME_WINDOW_P (f)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
971 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
972 font_object = font_range (charpos, &to, win, face, string); |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
973 if (! FONT_OBJECT_P (font_object) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
974 || (! NILP (re) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
975 && to < limit |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
976 && (fast_looking_at (re, charpos, bytepos, to, -1, string) <= 0))) |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
977 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
978 if (NILP (string)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
979 TEMP_SET_PT_BOTH (pt, pt_byte); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
980 return unbind_to (count, Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
981 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
982 } |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
983 else |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
984 #endif /* not HAVE_WINDOW_SYSTEM */ |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
985 font_object = win->frame; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
986 gstring = Fcomposition_get_gstring (pos, make_number (to), |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
987 font_object, string); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
988 if (NILP (LGSTRING_ID (gstring))) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
989 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
990 Lisp_Object args[6]; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
991 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
992 args[0] = Vauto_composition_function; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
993 args[1] = AREF (elt, 2); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
994 args[2] = pos; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
995 args[3] = make_number (to); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
996 args[4] = font_object; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
997 args[5] = string; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
998 gstring = safe_call (6, args); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
999 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1000 if (NILP (string)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1001 TEMP_SET_PT_BOTH (pt, pt_byte); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1002 return unbind_to (count, gstring); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1003 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1004 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1005 if (NILP (string)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1006 TEMP_SET_PT_BOTH (pt, pt_byte); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1007 return unbind_to (count, Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1008 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1009 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1010 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1011 /* Update cmp_it->stop_pos to the next position after CHARPOS (and |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1012 BYTEPOS) where character composition may happen. If BYTEPOS is |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1013 negative, compoute it. If it is a static composition, set |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1014 cmp_it->ch to -1. Otherwise, set cmp_it->ch to the character that |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1015 triggers a automatic composition. */ |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1016 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1017 void |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1018 composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1019 struct composition_it *cmp_it; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1020 EMACS_INT charpos, bytepos, endpos; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1021 Lisp_Object string; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1022 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1023 EMACS_INT start, end, c; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1024 Lisp_Object prop, val; |
|
98107
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1025 /* This is from forward_to_next_line_start in xdisp.c. */ |
|
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1026 const int MAX_NEWLINE_DISTANCE = 500; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1027 |
|
98107
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1028 if (endpos > charpos + MAX_NEWLINE_DISTANCE) |
|
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1029 endpos = charpos + MAX_NEWLINE_DISTANCE; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1030 cmp_it->stop_pos = endpos; |
|
98128
092123c2b01a
(composition_compute_stop_pos): Reset cmp_it->id to -1 at first.
Kenichi Handa <handa@m17n.org>
parents:
98115
diff
changeset
|
1031 cmp_it->id = -1; |
|
98115
463a86221cdd
(composition_compute_stop_pos): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98107
diff
changeset
|
1032 cmp_it->ch = -2; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1033 if (find_composition (charpos, endpos, &start, &end, &prop, string) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1034 && COMPOSITION_VALID_P (start, end, prop)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1035 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1036 cmp_it->stop_pos = endpos = start; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1037 cmp_it->ch = -1; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1038 } |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1039 if (NILP (string) && PT > charpos && PT < endpos) |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1040 cmp_it->stop_pos = PT; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1041 if (NILP (current_buffer->enable_multibyte_characters) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1042 || ! FUNCTIONP (Vauto_composition_function)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1043 return; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1044 if (bytepos < 0) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1045 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1046 if (STRINGP (string)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1047 bytepos = string_char_to_byte (string, charpos); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1048 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1049 bytepos = CHAR_TO_BYTE (charpos); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1050 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1051 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1052 start = charpos; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1053 while (charpos < endpos) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1054 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1055 if (STRINGP (string)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1056 FETCH_STRING_CHAR_ADVANCE (c, string, charpos, bytepos); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1057 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1058 FETCH_CHAR_ADVANCE (c, charpos, bytepos); |
|
98107
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1059 if (c == '\n') |
|
98214
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1060 { |
|
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1061 cmp_it->ch = -2; |
|
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1062 break; |
|
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1063 } |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1064 val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1065 if (! NILP (val)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1066 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1067 Lisp_Object elt; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1068 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1069 for (; CONSP (val); val = XCDR (val)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1070 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1071 elt = XCAR (val); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1072 if (VECTORP (elt) && ASIZE (elt) == 3 && NATNUMP (AREF (elt, 1)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1073 && charpos - 1 - XFASTINT (AREF (elt, 1)) >= start) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1074 break; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1075 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1076 if (CONSP (val)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1077 { |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1078 cmp_it->lookback = XFASTINT (AREF (elt, 1)); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1079 cmp_it->stop_pos = charpos - 1 - cmp_it->lookback; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1080 cmp_it->ch = c; |
|
98115
463a86221cdd
(composition_compute_stop_pos): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98107
diff
changeset
|
1081 return; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1082 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1083 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1084 } |
|
98115
463a86221cdd
(composition_compute_stop_pos): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98107
diff
changeset
|
1085 cmp_it->stop_pos = charpos; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1086 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1087 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1088 /* Check if the character at CHARPOS (and BYTEPOS) is composed |
|
99512
0ba1e475119f
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
99301
diff
changeset
|
1089 (possibly with the following characters) on window W. ENDPOS limits |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1090 characters to be composed. FACE, in non-NULL, is a base face of |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1091 the character. If STRING is not nil, it is a string containing the |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1092 character to check, and CHARPOS and BYTEPOS are indices in the |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1093 string. In that case, FACE must not be NULL. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1094 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1095 If the character is composed, setup members of CMP_IT (id, nglyphs, |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1096 and from), and return 1. Otherwise, update CMP_IT->stop_pos, and |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1097 return 0. */ |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1098 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1099 int |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1100 composition_reseat_it (cmp_it, charpos, bytepos, endpos, w, face, string) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1101 struct composition_it *cmp_it; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1102 EMACS_INT charpos, bytepos, endpos; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1103 struct window *w; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1104 struct face *face; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1105 Lisp_Object string; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1106 { |
|
98107
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1107 if (cmp_it->ch == -2) |
|
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1108 { |
|
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1109 composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string); |
|
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1110 if (cmp_it->ch == -2) |
|
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1111 return 0; |
|
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1112 } |
|
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1113 |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1114 if (cmp_it->ch < 0) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1115 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1116 /* We are looking at a static composition. */ |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1117 EMACS_INT start, end; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1118 Lisp_Object prop; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1119 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1120 find_composition (charpos, -1, &start, &end, &prop, string); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1121 cmp_it->id = get_composition_id (charpos, bytepos, end - start, |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1122 prop, string); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1123 if (cmp_it->id < 0) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1124 goto no_composition; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1125 cmp_it->nchars = end - start; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1126 cmp_it->nglyphs = composition_table[cmp_it->id]->glyph_len; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1127 } |
|
98156
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1128 else if (w) |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1129 { |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1130 Lisp_Object val, elt; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1131 int i; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1132 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1133 val = CHAR_TABLE_REF (Vcomposition_function_table, cmp_it->ch); |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1134 for (; CONSP (val); val = XCDR (val)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1135 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1136 elt = XCAR (val); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1137 if (cmp_it->lookback == XFASTINT (AREF (elt, 1))) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1138 break; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1139 } |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1140 if (NILP (val)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1141 goto no_composition; |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1142 |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1143 val = autocmp_chars (val, charpos, bytepos, endpos, w, face, string); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1144 if (! composition_gstring_p (val)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1145 goto no_composition; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1146 if (NILP (LGSTRING_ID (val))) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1147 val = composition_gstring_put_cache (val, -1); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1148 cmp_it->id = XINT (LGSTRING_ID (val)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1149 for (i = 0; i < LGSTRING_GLYPH_LEN (val); i++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1150 if (NILP (LGSTRING_GLYPH (val, i))) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1151 break; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1152 cmp_it->nglyphs = i; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1153 } |
|
98156
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1154 else |
|
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1155 goto no_composition; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1156 cmp_it->from = 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1157 return 1; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1158 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1159 no_composition: |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1160 charpos++; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1161 if (STRINGP (string)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1162 bytepos += MULTIBYTE_LENGTH_NO_CHECK (SDATA (string) + bytepos); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1163 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1164 INC_POS (bytepos); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1165 composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1166 return 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1167 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1168 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1169 int |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1170 composition_update_it (cmp_it, charpos, bytepos, string) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1171 struct composition_it *cmp_it; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1172 EMACS_INT charpos, bytepos; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1173 Lisp_Object string; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1174 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1175 int i, c; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1176 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1177 if (cmp_it->ch < 0) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1178 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1179 struct composition *cmp = composition_table[cmp_it->id]; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1180 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1181 cmp_it->to = cmp_it->nglyphs; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1182 if (cmp_it->nglyphs == 0) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1183 c = -1; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1184 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1185 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1186 for (i = 0; i < cmp->glyph_len; i++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1187 if ((c = COMPOSITION_GLYPH (cmp, i)) != '\t') |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1188 break; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1189 if (c == '\t') |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1190 c = ' '; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1191 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1192 cmp_it->width = cmp->width; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1193 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1194 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1195 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1196 Lisp_Object gstring = composition_gstring_from_id (cmp_it->id); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1197 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1198 if (cmp_it->nglyphs == 0) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1199 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1200 c = -1; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1201 cmp_it->nchars = LGSTRING_CHAR_LEN (gstring); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1202 cmp_it->width = 0; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1203 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1204 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1205 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1206 Lisp_Object glyph = LGSTRING_GLYPH (gstring, cmp_it->from); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1207 int from = LGLYPH_FROM (glyph); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1208 |
|
97887
cff62eaa08c4
* font.h (font_range):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
97854
diff
changeset
|
1209 c = XINT (LGSTRING_CHAR (gstring, from)); |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1210 cmp_it->nchars = LGLYPH_TO (glyph) - from + 1; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1211 cmp_it->width = (LGLYPH_WIDTH (glyph) > 0 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1212 ? CHAR_WIDTH (LGLYPH_CHAR (glyph)) : 0); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1213 for (cmp_it->to = cmp_it->from + 1; cmp_it->to < cmp_it->nglyphs; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1214 cmp_it->to++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1215 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1216 glyph = LGSTRING_GLYPH (gstring, cmp_it->to); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1217 if (LGLYPH_FROM (glyph) != from) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1218 break; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1219 if (LGLYPH_WIDTH (glyph) > 0) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1220 cmp_it->width += CHAR_WIDTH (LGLYPH_CHAR (glyph)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1221 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1222 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1223 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1224 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1225 charpos += cmp_it->nchars; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1226 if (STRINGP (string)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1227 cmp_it->nbytes = string_char_to_byte (string, charpos) - bytepos; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1228 else |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1229 cmp_it->nbytes = CHAR_TO_BYTE (charpos) - bytepos; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1230 return c; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1231 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1232 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1233 |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1234 struct position_record |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1235 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1236 EMACS_INT pos, pos_byte; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1237 unsigned char *p; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1238 }; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1239 |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1240 /* Update the members of POSTION to the next character boundary. */ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1241 #define FORWARD_CHAR(POSITION, STOP) \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1242 do { \ |
|
98068
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1243 (POSITION).pos++; \ |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1244 if ((POSITION).pos == (STOP)) \ |
|
98068
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1245 { \ |
|
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1246 (POSITION).p = GAP_END_ADDR; \ |
|
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1247 (POSITION).pos_byte = GPT_BYTE; \ |
|
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1248 } \ |
|
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1249 else \ |
|
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1250 { \ |
|
98100
2eda9a0daa3e
(FORWARD_CHAR): Fix calculation of (POSITION).pos_byte.
Kenichi Handa <handa@m17n.org>
parents:
98068
diff
changeset
|
1251 (POSITION).pos_byte += BYTES_BY_CHAR_HEAD (*((POSITION).p)); \ |
|
98068
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1252 (POSITION).p += BYTES_BY_CHAR_HEAD (*((POSITION).p)); \ |
|
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1253 } \ |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1254 } while (0) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1255 |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1256 /* Update the members of POSTION to the previous character boundary. */ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1257 #define BACKWARD_CHAR(POSITION, STOP) \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1258 do { \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1259 if ((POSITION).pos == STOP) \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1260 (POSITION).p = GPT_ADDR; \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1261 do { \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1262 (POSITION).pos_byte--; \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1263 (POSITION).p--; \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1264 } while (! CHAR_HEAD_P (*((POSITION).p))); \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1265 (POSITION).pos--; \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1266 } while (0) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1267 |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1268 static Lisp_Object _work_val; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1269 static int _work_char; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1270 |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1271 /* 1 iff the character C is composable. */ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1272 #define CHAR_COMPOSABLE_P(C) \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1273 (_work_val = CHAR_TABLE_REF (Vunicode_category_table, (C)), \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1274 (SYMBOLP (_work_val) \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1275 && (_work_char = SDATA (SYMBOL_NAME (_work_val))[0]) != 'C' \ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1276 && _work_char != 'Z')) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1277 |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1278 /* This is like find_composition, but find an automatic composition |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1279 instead. If found, set *GSTRING to the glyph-string representing |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1280 the composition, and return 1. Otherwise, return 0. */ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1281 |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1282 static int |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1283 find_automatic_composition (pos, limit, start, end, gstring, string) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1284 EMACS_INT pos, limit, *start, *end; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1285 Lisp_Object *gstring, string; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1286 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1287 EMACS_INT head, tail, stop; |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1288 /* Limit to check a composition after POS. */ |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1289 EMACS_INT fore_check_limit; |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1290 struct position_record orig, cur, check, prev; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1291 Lisp_Object check_val, val, elt; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1292 int check_lookback; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1293 int c; |
|
98156
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1294 Lisp_Object window; |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1295 struct window *w; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1296 |
|
98158
f9f157d63fd1
(find_automatic_composition): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98157
diff
changeset
|
1297 window = Fget_buffer_window (Fcurrent_buffer (), Qnil); |
|
98156
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1298 if (NILP (window)) |
|
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1299 return 0; |
|
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1300 w = XWINDOW (window); |
|
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1301 |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1302 orig.pos = pos; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1303 if (NILP (string)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1304 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1305 head = BEGV, tail = ZV, stop = GPT; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1306 orig.pos_byte = CHAR_TO_BYTE (orig.pos); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1307 orig.p = BYTE_POS_ADDR (orig.pos_byte); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1308 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1309 else |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1310 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1311 head = 0, tail = SCHARS (string), stop = -1; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1312 orig.pos_byte = string_char_to_byte (string, orig.pos); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1313 orig.p = SDATA (string) + orig.pos_byte; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1314 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1315 if (limit < pos) |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1316 fore_check_limit = min (tail, pos + MAX_AUTO_COMPOSITION_LOOKBACK); |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1317 else |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1318 fore_check_limit = min (tail, limit + MAX_AUTO_COMPOSITION_LOOKBACK); |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1319 cur = orig; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1320 |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1321 retry: |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1322 check_val = Qnil; |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1323 /* At first, check if POS is composable. */ |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1324 c = STRING_CHAR (cur.p, 0); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1325 if (! CHAR_COMPOSABLE_P (c)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1326 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1327 if (limit < 0) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1328 return 0; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1329 if (limit >= cur.pos) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1330 goto search_forward; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1331 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1332 else |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1333 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1334 val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1335 if (! NILP (val)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1336 check_val = val, check = cur; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1337 else |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1338 while (cur.pos + 1 < fore_check_limit) |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1339 { |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1340 EMACS_INT b, e; |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1341 |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1342 FORWARD_CHAR (cur, stop); |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1343 if (get_property_and_range (cur.pos, Qcomposition, &val, &b, &e, |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1344 Qnil) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1345 && COMPOSITION_VALID_P (b, e, val)) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1346 { |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1347 fore_check_limit = cur.pos; |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1348 break; |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1349 } |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1350 c = STRING_CHAR (cur.p, 0); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1351 if (! CHAR_COMPOSABLE_P (c)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1352 break; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1353 val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1354 if (NILP (val)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1355 continue; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1356 check_val = val, check = cur; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1357 break; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1358 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1359 cur = orig; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1360 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1361 /* Rewind back to the position where we can safely search forward |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1362 for compositions. */ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1363 while (cur.pos > head) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1364 { |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1365 EMACS_INT b, e; |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1366 |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1367 BACKWARD_CHAR (cur, stop); |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1368 if (get_property_and_range (cur.pos, Qcomposition, &val, &b, &e, Qnil) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1369 && COMPOSITION_VALID_P (b, e, val)) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1370 break; |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1371 c = STRING_CHAR (cur.p, 0); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1372 if (! CHAR_COMPOSABLE_P (c)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1373 break; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1374 val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1375 if (! NILP (val)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1376 check_val = val, check = cur; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1377 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1378 prev = cur; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1379 /* Now search forward. */ |
|
102726
93ad3a5a4f75
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
101967
diff
changeset
|
1380 search_forward: |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1381 *gstring = Qnil; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1382 if (! NILP (check_val) || limit >= orig.pos) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1383 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1384 if (NILP (check_val)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1385 cur = orig; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1386 else |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1387 cur = check; |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1388 while (cur.pos < fore_check_limit) |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1389 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1390 int need_adjustment = 0; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1391 |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1392 if (NILP (check_val)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1393 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1394 c = STRING_CHAR (cur.p, 0); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1395 check_val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1396 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1397 for (; CONSP (check_val); check_val = XCDR (check_val)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1398 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1399 elt = XCAR (check_val); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1400 if (VECTORP (elt) && ASIZE (elt) == 3 && NATNUMP (AREF (elt, 1)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1401 && cur.pos - XFASTINT (AREF (elt, 1)) >= head) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1402 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1403 check.pos = cur.pos - XFASTINT (AREF (elt, 1)); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1404 if (check.pos == cur.pos) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1405 check.pos_byte = cur.pos_byte; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1406 else |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1407 check.pos_byte = CHAR_TO_BYTE (check.pos); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1408 val = autocmp_chars (check_val, check.pos, check.pos_byte, |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1409 tail, w, NULL, string); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1410 need_adjustment = 1; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1411 if (! NILP (val)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1412 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1413 *gstring = val; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1414 *start = check.pos; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1415 *end = check.pos + LGSTRING_CHAR_LEN (*gstring); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1416 if (*start <= orig.pos ? *end > orig.pos |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1417 : limit >= orig.pos) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1418 return 1; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1419 cur.pos = *end; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1420 cur.pos_byte = CHAR_TO_BYTE (cur.pos); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1421 break; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1422 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1423 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1424 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1425 if (need_adjustment) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1426 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1427 /* As we have called Lisp, there's a possibilily that |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1428 buffer/string is relocated. */ |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1429 if (NILP (string)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1430 cur.p = BYTE_POS_ADDR (cur.pos_byte); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1431 else |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1432 cur.p = SDATA (string) + cur.pos_byte; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1433 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1434 if (! CONSP (check_val)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1435 FORWARD_CHAR (cur, stop); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1436 check_val = Qnil; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1437 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1438 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1439 if (! NILP (*gstring)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1440 return (limit >= 0 || (*start <= orig.pos && *end > orig.pos)); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1441 if (limit >= 0 && limit < orig.pos && prev.pos > head) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1442 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1443 cur = prev; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1444 BACKWARD_CHAR (cur, stop); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1445 orig = cur; |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1446 fore_check_limit = orig.pos; |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1447 goto retry; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1448 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1449 return 0; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1450 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1451 |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1452 int |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1453 composition_adjust_point (last_pt) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1454 EMACS_INT last_pt; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1455 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1456 EMACS_INT charpos, bytepos, startpos, beg, end, pos; |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1457 Lisp_Object val; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1458 int i; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1459 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1460 if (PT == BEGV || PT == ZV) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1461 return PT; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1462 |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1463 /* At first check the static composition. */ |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1464 if (get_property_and_range (PT, Qcomposition, &val, &beg, &end, Qnil) |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1465 && COMPOSITION_VALID_P (beg, end, val)) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1466 { |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1467 if (beg < PT /* && end > PT <- It's always the case. */ |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1468 && (last_pt <= beg || last_pt >= end)) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1469 return (PT < last_pt ? beg : end); |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1470 return PT; |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1471 } |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1472 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1473 if (NILP (current_buffer->enable_multibyte_characters) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1474 || ! FUNCTIONP (Vauto_composition_function)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1475 return PT; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1476 |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1477 /* Next check the automatic composition. */ |
|
98209
b5e444f66902
(composition_adjust_point): Fix int/EMACS_INT mixup.
Romain Francoise <romain@orebokech.com>
parents:
98197
diff
changeset
|
1478 if (! find_automatic_composition (PT, (EMACS_INT) -1, &beg, &end, &val, Qnil) |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1479 || beg == PT) |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1480 return PT; |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1481 for (i = 0; i < LGSTRING_GLYPH_LEN (val); i++) |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1482 { |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1483 Lisp_Object glyph = LGSTRING_GLYPH (val, i); |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1484 |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1485 if (NILP (glyph)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1486 break; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1487 if (beg + LGLYPH_FROM (glyph) == PT) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1488 return PT; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1489 if (beg + LGLYPH_TO (glyph) >= PT) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1490 return (PT < last_pt |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1491 ? beg + LGLYPH_FROM (glyph) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1492 : beg + LGLYPH_TO (glyph) + 1); |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1493 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1494 return PT; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1495 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1496 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1497 DEFUN ("composition-get-gstring", Fcomposition_get_gstring, |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1498 Scomposition_get_gstring, 4, 4, 0, |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1499 doc: /* Return a glyph-string for characters between FROM and TO. |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1500 If the glyph string is for graphic display, FONT-OBJECT must be |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1501 a font-object to use for those characters. |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1502 Otherwise (for terminal display), FONT-OBJECT must be a terminal ID, a |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1503 frame, or nil for the selected frame's terminal device. |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1504 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1505 If the optional 4th argument STRING is not nil, it is a string |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1506 containing the target characters between indices FROM and TO. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1507 |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1508 A glyph-string is a vector containing information about how to display |
|
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1509 a specific character sequence. The format is: |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1510 [HEADER ID GLYPH ...] |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1511 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1512 HEADER is a vector of this form: |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1513 [FONT-OBJECT CHAR ...] |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1514 where |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1515 FONT-OBJECT is a font-object for all glyphs in the glyph-string, |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1516 or the terminal coding system of the specified terminal. |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1517 CHARs are characters to be composed by GLYPHs. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1518 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1519 ID is an identification number of the glyph-string. It may be nil if |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1520 not yet shaped. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1521 |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1522 GLYPH is a vector whose elements have this form: |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1523 [ FROM-IDX TO-IDX C CODE WIDTH LBEARING RBEARING ASCENT DESCENT |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1524 [ [X-OFF Y-OFF WADJUST] | nil] ] |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1525 where |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1526 FROM-IDX and TO-IDX are used internally and should not be touched. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1527 C is the character of the glyph. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1528 CODE is the glyph-code of C in FONT-OBJECT. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1529 WIDTH thru DESCENT are the metrics (in pixels) of the glyph. |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1530 X-OFF and Y-OFF are offsets to the base position for the glyph. |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1531 WADJUST is the adjustment to the normal width of the glyph. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1532 |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1533 If GLYPH is nil, the remaining elements of the glyph-string vector |
|
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1534 should be ignored. */) |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1535 (from, to, font_object, string) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1536 Lisp_Object font_object, from, to, string; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1537 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1538 Lisp_Object gstring, header; |
|
98213
52d26067a946
(Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
98209
diff
changeset
|
1539 EMACS_INT frompos, topos; |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1540 |
|
98214
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1541 CHECK_NATNUM (from); |
|
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1542 CHECK_NATNUM (to); |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1543 if (XINT (to) > XINT (from) + MAX_COMPOSITION_COMPONENTS) |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1544 to = make_number (XINT (from) + MAX_COMPOSITION_COMPONENTS); |
|
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1545 if (! FONT_OBJECT_P (font_object)) |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1546 { |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1547 struct coding_system *coding; |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1548 struct terminal *terminal = get_terminal (font_object, 1); |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1549 |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1550 coding = ((TERMINAL_TERMINAL_CODING (terminal)->common_flags |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1551 & CODING_REQUIRE_ENCODING_MASK) |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1552 ? TERMINAL_TERMINAL_CODING (terminal) : &safe_terminal_coding); |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1553 font_object = CODING_ID_NAME (coding->id); |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1554 } |
|
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1555 |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1556 header = fill_gstring_header (Qnil, from, to, font_object, string); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1557 gstring = gstring_lookup_cache (header); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1558 if (! NILP (gstring)) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1559 return gstring; |
|
98213
52d26067a946
(Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
98209
diff
changeset
|
1560 |
|
98214
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1561 frompos = XINT (from); |
|
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1562 topos = XINT (to); |
|
98213
52d26067a946
(Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
98209
diff
changeset
|
1563 if (LGSTRING_GLYPH_LEN (gstring_work) < topos - frompos) |
|
52d26067a946
(Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
98209
diff
changeset
|
1564 gstring_work = Fmake_vector (make_number (topos - frompos + 2), Qnil); |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1565 LGSTRING_SET_HEADER (gstring_work, header); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1566 LGSTRING_SET_ID (gstring_work, Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1567 fill_gstring_body (gstring_work); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1568 return gstring_work; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1569 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1570 |
| 26848 | 1571 |
| 1572 /* Emacs Lisp APIs. */ | |
| 1573 | |
| 1574 DEFUN ("compose-region-internal", Fcompose_region_internal, | |
| 1575 Scompose_region_internal, 2, 4, 0, | |
|
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1576 doc: /* Internal use only. |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1577 |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1578 Compose text in the region between START and END. |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1579 Optional 3rd and 4th arguments are COMPONENTS and MODIFICATION-FUNC |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1580 for the composition. See `compose-region' for more details. */) |
|
64574
5c90d9a42573
(Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
64084
diff
changeset
|
1581 (start, end, components, modification_func) |
|
5c90d9a42573
(Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
64084
diff
changeset
|
1582 Lisp_Object start, end, components, modification_func; |
| 26848 | 1583 { |
| 1584 validate_region (&start, &end); | |
| 1585 if (!NILP (components) | |
| 1586 && !INTEGERP (components) | |
| 1587 && !CONSP (components) | |
| 1588 && !STRINGP (components)) | |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1589 CHECK_VECTOR (components); |
| 26848 | 1590 |
|
64574
5c90d9a42573
(Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
64084
diff
changeset
|
1591 compose_text (XINT (start), XINT (end), components, modification_func, Qnil); |
| 26848 | 1592 return Qnil; |
| 1593 } | |
| 1594 | |
| 1595 DEFUN ("compose-string-internal", Fcompose_string_internal, | |
| 1596 Scompose_string_internal, 3, 5, 0, | |
|
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1597 doc: /* Internal use only. |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1598 |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1599 Compose text between indices START and END of STRING. |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1600 Optional 4th and 5th arguments are COMPONENTS and MODIFICATION-FUNC |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1601 for the composition. See `compose-string' for more details. */) |
|
64574
5c90d9a42573
(Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
64084
diff
changeset
|
1602 (string, start, end, components, modification_func) |
|
5c90d9a42573
(Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
64084
diff
changeset
|
1603 Lisp_Object string, start, end, components, modification_func; |
| 26848 | 1604 { |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1605 CHECK_STRING (string); |
|
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1606 CHECK_NUMBER (start); |
|
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1607 CHECK_NUMBER (end); |
| 26848 | 1608 |
| 1609 if (XINT (start) < 0 || | |
| 1610 XINT (start) > XINT (end) | |
|
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
1611 || XINT (end) > SCHARS (string)) |
| 26848 | 1612 args_out_of_range (start, end); |
| 1613 | |
|
64574
5c90d9a42573
(Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
64084
diff
changeset
|
1614 compose_text (XINT (start), XINT (end), components, modification_func, string); |
| 26848 | 1615 return string; |
| 1616 } | |
| 1617 | |
| 1618 DEFUN ("find-composition-internal", Ffind_composition_internal, | |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49136
diff
changeset
|
1619 Sfind_composition_internal, 4, 4, 0, |
|
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1620 doc: /* Internal use only. |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1621 |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1622 Return information about composition at or nearest to position POS. |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1623 See `find-composition' for more details. */) |
|
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1624 (pos, limit, string, detail_p) |
| 26848 | 1625 Lisp_Object pos, limit, string, detail_p; |
| 1626 { | |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1627 Lisp_Object prop, tail, gstring; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1628 EMACS_INT start, end, from, to; |
| 26848 | 1629 int id; |
| 1630 | |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1631 CHECK_NUMBER_COERCE_MARKER (pos); |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1632 from = XINT (pos); |
| 26848 | 1633 if (!NILP (limit)) |
| 1634 { | |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1635 CHECK_NUMBER_COERCE_MARKER (limit); |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1636 to = XINT (limit); |
| 26848 | 1637 } |
| 1638 else | |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1639 to = -1; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49136
diff
changeset
|
1640 |
| 26848 | 1641 if (!NILP (string)) |
|
38097
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1642 { |
|
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Jan?k <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1643 CHECK_STRING (string); |
|
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
1644 if (XINT (pos) < 0 || XINT (pos) > SCHARS (string)) |
|
38097
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1645 args_out_of_range (string, pos); |
|
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1646 } |
|
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1647 else |
|
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1648 { |
|
38116
a85b9df3dffb
(Ffind_composition_internal): Accept ZV
Gerd Moellmann <gerd@gnu.org>
parents:
38098
diff
changeset
|
1649 if (XINT (pos) < BEGV || XINT (pos) > ZV) |
|
38097
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1650 args_out_of_range (Fcurrent_buffer (), pos); |
|
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1651 } |
| 26848 | 1652 |
|
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1653 if (!find_composition (from, to, &start, &end, &prop, string)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1654 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1655 if (!NILP (current_buffer->enable_multibyte_characters) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1656 && FUNCTIONP (Vauto_composition_function) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1657 && find_automatic_composition (from, to, &start, &end, &gstring, |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1658 string)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1659 return list3 (make_number (start), make_number (end), gstring); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1660 return Qnil; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1661 } |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1662 if ((end <= XINT (pos) || start > XINT (pos))) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1663 { |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1664 EMACS_INT s, e; |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1665 |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1666 if (find_automatic_composition (from, to, &s, &e, &gstring, string) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1667 && (e <= XINT (pos) ? e > end : s < start)) |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1668 return list3 (make_number (start), make_number (end), gstring); |
|
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1669 } |
| 26848 | 1670 if (!COMPOSITION_VALID_P (start, end, prop)) |
| 1671 return Fcons (make_number (start), Fcons (make_number (end), | |
| 1672 Fcons (Qnil, Qnil))); | |
| 1673 if (NILP (detail_p)) | |
| 1674 return Fcons (make_number (start), Fcons (make_number (end), | |
| 1675 Fcons (Qt, Qnil))); | |
| 1676 | |
| 1677 if (COMPOSITION_REGISTERD_P (prop)) | |
| 1678 id = COMPOSITION_ID (prop); | |
| 1679 else | |
| 1680 { | |
| 1681 int start_byte = (NILP (string) | |
| 1682 ? CHAR_TO_BYTE (start) | |
| 1683 : string_char_to_byte (string, start)); | |
| 1684 id = get_composition_id (start, start_byte, end - start, prop, string); | |
| 1685 } | |
| 1686 | |
| 1687 if (id >= 0) | |
| 1688 { | |
| 1689 Lisp_Object components, relative_p, mod_func; | |
| 1690 enum composition_method method = COMPOSITION_METHOD (prop); | |
| 1691 int width = composition_table[id]->width; | |
| 1692 | |
| 1693 components = Fcopy_sequence (COMPOSITION_COMPONENTS (prop)); | |
| 1694 relative_p = (method == COMPOSITION_WITH_RULE_ALTCHARS | |
| 1695 ? Qnil : Qt); | |
| 1696 mod_func = COMPOSITION_MODIFICATION_FUNC (prop); | |
| 1697 tail = Fcons (components, | |
| 1698 Fcons (relative_p, | |
| 1699 Fcons (mod_func, | |
| 1700 Fcons (make_number (width), Qnil)))); | |
| 1701 } | |
| 1702 else | |
| 1703 tail = Qnil; | |
| 1704 | |
| 1705 return Fcons (make_number (start), Fcons (make_number (end), tail)); | |
| 1706 } | |
| 1707 | |
| 1708 | |
| 1709 void | |
| 1710 syms_of_composite () | |
| 1711 { | |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1712 int i; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1713 |
|
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
1714 Qcomposition = intern_c_string ("composition"); |
| 26848 | 1715 staticpro (&Qcomposition); |
| 1716 | |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1717 /* Make a hash table for static composition. */ |
| 26848 | 1718 { |
|
28472
bae9218986ac
* composite.c (run_composite_function): Use NILP when checking for nil.
Ken Raeburn <raeburn@raeburn.org>
parents:
26848
diff
changeset
|
1719 Lisp_Object args[6]; |
| 26848 | 1720 extern Lisp_Object QCsize; |
|
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49136
diff
changeset
|
1721 |
| 26848 | 1722 args[0] = QCtest; |
| 1723 args[1] = Qequal; | |
| 1724 args[2] = QCweakness; | |
| 53316 | 1725 /* We used to make the hash table weak so that unreferenced |
| 92028 | 1726 compositions can be garbage-collected. But, usually once |
| 53316 | 1727 created compositions are repeatedly used in an Emacs session, |
| 1728 and thus it's not worth to save memory in such a way. So, we | |
| 1729 make the table not weak. */ | |
|
53221
94ae4d74b7e0
(syms_of_composite): Don't make the compostion hash table week.
Kenichi Handa <handa@m17n.org>
parents:
52401
diff
changeset
|
1730 args[3] = Qnil; |
| 26848 | 1731 args[4] = QCsize; |
| 1732 args[5] = make_number (311); | |
|
28472
bae9218986ac
* composite.c (run_composite_function): Use NILP when checking for nil.
Ken Raeburn <raeburn@raeburn.org>
parents:
26848
diff
changeset
|
1733 composition_hash_table = Fmake_hash_table (6, args); |
| 26848 | 1734 staticpro (&composition_hash_table); |
| 1735 } | |
| 1736 | |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1737 /* Make a hash table for glyph-string. */ |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1738 { |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1739 Lisp_Object args[6]; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1740 extern Lisp_Object QCsize; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1741 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1742 args[0] = QCtest; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1743 args[1] = Qequal; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1744 args[2] = QCweakness; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1745 args[3] = Qnil; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1746 args[4] = QCsize; |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1747 args[5] = make_number (311); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1748 gstring_hash_table = Fmake_hash_table (6, args); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1749 staticpro (&gstring_hash_table); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1750 } |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1751 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1752 staticpro (&gstring_work_headers); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1753 gstring_work_headers = Fmake_vector (make_number (8), Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1754 for (i = 0; i < 8; i++) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1755 ASET (gstring_work_headers, i, Fmake_vector (make_number (i + 2), Qnil)); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1756 staticpro (&gstring_work); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1757 gstring_work = Fmake_vector (make_number (10), Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1758 |
| 26848 | 1759 /* Text property `composition' should be nonsticky by default. */ |
| 1760 Vtext_property_default_nonsticky | |
| 1761 = Fcons (Fcons (Qcomposition, Qt), Vtext_property_default_nonsticky); | |
| 1762 | |
| 1763 DEFVAR_LISP ("compose-chars-after-function", &Vcompose_chars_after_function, | |
|
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1764 doc: /* Function to adjust composition of buffer text. |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1765 |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1766 This function is called with three arguments: FROM, TO, and OBJECT. |
|
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1767 FROM and TO specify the range of text whose composition should be |
|
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1768 adjusted. OBJECT, if non-nil, is a string that contains the text. |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1769 |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1770 This function is called after a text with `composition' property is |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1771 inserted or deleted to keep `composition' property of buffer text |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1772 valid. |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1773 |
|
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1774 The default value is the function `compose-chars-after'. */); |
|
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
1775 Vcompose_chars_after_function = intern_c_string ("compose-chars-after"); |
| 26848 | 1776 |
|
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
1777 Qauto_composed = intern_c_string ("auto-composed"); |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
1778 staticpro (&Qauto_composed); |
|
33240
aaa42106f0da
(Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents:
30171
diff
changeset
|
1779 |
|
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
1780 Qauto_composition_function = intern_c_string ("auto-composition-function"); |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
1781 staticpro (&Qauto_composition_function); |
|
33240
aaa42106f0da
(Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents:
30171
diff
changeset
|
1782 |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
1783 DEFVAR_LISP ("auto-composition-function", &Vauto_composition_function, |
|
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
1784 doc: /* Function to call to compose characters automatically. |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1785 This function is called from the display routine with four arguments: |
|
91287
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
1786 FROM, TO, WINDOW, and STRING. |
|
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1787 |
|
91287
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
1788 If STRING is nil, the function must compose characters in the region |
|
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
1789 between FROM and TO in the current buffer. |
|
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Jan?k <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1790 |
|
91287
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
1791 Otherwise, STRING is a string, and FROM and TO are indices into the |
|
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
1792 string. In this case, the function must compose characters in the |
|
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
1793 string. */); |
|
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
1794 Vauto_composition_function = Qnil; |
|
33240
aaa42106f0da
(Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents:
30171
diff
changeset
|
1795 |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1796 DEFVAR_LISP ("composition-function-table", &Vcomposition_function_table, |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1797 doc: /* Char-table of functions for automatic character composition. |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1798 For each character that has to be composed automatically with |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1799 preceding and/or following characters, this char-table contains |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1800 a function to call to compose that character. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1801 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1802 The element at index C in the table, if non-nil, is a list of |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1803 this form: ([PATTERN PREV-CHARS FUNC] ...) |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1804 |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1805 PATTERN is a regular expression which C and the surrounding |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1806 characters must match. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1807 |
|
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1808 PREV-CHARS is a non-negative integer (less than 4) specifying how many |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1809 characters before C to check the matching with PATTERN. If it is 0, |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1810 PATTERN must match C and the following characters. If it is 1, |
|
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1811 PATTERN must match a character before C and the following characters. |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1812 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1813 If PREV-CHARS is 0, PATTERN can be nil, which means that the |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1814 single character C should be composed. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1815 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1816 FUNC is a function to return a glyph-string representing a |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1817 composition of the characters that match PATTERN. It is |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1818 called with one argument GSTRING. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1819 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1820 GSTRING is a template of a glyph-string to return. It is already |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1821 filled with a proper header for the characters to compose, and |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1822 glyphs corresponding to those characters one by one. The |
|
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1823 function must return a new glyph-string with the same header as |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1824 GSTRING, or modify GSTRING itself and return it. |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1825 |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1826 See also the documentation of `auto-composition-mode'. */); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1827 Vcomposition_function_table = Fmake_char_table (Qnil, Qnil); |
|
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1828 |
| 26848 | 1829 defsubr (&Scompose_region_internal); |
| 1830 defsubr (&Scompose_string_internal); | |
| 1831 defsubr (&Sfind_composition_internal); | |
|
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1832 defsubr (&Scomposition_get_gstring); |
| 26848 | 1833 } |
| 52401 | 1834 |
| 1835 /* arch-tag: 79cefaf8-ca48-4eed-97e5-d5afb290d272 | |
| 1836 (do not change this comment) */ |
